C++:LoadCursor()函数

1. 函数功能与用途

在C++的Windows编程中,LoadCursor函数用于加载光标资源。光标是在屏幕上指示鼠标位置和操作的图形对象,不同的光标形状可以向用户传达不同的操作提示。例如,当鼠标悬停在可点击的按钮上时,光标可能会变成手型;在文本输入区域,光标可能是“I”型。LoadCursor函数能够从指定的模块中获取光标资源的句柄,这个句柄可以用于设置窗口的光标样式,使窗口在接收鼠标事件时显示合适的光标。

2. 函数原型及参数解释

HCURSOR LoadCursor(HINSTANCE hInstance, LPCTSTR lpCursorName);

参数说明:

hInstance(HINSTANCE类型):这是包含光标资源的模块的实例句柄。通常,如果要加载应用程序自身的光标资源,可以使用WinMain函数中的hInstance参数。如果需要从外部动态链接库(.dll)加载光标,就需要提供该库的实例句柄。这个参数指定了函数查找光标资源的位置。

lpCursorName(LPCTSTR类型):这是一个指向光标名称的指针,用于指定要加载的光标资源。它有两种常见的表示方式:

使用预定义的光标标识符(整数形式):Windows操作系统定义了许多标准的光标标识符,如IDC_ARROW(标准箭头光标)、IDC_IBEAM(文本输入光标,通常是“I”形状)、IDC_WAIT(等待光标,通常是沙漏形状)等。在这种情况下,可以直接将这些标识符作为参数传递,例如LoadCursor(NULL, IDC_ARROW);。这里NULL作为hInstance参数表示从系统默认的光标资源中加载,而IDC_ARROW指定了要加载的是标准箭头光标。

使用自定义光标资源名称(字符串形式):如果使用自定义的光标资源,并且这个资源是通过名称来标识的(相对较少见),那么可以将这个名称的指针传递给lpCursorName参数。

3. 返回值

函数返回一个HCURSOR类型的光标资源句柄。如果成功加载光标,返回的句柄可以用于设置窗口的光标。例如,可以将其赋值给WNDCLASSEX结构体中的hCursor成员,从而为基于该窗口类创建的所有窗口设置光标样式。如果加载光标失败,函数返回NULL。

4. 示例代码

以下是一个简单的示例,展示如何在WinMain函数中使用LoadCursor函数为窗口设置光标:

#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));
    // 使用LoadCursor函数加载光标
    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结构体时,通过LoadCursor(NULL, IDC_ARROW)从系统默认资源中加载标准箭头光标,并将返回的光标句柄赋值给wcex.hCursor。这样,当鼠标移动到使用这个窗口类创建的窗口上时,就会显示标准箭头光标。

C++编程API库