Я учусь создавать приложения 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;
}
...