ListView_CreateDragImage 是 Win32 API 中用于创建用于拖放操作的图像列表的函数,该函数位于 Commctrl.h 头文件中。
HIMAGELIST ListView_CreateDragImage(
  HWND     hwnd,
  int      iItem,
  LPPOINT  lpptUpLeft
);

参数说明:
  •  hwnd:指向列表视图控件的句柄。

  •  iItem:要拖动的项的索引。

  •  lpptUpLeft:指向 POINT 结构的指针,用于接收拖动图像的左上角的屏幕坐标。


函数返回值:
  •  返回一个图像列表的句柄,表示创建的拖动图像列表。如果创建失败,返回 NULL。


这个函数通常在开始拖动某个列表视图项时被调用,用于创建一个用于拖动操作的图像列表。拖动图像列表可用于在拖动过程中显示拖动的图标。

以下是一个简单的示例:
#include <Commctrl.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    static HIMAGELIST hDragImageList = NULL;

    switch (uMsg) {
        case WM_LBUTTONDOWN:
        {
            // 获取点击的项的索引
            LVHITTESTINFO lvhti;
            POINT pt;
            pt.x = GET_X_LPARAM(lParam);
            pt.y = GET_Y_LPARAM(lParam);
            lvhti.pt = pt;
            ListView_HitTest(hwnd, &lvhti);

            if (lvhti.flags & LVHT_ONITEM) {
                // 创建拖动图像列表
                hDragImageList = ListView_CreateDragImage(hwnd, lvhti.iItem, &pt);

                // 开始拖放
                if (hDragImageList) {
                    ImageList_BeginDrag(hDragImageList, 0, 0, 0);
                    ImageList_DragEnter(hwnd, pt.x, pt.y);
                    SetCapture(hwnd);
                }
            }
            break;
        }
        case WM_MOUSEMOVE:
            if (hDragImageList && (wParam & MK_LBUTTON)) {
                POINT pt;
                pt.x = GET_X_LPARAM(lParam);
                pt.y = GET_Y_LPARAM(lParam);

                // 更新拖动图像的位置
                ImageList_DragMove(pt.x, pt.y);
            }
            break;
        case WM_LBUTTONUP:
            if (hDragImageList) {
                // 结束拖放
                ImageList_EndDrag();
                ImageList_Destroy(hDragImageList);
                ReleaseCapture();
            }
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }

    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    // 初始化通用控件库
    INITCOMMONCONTROLSEX icex;
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    icex.dwICC = ICC_LISTVIEW_CLASSES; // 或其他适当的标志
    if (!InitCommonControlsEx(&icex)) {
        // 初始化失败处理
        return 1;
    }

    // 创建窗口类
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WindowProc, 0L, 0L,
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      L"ListView_CreateDragImage Example", NULL };
    RegisterClassEx(&wc);

    // 创建主窗口
    HWND hwnd = CreateWindow(wc.lpszClassName, L"ListView_CreateDragImage Example",
                             WS_OVERLAPPEDWINDOW, 100, 100, 400, 300,
                             NULL, NULL, wc.hInstance, NULL);

    // 创建列表视图控件
    HWND hListView = CreateWindowEx(0, WC_LISTVIEW, L"",
                                    WS_VISIBLE | WS_CHILD | LVS_REPORT,
                                    10, 10, 300, 200, hwnd, NULL, GetModuleHandle(NULL), NULL);

    if (hListView) {
        // 向列表视图添加列...
        LVCOLUMN lvc;
        lvc.mask = LVCF_TEXT | LVCF_WIDTH;
        lvc.cx = 100;
        lvc.pszText = L"Column 1";
        ListView_InsertColumn(hListView, 0, &lvc);

        // 向列表视图添加项...
        LVITEM lvi;
        lvi.mask = LVIF_TEXT;
        lvi.pszText = L"Item 1";
        ListView_InsertItem(hListView, &lvi);
    }

    // 显示主窗口
    ShowWindow(hwnd, SW_SHOWNORMAL);
    UpdateWindow(hwnd);

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

    // 注销窗口类
    UnregisterClass(wc.lpszClassName, wc.hInstance);

    return 0;
}

在这个例子中,当用户按下鼠标左键并开始拖动时,WM_LBUTTONDOWN 消息中的 ListView_CreateDragImage 被调用,用于创建拖动图像列表。在 WM_MOUSEMOVE 消息中,通过 ImageList_DragMove 更新拖动图像的位置,WM_LBUTTONUP 消息中,通过 ImageList_EndDrag 结束拖放操作。这个例子中使用了列表视图控件和拖放相关的函数。


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