Win32窗体实现接受拖拽文件,检测鼠标拖拽操作,检测鼠标滚轮操作

使窗体能够接受文件拖拽

c 复制代码
DragAcceptFiles(hwnd, TRUE);

文件拖拽在win32窗体过程函数中对WM_DROPFILES消息进行处理

c 复制代码
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
    case WM_DROPFILES:
        {
            HDROP hDrop = (HDROP)wParam;

            // 获取拖拽的文件数量
            UINT count = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);

            // 逐个处理拖拽的文件
            for (UINT i = 0; i < count; i++)
            {
                // 获取文件名长度
                UINT len = DragQueryFile(hDrop, i, NULL, 0) + 1;

                // 获取文件名
                LPSTR filename = new char[len];
                DragQueryFile(hDrop, i, filename, len);

                // 处理文件,这里可以根据需要进行操作
                std::cout<<filename;//简单的输出文件名
                delete[] filename;
            }

            // 释放拖拽句柄
            DragFinish(hDrop);
            break;
        }
	case WM_PAINT:
		{
			PAINTSTRUCT ps;
			HDC hdc = BeginPaint(hwnd, &ps);

			// All painting occurs here, between BeginPaint and EndPaint.

			FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

			EndPaint(hwnd, &ps);
		}
		return 0;

	}
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

窗体内鼠标拖拽操作

c 复制代码
POINT g_ptMouseDown 
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

case WM_LBUTTONDOWN:
{
    // 鼠标左键按下,开始拖拽
    SetCapture(hwnd);
    // 获取鼠标当前位置
    POINT pt;
    GetCursorPos(&pt);
    // 将鼠标位置转换为窗口内的坐标
    ScreenToClient(hwnd, &pt);
    // 存储鼠标按下时的起始位置
    // 这个起始位置将用于计算鼠标的偏移量
    g_ptMouseDown = pt;
    break;
}
case WM_MOUSEMOVE:
{
    if (GetCapture() == hwnd)
    {
        // 鼠标正在拖拽中
        // 获取鼠标当前位置
        POINT pt;
        GetCursorPos(&pt);
        // 将鼠标位置转换为窗口内的坐标
        ScreenToClient(hwnd, &pt);
        // 计算鼠标的偏移量
        int deltaX = pt.x - g_ptMouseDown.x;
        int deltaY = pt.y - g_ptMouseDown.y;
        // TODO: 根据鼠标偏移量进行相应的处理
        std::cout<<"offset "<<deltaX<<" "<<deltaY<<"\n";
    }
    break;
}
case WM_LBUTTONUP:
{
    // 鼠标左键释放,结束拖拽
    ReleaseCapture();
    break;
}

显示滚轮滚动操作

c 复制代码
    case WM_MOUSEWHEEL:
        {
            // 获取滚轮旋转的距离
            //使用GET_WHEEL_DELTA_WPARAM宏来获取滚轮旋转的距离。wParam参数包含滚轮的操作信息。WHEEL_DELTA是一个常量,表示滚轮每次旋转的距离
            short distance = GET_WHEEL_DELTA_WPARAM(wParam) / WHEEL_DELTA;
            // TODO: 根据滚轮的距离进行相应的处理
            std::cout<<" distance:"<<distance<<"\n";
            break;
        }
相关推荐
极客先躯2 天前
Win10鼠标总是频繁自动失去焦点-非常有效-重启之后立竿见影
计算机外设·win10·重启·频繁失去焦点·有效
平头某2 天前
G502 鼠标自定义(配合 karabiner)
计算机外设
萧瑟其中~3 天前
Linux:深入理解冯诺依曼结构与操作系统
计算机外设
ZenasLDR4 天前
Type-C接口桌面显示器的优势
计算机外设·接口
limingade5 天前
手机实时提取SIM卡打电话的信令声音-(题外、插播一条广告)
android·物联网·计算机外设·音视频·webrtc·信号处理
幽反丶叛冥7 天前
Windows:win11旗舰版连接无线显示器,连接失败
windows·计算机外设
没学上了7 天前
第十七节 鼠标的操作与相应
计算机外设
哲伦贼稳妥7 天前
一天认识一个硬件之音响与音箱
运维·其他·计算机外设·电脑
月伤597 天前
在vue项目中禁用鼠标右键,选中
开发语言·javascript·计算机外设
枫子有风7 天前
机械键盘驱动调光DIY--【DAREU】
计算机外设·机械键盘