控件–SysPager与ToolbarWindow32-WindowsAPI论坛-WindowsAPI-津桥芝士平台

控件–SysPager与ToolbarWindow32

使用WindowsAPI,创建SysPager和ToolbarWindow32控件:

#include <windows.h>
#include <commctrl.h>

#pragma comment(lib, "comctl32.lib")

#define WINDOW_CLASS_NAME L"SampleWindowClass"
#define PAGER_CTRL_ID 101
#define TOOLBAR_ID 201
#define SCROLLBAR_ID 301

HINSTANCE hInst;

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{
    static HWND hwndPager;
    static HWND hwndToolbar;
    static HWND hwndScrollBar;
    static int buttonCount = 20; // 按钮数量
    static int buttonWidth = 80;  // 每个按钮的宽度
    static int toolbarWidth;       // 工具栏的总宽度

    switch (message) {
    case WM_CREATE: {
        hwndPager = CreateWindowEx(
            0, WC_PAGESCROLLER, NULL,
            WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
            0, 0, 500, 40,
            hwnd, (HMENU)PAGER_CTRL_ID, hInst, NULL);

        hwndToolbar = CreateWindowEx(
            0, TOOLBARCLASSNAME, NULL,
            WS_CHILD | WS_VISIBLE,
            0, 0, 0, 0,
            hwndPager, (HMENU)TOOLBAR_ID, hInst, NULL);

        // 设置图像列表
        HIMAGELIST hImageList = ImageList_Create(24, 24, ILC_COLOR32 | ILC_MASK, 3, 0);
        HICON hIcon = LoadIcon(NULL, IDI_APPLICATION);
        ImageList_AddIcon(hImageList, hIcon);
        SendMessage(hwndToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);

        TBBUTTON tbb[20];
        for (int i = 0; i < buttonCount; ++i) {
            tbb[i].iBitmap = 0;
            tbb[i].idCommand = 100 + i;
            tbb[i].fsState = TBSTATE_ENABLED;
            tbb[i].fsStyle = TBSTYLE_BUTTON;
            tbb[i].dwData = 0;
            tbb[i].iString = (INT_PTR)L"Button"; // 按钮文本
        }

        SendMessage(hwndToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
        SendMessage(hwndToolbar, TB_ADDBUTTONS, (WPARAM)buttonCount, (LPARAM)&tbb);
        SendMessage(hwndToolbar, TB_AUTOSIZE, 0, 0);

        // 设置工具条的总宽度
        toolbarWidth = buttonCount * buttonWidth;
        SetWindowPos(hwndToolbar, NULL, 0, 0, toolbarWidth, 40, SWP_NOZORDER);

        // 创建滚动条
        hwndScrollBar = CreateWindowEx(0, WC_SCROLLBAR, NULL,
            WS_VISIBLE | WS_CHILD | SBS_HORZ,
            0, 40, 500, 20, hwnd, (HMENU)SCROLLBAR_ID, hInst, NULL);

        // 设置滚动条的范围
        SetScrollRange(hwndScrollBar, SB_CTL, 0, toolbarWidth - 500, TRUE);
        SetScrollPos(hwndScrollBar, SB_CTL, 0, TRUE);

        break;
    }
    case WM_SIZE: {
        // 调整滚动条和工具条的大小
        RECT rc;
        GetClientRect(hwnd, &rc);
        MoveWindow(hwndPager, 0, 0, rc.right, 40, TRUE);
        MoveWindow(hwndScrollBar, 0, 40, rc.right, 20, TRUE);
        break;
    }
    case WM_HSCROLL: {
        // 处理滚动条滚动事件
        int scrollPos = GetScrollPos(hwndScrollBar, SB_CTL);
        int newScrollPos = scrollPos;

        switch (LOWORD(wParam)) {
        case SB_LINELEFT:
            newScrollPos--;
            break;
        case SB_LINERIGHT:
            newScrollPos++;
            break;
        case SB_THUMBPOSITION:
        case SB_THUMBTRACK:
            newScrollPos = HIWORD(wParam);
            break;
        }

        // 限制滚动位置
        if (newScrollPos < 0) newScrollPos = 0;
        if (newScrollPos > (toolbarWidth - 500)) newScrollPos = toolbarWidth - 500;

        // 设置新的滚动位置
        SetScrollPos(hwndScrollBar, SB_CTL, newScrollPos, TRUE);
        ScrollWindow(hwndToolbar, -newScrollPos + scrollPos, 0, NULL, NULL);
        UpdateWindow(hwndToolbar);
        break;
    }
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
    INITCOMMONCONTROLSEX icex;
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    icex.dwICC = ICC_BAR_CLASSES; // Make sure pager and toolbar classes are initialized
    InitCommonControlsEx(&icex);

    hInst = hInstance;
    WNDCLASS wc = {};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = WINDOW_CLASS_NAME;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);

    RegisterClass(&wc);

    HWND hwnd = CreateWindowEx(
        0, WINDOW_CLASS_NAME, L"Windows API SysPager Example",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 500, 100,
        NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0) > 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int)msg.wParam;
}

效果图:

image

 

请登录后发表评论

    没有回复内容