WIN32, C / C ++: как сгенерировать окно с меню, используя Visual Studio Code - PullRequest
0 голосов
/ 11 июля 2020

Я учусь создавать приложения WIN32 на C ++.
Изначально я использовал Visual Studio, но в последнее время я использую VSCode из-за его легкости в работе.
Однако в той степени, в которой я могу только напишите в. cpp, у меня проблем нет. Но я не могу скомпилировать или встроить .r c ну ...
Можно ли создать приложение WIN32 со встроенными ресурсами в VSCode?
Мы используем VSCode, CMake (3.18.0), компилятор VS2019 cl. Версия SDK - 10. Редактором ресурсов не пользуюсь, пишу от руки. (Я получу редактор, если он мне понадобится, но я хотел бы знать, есть ли способ написать его вручную ...)
Мне сказали, что я могу скомпилировать .r c с помощью r c .exe, но у меня есть winres.h, я не могу прочитать winres.h, и появляется ошибка.
Более того, даже если компиляция прошла успешно, я не знаю, как связать .res оттуда. Я даже не знаю, как настроить параметры сборки и CMake.
Буду признателен за любой совет, который вы мне дадите.

//c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/cppwinrt",
                "C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/shared",
                "C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt",
                "C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/um",
                "C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/winrt",
                "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.26.28801/include",
                "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.26.28801/atlmfc/include",
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.18362.0",
            "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.25.28610/bin/Hostx64/x64/cl.exe",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "msvc-x64",
            "browse": {
                "path": [
                    "C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/cppwinrt",
                    "C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/shared",
                    "C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt",
                    "C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/um",
                    "C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/winrt",
                    "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.26.28801/include",
                    "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.26.28801/atlmfc/include",
                    "C:/Program Files (x86)/Windows Kits/10/bin/10.0.18362.0/x64",
                    "${workspaceFolder}/**"
                ]
            },
            "configurationProvider": "ms-vscode.cmake-tools"
        }
    ],
    "version": 4
}

**

    //CMakeLists.txt
    cmake_minimum_required(VERSION 3.0.0)
    project(sample_menu VERSION 0.1.0)

    include(CTest)
    enable_testing()

    set_source_files_properties(menu.rc PROPERTIES LANGUAGE RC)
    add_executable(sample_menu WIN32 "sample_menu.cpp")

    set(CPACK_PROJECT_NAME ${PROJECT_NAME})
    set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
    include(CPack)

**

    //resource(sample_manu.rc)
    #include<winres.h>
    #include"resource.h"
    
    sample_menu MENU
    BEGIN
        POPUP "ファイル(&F)"
        BEGIN
            MENUITEM "終了(&X)",                            IDM_END
        END
        POPUP "オプション(&O)"
            MENUITEM "オプション(&1)\tShift + Ctrl + 1",    IDM_OPT1
            MENUITEM "オプション(&1)\tShift + Ctrl + 2",    IDM_OPT2
        END
        POPUP "ヘルプ(&H)"
        BEGIN
            MENUITEM "About(&A)\tCtrl + A",                 IDM_ABOUT
        END
    END

**

//resource.h
#include<winres.h>

#define IDM_END     101
#define IDM_OPT1    102
#define IDM_OPT2    103
#define IDM_ABOUT   104
    

**

//sample_menu.cpp(parts of)
#include<Windows.h>
#include"resource.h"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);

TCHAR szClassName[] = TEXT("winapp");

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) {                                                       
    ...
    return (int)msg.wParam;
}

//Registering the Window class
ATOM InitApp(HINSTANCE hInst) {
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    ...
    wc.lpszMenuName = TEXT("sample_menu");          //the menu name(If there is no menu,set to NULL)
    ...
    return (RegisterClassEx(&wc));
}

//Generating the Window
BOOL InitInstance(HINSTANCE hInst, int nCmdShow) {
    HWND hWnd;                              //Window handle(used to manipulate Window)

    hWnd = CreateWindow(
        ...
        NULL,                               //the menu handle(set to NULL when using the class menu)
        ...);
    ...
}

//Window Procedure
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
    
    switch (msg){
    ...
    case WM_COMMAND:
        switch(LOWORD(wp)){
            case IDM_END:
                SendMessage(hWnd,WM_CLOSE,0,0);
                break;
            case IDM_ABOUT:
                MessageBox(hWnd,TEXT("初めてのメニュー"),TEXT("About"),MB_OK);
                break;
            default:
                return (DefWindowProc(hWnd,msg,wp,lp));
        }
        break;
    }
    ...
...