使用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;
}
效果图:
没有回复内容