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,用于为窗口类设置图标。之后,在创建窗口并进入消息循环后,窗口就会显示相应的图标。

C++编程API库