-/*
- The button frame looks like this normally:
-
- WWWWWWWWWWWWWWWWWWB
- W GB
- W GB
- W GB where W, G, B are white, grey and black pixels
- W GB
- WGGGGGGGGGGGGGGGGGB
- BBBBBBBBBBBBBBBBBBB
-
- When the button is selected, the button becomes like this (the total button
- size doesn't change):
-
- BBBBBBBBBBBBBBBBBBB
- BWWWWWWWWWWWWWWWWBB
- BW GBB
- BW GBB
- BWGGGGGGGGGGGGGGGBB
- BBBBBBBBBBBBBBBBBBB
- BBBBBBBBBBBBBBBBBBB
-
- When the button is pushed (while selected) it is like:
-
- BBBBBBBBBBBBBBBBBBB
- BGGGGGGGGGGGGGGGGGB
- 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)),
- 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);
- }
-
- MoveToEx(hdc, r.left, r.bottom, NULL);
- LineTo(hdc, r.right, r.bottom);
- LineTo(hdc, r.right, r.top - 1);
-
- (void)SelectObject(hdc, hpenWhite);
- MoveToEx(hdc, r.left, r.bottom - 1, NULL);
- LineTo(hdc, r.left, r.top);
- LineTo(hdc, r.right, r.top);
-
- (void)SelectObject(hdc, hpenGrey);
- MoveToEx(hdc, r.left + 1, r.bottom - 1, NULL);
- LineTo(hdc, r.right - 1, r.bottom - 1);
- LineTo(hdc, r.right - 1, r.top);
- }
-
- (void)SelectObject(hdc, hpenOld);
- DeleteObject(hpenWhite);
- DeleteObject(hpenGrey);
- DeleteObject(hpenBlack);
-}
-
-bool wxButton::MSWOnDraw(WXDRAWITEMSTRUCT *wxdis)
-{
- LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT)wxdis;
-
- RECT rectBtn;
- CopyRect(&rectBtn, &lpDIS->rcItem);
-
- COLORREF colBg = wxColourToRGB(GetBackgroundColour()),
- colFg = wxColourToRGB(GetForegroundColour());
-
- HDC hdc = lpDIS->hDC;
- UINT state = lpDIS->itemState;
-
- // first, draw the background
- HBRUSH hbrushBackground = ::CreateSolidBrush(colBg);
-
- FillRect(hdc, &rectBtn, hbrushBackground);
-
- // draw the border for the current state
- bool selected = (state & ODS_SELECTED) != 0;
- if ( !selected )
- {
- wxPanel *panel = wxDynamicCast(GetParent(), wxPanel);
- if ( panel )
- {
- selected = panel->GetDefaultItem() == this;
- }
- }
- bool pushed = (SendMessage(GetHwnd(), BM_GETSTATE, 0, 0) & BST_PUSHED) != 0;
-
- DrawButtonFrame(hdc, rectBtn, selected, pushed);
-
- // draw the focus rect if needed
- if ( state & ODS_FOCUS )
- {
- RECT rectFocus;
- CopyRect(&rectFocus, &rectBtn);
-
- // I don't know where does this constant come from, but this is how
- // Windows draws them
- InflateRect(&rectFocus, -4, -4);
-
- DrawFocusRect(hdc, &rectFocus);
- }
-
- if ( pushed )
- {
- // the label is shifted by 1 pixel to create "pushed" effect
- OffsetRect(&rectBtn, 1, 1);
- }
-
- DrawButtonText(hdc, &rectBtn, GetLabel(),
- state & ODS_DISABLED ? GetSysColor(COLOR_GRAYTEXT)
- : colFg);
-
- ::DeleteObject(hbrushBackground);
-
- return TRUE;
-}