Windows API 开发桌面应用程序,窗口支持上下左右滚动

当在Windows API中创建一个支持上下左右滚动的桌面应用程序窗口时,你需要处理几个关键点:

  1. 窗口类的注册和窗口的创建,指定WS_HSCROLLWS_VSCROLL样式。
  2. 滚动条范围的设置。
  3. 处理WM_PAINT消息来根据滚动条的位置绘制内容。
  4. 处理WM_HSCROLLWM_VSCROLL消息来更新滚动条的位置和重绘窗口。

下面是一个简单的示例代码,展示了如何创建一个支持滚动条的窗口,并解释滚动条相关的代码部分:

#include <windows.h>

// 窗口过程函数
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static int scrollPosX = 0;
    static int scrollPosY = 0;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (uMsg)
    {
    case WM_CREATE:
        // 设置滚动条的范围(这里仅为示例,假设为200x200的范围)
        SetScrollRange(hwnd, SB_HORZ, 0, 199, FALSE);
        SetScrollRange(hwnd, SB_VERT, 0, 199, FALSE);
        break;

    case WM_HSCROLL:
        // 处理水平滚动条事件
        switch (LOWORD(wParam))
        {
        case SB_LINERIGHT:
            scrollPosX += 10; // 假设每次滚动移动10个单位
            break;
        case SB_LINELEFT:
            scrollPosX -= 10;
            break;
        case SB_PAGERIGHT:
            scrollPosX += 50; // 假设每次翻页移动50个单位
            break;
        case SB_PAGELEFT:
            scrollPosX -= 50;
            break;
        case SB_THUMBPOSITION:
            scrollPosX = HIWORD(wParam); // 直接设置滚动位置
            break;
        case SB_THUMBTRACK:
            // 拖动滚动条时持续更新位置,这里为了简单起见省略
            break;
        }
        scrollPosX = max(0, min(scrollPosX, 199)); // 确保滚动位置在有效范围内
        SetScrollPos(hwnd, SB_HORZ, scrollPosX, TRUE); // 更新滚动条位置
        InvalidateRect(hwnd, NULL, TRUE); // 请求重绘窗口
        break;

    case WM_VSCROLL:
        // 处理垂直滚动条事件,与WM_HSCROLL类似
        // ...(此处省略代码,与WM_HSCROLL类似)
        break;

    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);

        // 根据滚动条位置绘制内容(这里仅绘制一个矩形作为示例)
        RECT rect;
        rect.left = scrollPosX * 10; // 假设每个滚动单位代表10个像素
        rect.top = scrollPosY * 10;
        rect.right = min(rect.left + 200, 200 * 10); // 确保绘制区域不超出窗口范围
        rect.bottom = min(rect.top + 200, 200 * 10);
        FillRect(hdc, &rect, (HBRUSH)(COLOR_WINDOW+1));

        EndPaint(hwnd, &ps);
        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)
{
    const char CLASS_NAME[] = "ScrollWindowClass";
    WNDCLASS wc = { };

    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

    if (!RegisterClass(&wc))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    HWND hwnd = CreateWindowEx(  
        0,                              // Optional window styles.  
        CLASS_NAME,                     // Window class  
        "Scroll Window Example",         // Window text  
        WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, // Window style  
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 240, // Window position and size  
        NULL,       // Parent window      
        NULL,       // Menu  
        hInstance,  // Instance handle  
        NULL        // Additional application data  
    );  
  
    if (hwnd == NULL)  
    {  
        MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);  
        return 0;  
    }  
  
    ShowWindow(hwnd, nCmdShow);  
    UpdateWindow(hwnd);
  
    // 消息循环  
    MSG msg;  
    while (GetMessage(&msg, NULL, 0, 0)) {  
        TranslateMessage(&msg);  
        DispatchMessage(&msg);  
    }  
    return msg.wParam;  
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值