Introduction
Yet another owner drawn toolbar. This one has the Office XP look & feel. Have a look to the source code (ToolbarXP.h and ToolbarXP.cpp) for more details.
Some parts of code are copied from other articles. Thanks to their authors!
How to use the CToolBarXP class
Include the ToolbarXP.h
file and just replace the CToolBar m_wndToolBar
declaration in your files by CToolBarXP m_wndToolBar
. That's all ! (see the demo)
Other classes
CButtonXP
, CListBoxXP
, CComboBoxXP
: Flat controls with "mouseover" and "mouseout" effects.
CStatusBarXP
: Flat statusbar.
CPopup
: Allow any control to be popped over frame (as shown in the image).
CWindowsManagerDlg
: MDI child window manager.
CBufferDC: An easy-to-use class to simplify the bufferized drawing.
Example: Replace in your code:
void CToolBarXP::OnPaint ()
{
CPaintDC cDC (this);
cDC.FillSolidRect (CRect(10,10,100,100), 255);
cDC.MoveTo (10, 10);
cDC.LineTO (100, 100);
}
by:
void CToolBarXP::OnPaint ()
{
CPaintDC cpDC (this);
CBufferDC cDC (cpDC);
cDC.FillSolidRect (CRect(10,10,100,100), 255);
cDC.MoveTo (10, 10);
cDC.LineTO (100, 100);
}
And it works too with any HDC (see the
CButtonXP::DrawItem
method for another
exemple).
The only constraint: you have to do all drawing with the same CBufferDC instance.
You cannot have a first part in the
OnEraseBkgnd
and another one in
the
OnPaint
.
CPenDC and CBrushDC: Simplify the use of local CPen and CBrush objects.
Without those classes:
CPen pen (PS_SOLID, 1, RGB(0,0,255));
CBrush brush (RGB(0,255,0));
CPen* pOldPen = cDC.SelectObject (&pen);
CBrush* pOldBrush = cDC.SelectObject (&brush);
cDC.Rectangle (10,10,100,100);
cDC.SelectObject (pOldPen);
cDC.SelectObject (pOldBrush);
With them:
CPenDC pen (cDC, RGB(0,0,255));
CBrushDC brush (cDC, RGB(0,255,0));
cDC.Rectangle (10,10,100,100);
CClientRect and CWindowRect: Encapsulate GetClientRect and GetWindowRect calls.
Without:
CRect rcClient;
GetClientRect (rcClient);
cDC.FillSolidRect (rcClient, 255);
With:
cDC.FillSolidRect (CClientRect (this), 255);
CWindowText: Encapsulate GetWindowText calls.
Without:
CString sText;
GetWindowText (sText);
CDC.DrawText (sText, rc, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
With:
cDC.DrawText (CWindowText (this), rc, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
Credit
Thanks to Christian Rodemeyer for his RGB<->HLS
conversion methods from the article CColor
- RGB and HLS combined in one class.