ImageList_DragEnter 函数是 Win32 API 中用于在图像列表的拖放操作中标记拖放的起始点的函数,该函数在 Commctrl.h 头文件中声明。

以下是 ImageList_DragEnter 函数的基本信息:
BOOL ImageList_DragEnter(
  HWND      hwndLock,
  int       x,
  int       y
);

参数说明:
  •  hwndLock:在拖放期间,将在指定窗口的客户区内锁定鼠标。

  •  x:以屏幕坐标表示的拖放操作的起始点的 x 坐标。

  •  y:以屏幕坐标表示的拖放操作的起始点的 y 坐标。


该函数返回一个 BOOL 类型的值,如果成功,返回值为非零;如果失败,返回值为零。

在拖放操作中,ImageList_DragEnter 函数通常与 ImageList_DragMove 和 ImageList_DragLeave 一起使用,以实现图像的拖放。

以下是一个简单的示例代码,演示如何使用 ImageList_DragEnter 函数:
#include <windows.h>
#include <commctrl.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    static HIMAGELIST himlDrag;  // 用于存储拖放的图像列表

    switch (message) {
        case WM_CREATE:
            {
                // 创建图像列表
                HIMAGELIST himlSource = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 1, 0);
                HICON hIcon = LoadIcon(GetModuleHandle(NULL), IDI_INFORMATION);
                ImageList_AddIcon(himlSource, hIcon);
                DestroyIcon(hIcon);

                // 将图像列表设置为拖放源
                ImageList_BeginDrag(himlSource, 0, 0, 0);

                // 将图像列表保存到全局变量
                himlDrag = himlSource;
            }
            return 0;

        case WM_MOUSEMOVE:
            {
                // 随着鼠标移动,将拖放操作的起始点标记在客户区内
                ImageList_DragEnter(hwnd, LOWORD(lParam), HIWORD(lParam));

                // 更新拖放操作的位置
                ImageList_DragMove(LOWORD(lParam), HIWORD(lParam));
            }
            return 0;

        case WM_LBUTTONUP:
            {
                // 结束拖放操作
                ImageList_EndDrag();
            }
            return 0;

        case WM_DESTROY:
            {
                // 释放拖放的图像列表
                ImageList_Destroy(himlDrag);
                PostQuitMessage(0);
            }
            return 0;

        default:
            return DefWindowProc(hwnd, message, wParam, lParam);
    }
}

int main() {
    // 初始化 Common Controls
    INITCOMMONCONTROLSEX icex;
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    icex.dwICC = ICC_WIN95_CLASSES; // 或其他需要的标志
    InitCommonControlsEx(&icex);

    // 注册窗口类
    WNDCLASS wc = { 0 };
    wc.lpfnWndProc = WndProc;
    wc.hInstance = GetModuleHandle(NULL);
    wc.lpszClassName = L"ImageListDragExample";
    RegisterClass(&wc);

    // 创建窗口
    HWND hwnd = CreateWindow(
        L"ImageListDragExample", L"ImageList Drag Example",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        CW_USEDEFAULT, CW_USEDEFAULT, 400, 200,
        NULL, NULL, GetModuleHandle(NULL), NULL
    );

    if (hwnd == NULL) {
        MessageBox(NULL, L"Window creation failed!", L"Error", MB_ICONERROR);
        return 1;
    }

    // 消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

在这个例子中,当鼠标移动时,ImageList_DragEnter 函数用于标记拖放的起始点。然后,通过调用 ImageList_DragMove 函数更新拖放操作的位置。最终,在左键松开时,调用 ImageList_EndDrag 函数结束拖放操作。


转载请注明出处:http://www.zyzy.cn/article/detail/24675/Win32 API/Commctrl.h/ImageList_DragEnter