C++:LoadIcon()函数
1. 函数概述
在C++的Windows编程中,LoadIcon()函数用于从指定的模块中加载图标资源。它是Windows API(应用程序编程接口)的一部分,主要用于图形用户界面(GUI)编程。这个函数返回一个图标句柄(HICON),可以用于设置窗口图标、在系统托盘显示图标等多种与图标相关的操作。
2. 函数原型及参数
HICON LoadIcon(HINSTANCE hInstance, LPCTSTR lpIconName);
参数解释:
hInstance(HINSTANCE类型):
这是一个实例句柄,代表包含图标资源的模块。如果要加载应用程序本身包含的图标,通常可以使用WinMain函数中的hInstance参数。这个参数告诉函数去哪里寻找图标资源。例如,图标资源存储在应用程序的可执行文件(.exe)中,hInstance就指向这个可执行文件对应的模块。
除了应用程序自身的实例句柄,也可以是其他动态链接库(.dll)的实例句柄,这样就能够从外部库中加载图标资源。
lpIconName(LPCTSTR类型):
这是一个指向图标名称的指针。图标名称可以有两种形式:
资源标识符(整数值):在资源脚本文件(.rc文件)中,图标资源通常会被分配一个唯一的整数标识符。可以使用MAKEINTRESOURCE宏将这个整数标识符转换为LPCTSTR类型来作为参数。例如,如果有一个图标资源标识符为IDI_MAINICON,可以这样调用函数:LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAINICON));。
字符串名称:相对较少见,也可以是一个真正的字符串名称来指定图标。如果图标是通过字符串名称定义的,就直接将这个字符串的指针传递给lpIconName参数。
3. 返回值
LoadIcon()函数返回一个HICON类型的图标句柄。
如果成功加载图标,返回的句柄可以用于后续的操作,比如设置窗口类(WNDCLASSEX)中的图标成员(hIcon和hIconSm)。
如果加载失败,函数返回NULL。这可能是因为指定的实例句柄无效、图标资源不存在或者其他资源相关的问题。
4. 使用示例
以下是一个简单的示例,用于在创建窗口时加载图标:
#include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; // 加载大图标 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAINICON)); // 加载小图标 wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SMALLICON)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = NULL; wcex.lpszClassName = "MyWindowClass"; if (!RegisterClassEx(&wcex)) { return 0; } HWND hWnd = CreateWindow("MyWindowClass", "My Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
在这个示例中,WinMain函数首先填充WNDCLASSEX结构体。通过LoadIcon函数,使用hInstance(应用程序实例句柄)和通过MAKEINTRESOURCE宏转换后的图标资源标识符(IDI_MAINICON用于大图标,IDI_SMALLICON用于小图标)来加载图标。然后将加载得到的图标句柄赋值给wcex.hIcon和wcex.hIconSm,用于为窗口类设置图标。之后,在创建窗口并进入消息循环后,窗口就会显示相应的图标。