在基本 Win32 API 应用程序中从 'int' 到 'LPCSTR' 的无效转换

Invalid conversion from 'int' to 'LPCSTR' in a basic Win32 API app

最近开始学习Win32API,到现在每次都编译成功

我在资源文件(main.rcresource.h)中添加了一个图标,在包含 main.h 头文件(引用资源头文件的地方)之后,我得到了以下转换错误:

Error: invalid conversion from 'int' to 'LPCSTR' {aka 'const char*'} [-f permissive]

note: in definition of macro 'IDI_MYICON'

我在网上查看了一些解决方案,但大多数(如果不是全部的话)都是关于非 Unicode 字符串,而不是资源。我是不是忘记了什么?

main.c 文件:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    HWND hwnd;
    MSG msg;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon = LoadIcon(NULL, IDI_MYICON); //icon resource referenced here
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = g_szClassName;
    wc.hIconSm = LoadIcon(NULL, IDI_MYICON); //icon resource referenced here as well
//.....

main.rc 文件:

#include "resource.h"

IDI_MYICON ICON "my_icon.ico"

main.h 文件:

#pragma once

#include "resource.h"

resource.h 文件:

#define IDI_MYICON 101

API 像 LoadCursorLoadIcon 这样的函数将一个指向字符串的指针作为参数来指定要加载的资源,而不是整数(这就是 IDI_MYICON是)。

原因是资源可以使用名称作为标识符,而不仅仅是数字标识符。

要在这些 API 中使用数字标识符,您需要将其转换为字符串指针。 API 为此提供了 MAKEINTRESOURCE 宏。

例如,wc.hIconSm = LoadIcon(NULL, MAKEINTRESOURCE(IDI_MYICON));.