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

⌚Time: 2023-12-24 16:13:49

👨‍💻Author: Jack Ge

使窗体能够接受文件拖拽


DragAcceptFiles(hwnd, TRUE);

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




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);

}


窗体内鼠标拖拽操作


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;

}

显示滚轮滚动操作


    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;

        }