- COLORREF colOld = SetTextColor(hdc, col);
- int modeOld = SetBkMode(hdc, TRANSPARENT);
-
- if ( text.find(_T('\n')) != wxString::npos )
- {
- // draw multiline label
-
- // first we need to compute its bounding rect
- RECT rc;
- ::CopyRect(&rc, pRect);
- ::DrawText(hdc, text, text.length(), &rc, DT_CENTER | DT_CALCRECT);
-
- // now center this rect inside the entire button area
- const LONG w = rc.right - rc.left;
- const LONG h = rc.bottom - rc.top;
- rc.left = (pRect->right - pRect->left)/2 - w/2;
- rc.right = rc.left+w;
- rc.top = (pRect->bottom - pRect->top)/2 - h/2;
- rc.bottom = rc.top+h;
-
- ::DrawText(hdc, text, text.length(), &rc, DT_CENTER);
- }
- else // single line label
- {
- // Note: we must have DT_SINGLELINE for DT_VCENTER to work.
- ::DrawText(hdc, text, text.length(), pRect,
- DT_SINGLELINE | DT_CENTER | DT_VCENTER);
- }
-
- SetBkMode(hdc, modeOld);
- SetTextColor(hdc, colOld);
-}
-
-static void DrawRect(HDC hdc, const RECT& r)
-{
- wxDrawLine(hdc, r.left, r.top, r.right, r.top);
- wxDrawLine(hdc, r.right, r.top, r.right, r.bottom);
- wxDrawLine(hdc, r.right, r.bottom, r.left, r.bottom);
- wxDrawLine(hdc, r.left, r.bottom, r.left, r.top);
-}
-
-void wxButton::MakeOwnerDrawn()
-{
- long style = GetWindowLong(GetHwnd(), GWL_STYLE);
- if ( (style & BS_OWNERDRAW) != BS_OWNERDRAW )
- {
- // make it so
- style |= BS_OWNERDRAW;
- SetWindowLong(GetHwnd(), GWL_STYLE, style);
- }
-}
-
-bool wxButton::SetBackgroundColour(const wxColour &colour)
-{
- if ( !wxControl::SetBackgroundColour(colour) )
- {
- // nothing to do
- return false;
- }
-
- MakeOwnerDrawn();
-
- Refresh();
-
- return true;
-}
-
-bool wxButton::SetForegroundColour(const wxColour &colour)
-{
- if ( !wxControl::SetForegroundColour(colour) )
- {
- // nothing to do
- return false;
- }
-
- MakeOwnerDrawn();
-
- Refresh();
-
- return true;
-}
-
-/*
- The button frame looks like this normally:
-
- WWWWWWWWWWWWWWWWWWB
- WHHHHHHHHHHHHHHHHGB W = white (HILIGHT)
- WH GB H = light grey (LIGHT)
- WH GB G = dark grey (SHADOW)
- WH GB B = black (DKSHADOW)
- WH GB
- WGGGGGGGGGGGGGGGGGB
- BBBBBBBBBBBBBBBBBBB
-
- When the button is selected, the button becomes like this (the total button
- size doesn't change):
-
- BBBBBBBBBBBBBBBBBBB
- BWWWWWWWWWWWWWWWWBB
- BWHHHHHHHHHHHHHHGBB
- BWH GBB
- BWH GBB
- BWGGGGGGGGGGGGGGGBB
- BBBBBBBBBBBBBBBBBBB
- BBBBBBBBBBBBBBBBBBB
-
- When the button is pushed (while selected) it is like:
-
- BBBBBBBBBBBBBBBBBBB
- BGGGGGGGGGGGGGGGGGB
- BG GB
- BG GB
- BG GB
- BG GB
- BGGGGGGGGGGGGGGGGGB
- BBBBBBBBBBBBBBBBBBB
-*/
-
-static void DrawButtonFrame(HDC hdc, const RECT& rectBtn,
- bool selected, bool pushed)
-{
- RECT r;
- CopyRect(&r, &rectBtn);
-
- HPEN hpenBlack = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DDKSHADOW)),
- hpenGrey = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DSHADOW)),
- hpenLightGr = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DLIGHT)),
- hpenWhite = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DHILIGHT));
-
- HPEN hpenOld = (HPEN)SelectObject(hdc, hpenBlack);
-
- r.right--;
- r.bottom--;
-
- if ( pushed )
- {
- DrawRect(hdc, r);
-
- (void)SelectObject(hdc, hpenGrey);
- ::InflateRect(&r, -1, -1);
-
- DrawRect(hdc, r);
- }
- else // !pushed
- {
- if ( selected )
- {
- DrawRect(hdc, r);
-
- ::InflateRect(&r, -1, -1);
- }
-
- wxDrawLine(hdc, r.left, r.bottom, r.right, r.bottom);
- wxDrawLine(hdc, r.right, r.bottom, r.right, r.top - 1);
-
- (void)SelectObject(hdc, hpenWhite);
- wxDrawLine(hdc, r.left, r.bottom - 1, r.left, r.top);
- wxDrawLine(hdc, r.left, r.top, r.right, r.top);
-
- (void)SelectObject(hdc, hpenLightGr);
- wxDrawLine(hdc, r.left + 1, r.bottom - 2, r.left + 1, r.top + 1);
- wxDrawLine(hdc, r.left + 1, r.top + 1, r.right - 1, r.top + 1);
-
- (void)SelectObject(hdc, hpenGrey);
- wxDrawLine(hdc, r.left + 1, r.bottom - 1, r.right - 1, r.bottom - 1);
- wxDrawLine(hdc, r.right - 1, r.bottom - 1, r.right - 1, r.top);
- }
-
- (void)SelectObject(hdc, hpenOld);
- DeleteObject(hpenWhite);
- DeleteObject(hpenLightGr);
- DeleteObject(hpenGrey);
- DeleteObject(hpenBlack);