最近我开始学习基于Win32 API的GUI编程。 当我将工具栏控件(从comctl32.lib )添加到我的简单应用程序时,我发现它看起来很平坦,而菜单栏有更多“Windows 7友好”的3D外观和感觉(顶部为白色光晕,上部为垂直灰度梯度)。 差异使它看起来有线。
但是,我发现许多其他应用程序对于菜单栏和工具栏都有一致的外观和感觉。 例如。 记事本++和记事本2 。
我读过一些官方文档,并尝试了解决scheme,例如视觉样式概述 , 启用视觉样式 ,但是,它只启用平面button样式(与旧的Win98实体button样式相比)。 这与我在第一张照片中得到的风格没有任何区别。
我试图阅读Notepad ++的源代码。 findToolBar.cpp,并相应地对我的代码进行了一些更改,但没有任何更改。 我想我是在代码库中输了。
这里是我调用InitCommonControlsEx
和创buildToolBar的代码。
// 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); }
所以, 问题是:尽pipebutton的位图,我怎么能得到工具栏的3D外观和感觉,就像记事本++ /记事本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, GetmoduleeHandleW(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); }