- 在头文件中声明:HBRUSH m_hMenuBrush;
- CMainFrame::OnCreate中添加:
最后:if (m_hMenuBrush) { DeleteObject(m_hMenuBrush); m_hMenuBrush = NULL; }m_hMenuBrush = CreateSolidBrush(#c8c8c8); // 菜单颜色
::MENUINFO lpcmi;
memset(&lpcmi, 0, sizeof(::LPCMENUINFO));
lpcmi.cbSize = sizeof(MENUINFO);
lpcmi.fMask = MIM_APPLYTOSUBMENUS | MIM_BACKGROUND;
lpcmi.hbrBack = m_hMenuBrush;
::SetMenuInfo(GetMenu()->m_hMenu, &lpcmi);
修改工具栏Toolbar的背景色:
- 取消stdafx.h中的visual style的效果,否则看不到效果
- 继承CToolBar,并响应WM_ERASEBKGND,添加以下代码
// 改变背景色
CRect ClientRect;
GetClientRect(ClientRect);
pDC->FillSolidRect(ClientRect, #6575a9); // #6575a9:修改后的颜色
return TRUE;
最后,修改MainFrm.h中的m_wndToolBar为继承后的类对象
网上关于ReBar的介绍:
http://blog.csdn.net/yue7603835/article/details/6667581
http://bbs.csdn.net/topics/340135204
http://blog.csdn.net/bwmwm/article/details/4734923
ReBar在2010中未试验成功,在vc6中可以看到效果。
另外,以下两句会使程序中所有Toolbar的背景色都改变:
HBRUSH newBr = CreateSolidBrush(#6575a9);
DWORD dwRet = SetClassLongW(m_wndToolBar1.m_hWnd, GCL_HBRBACKGROUND, (long)newBr);
修改状态栏StatusBar的背景色
- 取消stdafx.h中的visual style的效果,否则看不到效果
- 修改背景色:m_wndStatusBar.GetStatusBarCtrl().SetBkColor(#00005a);
- 修改状态栏提示Text的颜色:
继承CStatusBar类为CColorStatusBar,重载DrawItem,
void CColorStatusBar::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct/**/)
{
// TODO: Add your code to draw the specified item
// Attach to a CDC object
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
dc.SetBkMode(TRANSPARENT);
// Get the pane rectangle and calculate text coordinates
CRect rect(&lpDrawItemStruct->rcItem);
if (lpDrawItemStruct->itemID < m_nColumnNum)
{
dc.SetTextColor(m_pColor[lpDrawItemStruct->itemID]);
dc.TextOut(rect.left+2, rect.top, m_pcstrText[lpDrawItemStruct->itemID]);
}
// Detach from the CDC object, otherwise the hDC will be
// destroyed when the CDC object goes out of scope
dc.Detach();
}
其中:m_pColor为COLORREF的指针,CColorStatusBar的成员变量,存储状态栏各列的颜色
m_pcstrText为CString的指针,CColorStatusBar的成员变量,存储状态栏各列的字符
使用CColorStatusBar时,要改变状态栏的提示内容时,需调用m_wndColorStatusBar.GetStatusBarCtrl().SetText(L"", nID, SBT_OWNERDRAW);触发DrawItem函数被调用。
可参考:http://www.codeproject.com/Articles/2324/Display-colored-text-on-Status-Bar#_rating
4. 修改状态栏右边的缩放区域的背景色,响应WM_PAINT消息
void CColorStatusBar::OnPaint()
{
//CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CStatusBar::OnPaint() for painting messages
CStatusBar::OnPaint();
CClientDC dc(this); // class CClientDC : public CDC
if (!GetParent()->IsZoomed()) DrawSizing(&dc);
}
void CColorStatusBar::DrawSizing(CDC *pDC)
{
CRect rect;
GetWindowRect(&rect);
rect.OffsetRect(-rect.left, -rect.top);
if (m_hSizingBkBrush)
{
pDC->SelectObject(m_hSizingBkBrush);
pDC->Rectangle(rect.right-18, rect.bottom-18, rect.right, rect.bottom);
}
if (m_hSizingPen)
{
pDC->SelectObject(m_hSizingPen);
pDC->MoveTo(rect.right - 5, rect.bottom);
pDC->LineTo(rect.right, rect.bottom - 5);
pDC->MoveTo(rect.right - 9, rect.bottom);
pDC->LineTo(rect.right, rect.bottom - 9);
pDC->MoveTo(rect.right - 13, rect.bottom);
pDC->LineTo(rect.right, rect.bottom - 13);
}
}
其中m_hSizingBkBrush、m_hSizingPen均为CcolorStatusBar的成员变量。
可参考:Extended statusbar with bitmap, progress bar and mouse action
http://www.codeguru.com/cpp/controls/statusbar/article.php/c2969/Extended-statusbar-with-bitmap-progress-bar-and-mouse-action.htm