【问题标题】:How do I fix LoadIcon() Function not displaying icon?如何修复 LoadIcon() 函数不显示图标?
【发布时间】:2020-06-22 17:51:50
【问题描述】:

我正在尝试使用 LoadIcon() 函数为我的 3D 游戏的应用程序窗口使用自定义图标(有关 3D 游戏的详细信息,请参阅 My first question on this site)。我像在代码论坛网站上看到的那样初始化了实例句柄(与此类似,我什至没有注册它),它调用GetModuleHandle() 函数并将其参数设置为NULL。然后我使用了hIconhIconSm 的图像文件名,它们与可执行文件位于同一文件夹中(我最初将文件与源代码放在同一文件夹中,但这似乎不起作用)。这是我的WNDCLASSEX 对象初始化代码(其中也有HINSTANCE 初始化):

HINSTANCE hinstance;
hinstance = GetModuleHandle(NULL);
WNDCLASSEX wc;
wc.cbClsExtra = NULL;
wc.cbSize = sizeof(WNDCLASSEX);
wc.cbWndExtra = NULL;
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(hinstance, "ArtificialIconLg.png");
wc.hIconSm = LoadIcon(hinstance, "ArtificialIcon.ico");
wc.hInstance = NULL;
wc.lpszClassName = "MyWindowClass";
wc.lpszMenuName = "";
wc.style = NULL;
wc.lpfnWndProc = &WndProc;

我还将包括我的CreateWindowEx() 函数:

m_hwnd = ::CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, "MyWindowClass", "Artificial", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 1024, 768, NULL, NULL, NULL, window);

【问题讨论】:

  • 尝试仅加载图标、检查返回值并检查错误。如果它们没有加载,它们将不会显示。你现在不知道代码的方式。
  • 开始检查返回值是否有错误非常重要
  • 哦,我该如何检查?我对编程有点陌生。
  • documentation 通常会解释函数如何失败以及需要检查的内容。
  • 尝试使用LoadImage(nullptr, "ArtificialIconLg.png", IMAGE_ICON, 0, 0, LR_LOADFROMFILE)

标签: c++ object winapi


【解决方案1】:

LoadIcon 仅从编译成 EXE 和 DLL 的资源中加载艺术资源。它将资源 ID 作为第二个参数。 (它输入了一个字符串的事实使它令人困惑)。另外,我认为您不能直接通过 LoadIcon 加载 png 文件。

将您的 .ico 文件添加到您的 Visual Studio 项目的资源文件(.rc 文件)中,并在 resources.h 文件中添加相应的标识符。如果只需右键单击并添加,Visual Studio 就会为您完成大部分工作。

然后在代码中:

wc.hIcon = LoadIcon(hinstance, MAKEINTRESID(ICO_ARTIIFICIAL));
wc.hIconSm = LoadIcon(hinstance, MAKEINTRESID(ICO_ARTIIFICIAL));

【讨论】:

  • 如何向resources.h*.rc 文件添加标识符?
  • 从资源加载的替代方法是使用LoadImage 函数。可以从文件中加载。
猜你喜欢
  • 2023-01-15
  • 2019-06-09
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多