工具栏中的button大小 – win32程序

我正在创build与我的位图图像的工具栏,我有button大小的问题。
这个图像大小是20/20像素。

在这里输入图像说明

我创build一个工具栏,并设置button的大小为20/20像素,由此代码:

SendMessage(hToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(20, 20)); 

我将颜色scheme设置为红色和绿色,所以当光标站在button上时,button框将显示清晰。

当光标站在button上时,这就是我所看到的:

在这里输入图像说明

正如你所看到的button大小不是20 \ 20像素,而是26个像素。 那么为什么发生?

还有一个问题,是否可以在鼠标光标TB_SETHOTIMAGELIST时取消高亮显示button,而是设置热图像列表(通过TB_SETHOTIMAGELIST消息),所以当光标hover在button上时,热图像将显示,而不会突出显示该button。

这是完整的代码:

 #include <windows.h> #include <stdlib.h> #include <CommCtrl.h> #pragma comment(lib, "comctl32.lib") #define IDB_PRINT 40000 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HINSTANCE instance; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { instance = hInstance; WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = L"Example"; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); RegisterClassEx(&wcex); HWND hWnd = CreateWindow(L"Example", L"", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, hInstance, NULL); // Initialize common controls. INITCOMMONCONTROLSEX icex; icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = ICC_COOL_CLASSES | ICC_BAR_CLASSES; InitCommonControlsEx(&icex); // create toolbar HWND hToolbar = CreateWindowExW(WS_EX_TOOLWINDOW | TBSTYLE_EX_HIDECLIPPEDBUTTONS, TOOLBARCLASSNAME, NULL, CCS_NODIVIDER | WS_CHILD | WS_VISIBLE | CCS_ADJUSTABLE | TBSTYLE_ALTDRAG | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS, 0, 0, 0, 0, hWnd, (HMENU)0, instance, NULL); SendMessage(hToolbar, TB_SETMAXTEXTROWS, 0, 0); // create image list HIMAGELIST hImageList = ImageList_Create(20,20, ILC_COLORDDB, 4, 0); ImageList_Add(hImageList, LoadBitmap(instance, MAKEINTRESOURCEW(IDB_PRINT)), NULL); // set the image list SendMessage(hToolbar, TB_SETIMAGELIST, (WPARAM)0, (LPARAM)hImageList); SendMessage(hToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); // create button TBBUTTON tbb[1] = { {0, 0, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0}, 0, (INT_PTR)L"Print"}, }; // add button to the toolbar SendMessage(hToolbar, (UINT)TB_ADDBUTTONS, 1, (LPARAM)&tbb); SendMessage(hToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(20, 20)); SendMessage(hToolbar, TB_AUTOSIZE, 0, 0); // set color scheme to blue COLORSCHEME cs; cs.dwSize = sizeof(cs); cs.clrBtnShadow = RGB(255, 0, 0); cs.clrBtnHighlight = RGB(0, 255, 0); SendMessage(hToolbar, TB_SETCOLORSCHEME, 0, (LPARAM)&cs); // show the toolbar ShowWindow(hToolbar , SW_SHOW); // show the main window ShowWindow(hWnd, nCmdShow); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: return 0; default: return DefWindowProc(hWnd, message, wParam, lParam); } } 

Windows在位图周围添加填充。 您可以以编程方式检测到控件的TB_GETPADDING消息有多少。 在我的工具栏创建,我做这样的事情:

 // By default Windows creates the tiles as 22x23, minus the padding area of 6x7, for a bitmap size of 16x16. DWORD iSize = SendMessage(hTool, TB_GETBUTTONSIZE, 0, 0); DWORD iPadSize = SendMessage(hTool, TB_GETPADDING, 0, 0); // Build our bitmap int xsize=LOWORD(iSize) - LOWORD(iPadSize); // width int ysize=HIWORD(iSize) - HIWORD(iPadSize); // height 

您可以使用TB_SETBUTTONSIZE设置您自己的位图大小,但是您仍然必须允许填充。