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