最近我开始学习基于Win32 API的GUI编程。当我将工具栏控件(从 comctl32.lib )添加到我的简单应用程序时,我发现它看起来很平整,而菜单栏有更多“Windows 7友好”3D外观(顶部有白色光晕)垂直灰色渐变从上到下)。差异使它看起来很有线。
但是,我发现许多其他应用程序在菜单栏和工具栏上都具有一致的外观和感觉。例如。 Notepad++和Notepad 2。
我已经阅读了一些官方文档并尝试了解决方案,例如Visual Styles Overview,Enabling Visual Styles,但是,它只启用平面按钮样式(与旧的Win98实体按钮样式相比)。它与第一张照片中的风格没有任何区别。
我试着阅读Notepad ++的源代码。找到ToolBar.cpp并相应地对我的代码进行了一些更改,但没有任何更改。我想我在代码库中迷失了。
以下是我调用InitCommonControlsEx
和创建工具栏的代码。
// in WinMain
INITCOMMONCONTROLSEX icce;
icce.dwSize = sizeof(INITCOMMONCONTROLSEX);
icce.dwICC = ICC_BAR_CLASSES | ICC_COOL_CLASSES | ICC_USEREX_CLASSES;
InitCommonControlsEx(&icce);
// called in WM_CREATE handler, hwnd is the handle of the main window
VOID BuildToolBar(HWND hwnd)
{
HWND hTool;
TBBUTTON tbb[3];
TBADDBITMAP tbab;
hTool = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS |TBSTYLE_FLAT | CCS_TOP | BTNS_AUTOSIZE, 0, 0, 0, 0, hwnd, (HMENU)IDC_MAIN_TOOL, GetModuleHandle(NULL), NULL);
SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
SendMessage(hTool, TB_SETEXTENDEDSTYLE, 0, (LPARAM)TBSTYLE_EX_HIDECLIPPEDBUTTONS);
tbab.hInst = HINST_COMMCTRL;
tbab.nID = IDB_STD_SMALL_COLOR;
SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tbab);
ZeroMemory(tbb, sizeof(tbb));
tbb[0].iBitmap = STD_FILENEW;
tbb[0].fsState = TBSTATE_ENABLED;
tbb[0].fsStyle = TBSTYLE_BUTTON;
tbb[0].idCommand = ID_FILE_NEW;
tbb[1].iBitmap = STD_FILEOPEN;
tbb[1].fsState = TBSTATE_ENABLED;
tbb[1].fsStyle = TBSTYLE_BUTTON;
tbb[1].idCommand = ID_FILE_OPEN;
tbb[2].iBitmap = STD_FILESAVE;
tbb[2].fsState = TBSTATE_ENABLED;
tbb[2].fsStyle = TBSTYLE_BUTTON;
tbb[2].idCommand = ID_FILE_SAVEAS;
SendMessage(hTool, TB_SETBUTTONSIZE, (WPARAM)0, (LPARAM)MAKELONG(16, 16));
SendMessage(hTool, TB_ADDBUTTONS, sizeof(tbb) / sizeof(TBBUTTON), (LPARAM)&tbb);
SendMessage(hTool, TB_AUTOSIZE, 0, 0);
}
所以,问题是:尽管按钮的位图如何,我如何获得工具栏的3D外观,就像Notepad ++ / Notepad2示例一样?
提前致谢。
答案 0 :(得分:2)
首先创建工具栏,然后再创建钢筋。
必须将 rbBand.hbmBack 设置为 NULL 才能获得现代外观工具栏, 或从下面的代码中删除 RBBIM_BACKGROUND 标记。
以下是创建钢筋的方法:
HWND WINAPI CreateRebar (HWND hwndOwner)
{
REBARINFO rbi;
REBARBANDINFO rbBand;
RECT rc;
HWND hwndCB, hwndRB;
DWORD dwBtnSize;
hwndRB = CreateWindowExW(WS_EX_TOOLWINDOW,
REBARCLASSNAME,
NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
WS_CLIPCHILDREN | RBS_VARHEIGHT |
CCS_NODIVIDER,
0, 0, 0, 0,
hwndOwner,
NULL,
GetModuleHandleW(NULL),
NULL);
if (!hwndRB)
return NULL;
// Initialize and send the REBARINFO structure.
rbi.cbSize = sizeof(REBARINFO); // Required when using this
// structure.
rbi.fMask = 0;
rbi.himl = (HIMAGELIST)NULL;
if (!SendMessage(hwndRB, RB_SETBARINFO, 0, (LPARAM)&rbi))
return NULL;
// Initialize structure members that both bands will share.
rbBand.cbSize = sizeof(REBARBANDINFO); // Required
rbBand.fMask = RBBIM_COLORS | RBBIM_TEXT | RBBIM_BACKGROUND |
RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE |
RBBIM_SIZE;
rbBand.fStyle = RBBS_CHILDEDGE | RBBS_FIXEDBMP;
rbBand.hbmBack = NULL; //
// Create the combo box control to be added.
hwndCB = CreateWindowW(TEXT("COMBOBOX"), NULL,
WS_CHILD | WS_VISIBLE | CBS_HASSTRINGS | CBS_DROPDOWNLIST,
410, 20, 120, 110, (HWND) NULL, NULL, NULL, NULL);;
// Set values unique to the band with the combo box.
GetWindowRect(hwndCB, &rc);
rbBand.lpText = "Combo Box";
rbBand.hwndChild = hwndCB;
rbBand.cxMinChild = 0;
rbBand.cyMinChild = rc.bottom - rc.top;
rbBand.cx = 200;
// Add the band that has the combo box.
SendMessage(hwndRB, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
// Get the height of the toolbar.
dwBtnSize = SendMessage(toolbar1, TB_GETBUTTONSIZE, 0, 0);
// Set values unique to the band with the toolbar.
rbBand.lpText = "Tool Bar";
rbBand.hwndChild = toolbar1;
rbBand.cxMinChild = 0;
rbBand.cyMinChild = HIWORD(dwBtnSize);
rbBand.cx = 250;
// Add the band that has the toolbar.
SendMessage(hwndRB, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
return (hwndRB);
}