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

以下是 ImageList_BeginDrag 函数的基本信息:
BOOL ImageList_BeginDrag(
  HIMAGELIST himlTrack,
  int        iTrack,
  int        dxHotspot,
  int        dyHotspot
);

参数说明:
  •  himlTrack:源图像列表的句柄。

  •  iTrack:拖动的图像在图像列表中的索引。

  •  dxHotspot:拖动时光标的水平偏移。

  •  dyHotspot:拖动时光标的垂直偏移。


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

ImageList_BeginDrag 函数用于启动图像列表的拖放操作。在调用这个函数之后,可以使用 ImageList_DragMove 和 ImageList_DragShowNolock 等函数来处理拖放操作。通常,与拖放相关的操作需要在拖放的消息处理函数中进行。

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

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch (message) {
        case WM_CREATE:
            {
                // 创建图像列表
                HIMAGELIST himl = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 1, 0);

                // 加载位图资源
                HBITMAP hBitmap = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SAMPLE));

                // 添加图像到图像列表
                ImageList_AddMasked(himl, hBitmap, RGB(255, 0, 255));

                // 设置图像列表为当前窗口的拖放源
                ImageList_BeginDrag(himl, 0, 0, 0);
            }
            return 0;

        case WM_DESTROY:
            {
                // 结束图像列表的拖放操作
                ImageList_EndDrag();
                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_BeginDrag 函数,将图像列表设置为拖放源。在窗口销毁时,调用了 ImageList_EndDrag 函数,结束拖放操作。这个例子中的处理比较简单,实际应用中可能需要在相关的消息处理函数中处理更多的拖放相关操作。


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