void DrawGrayText(HDC hdc, LPRECT pRect, LPCTSTR title, int dt_flags) { COLORREF gray = GetSysColor(COLOR_GRAYTEXT); if (gray) { TextColor lcColor(hdc, GetSysColor(COLOR_BTNHIGHLIGHT)); RECT shadowRect = {pRect->left+1, pRect->top+1, pRect->right+1, pRect->bottom+1}; DrawText(hdc, title, -1, &shadowRect, dt_flags); SetTextColor(hdc, gray); DrawText(hdc, title, -1, pRect, dt_flags); } else { int old_r = pRect->right; int old_b = pRect->bottom; DrawText(hdc, title, -1, pRect, dt_flags|DT_CALCRECT); int x = pRect->left + (old_r-pRect->right)/2; int y = pRect->top + (old_b-pRect->bottom)/2; int w = pRect->right-pRect->left; int h = pRect->bottom-pRect->top; s_MyDrawText_Rect.right = w; s_MyDrawText_Rect.bottom = h; GrayString(hdc, GetSysColorBrush(COLOR_GRAYTEXT), MyDrawText, (LPARAM)title, -1, x, y, w, h); } }
void FlatButton::DrawItem(LPDRAWITEMSTRUCT dis) { UINT style = DFCS_BUTTONPUSH; if (dis->itemState & ODS_DISABLED) style |= DFCS_INACTIVE; RECT textRect = {dis->rcItem.left+2, dis->rcItem.top+2, dis->rcItem.right-4, dis->rcItem.bottom-4}; if (dis->itemState & ODS_SELECTED) { style |= DFCS_PUSHED; ++textRect.left; ++textRect.top; ++textRect.right; ++textRect.bottom; } FillRect(dis->hDC, &dis->rcItem, GetSysColorBrush(COLOR_BTNFACE)); // highlight the button? if (_active) DrawEdge(dis->hDC, &dis->rcItem, EDGE_ETCHED, BF_RECT); else if (GetWindowStyle(_hwnd) & BS_FLAT) // Only with BS_FLAT there will be drawn a frame to show highlighting. DrawEdge(dis->hDC, &dis->rcItem, EDGE_RAISED, BF_RECT|BF_FLAT); TCHAR txt[BUFFER_LEN]; int txt_len = GetWindowText(_hwnd, txt, BUFFER_LEN); if (dis->itemState & (ODS_DISABLED|ODS_GRAYED)) { COLORREF gray = GetSysColor(COLOR_GRAYTEXT); if (gray) { { TextColor lcColor(dis->hDC, GetSysColor(COLOR_BTNHIGHLIGHT)); RECT shadowRect = {textRect.left+1, textRect.top+1, textRect.right+1, textRect.bottom+1}; DrawText(dis->hDC, txt, txt_len, &shadowRect, DT_SINGLELINE|DT_VCENTER|DT_CENTER); } BkMode mode(dis->hDC, TRANSPARENT); TextColor lcColor(dis->hDC, gray); DrawText(dis->hDC, txt, txt_len, &textRect, DT_SINGLELINE|DT_VCENTER|DT_CENTER); } else { int old_r = textRect.right; int old_b = textRect.bottom; DrawText(dis->hDC, txt, txt_len, &textRect, DT_SINGLELINE|DT_VCENTER|DT_CENTER|DT_CALCRECT); int x = textRect.left + (old_r-textRect.right)/2; int y = textRect.top + (old_b-textRect.bottom)/2; int w = textRect.right-textRect.left; int h = textRect.bottom-textRect.top; s_MyDrawText_Rect.right = w; s_MyDrawText_Rect.bottom = h; GrayString(dis->hDC, GetSysColorBrush(COLOR_GRAYTEXT), MyDrawText, (LPARAM)txt, txt_len, x, y, w, h); } } else { TextColor lcColor(dis->hDC, _active? _activeColor: _textColor); DrawText(dis->hDC, txt, txt_len, &textRect, DT_SINGLELINE|DT_VCENTER|DT_CENTER); } if (dis->itemState & ODS_FOCUS) { RECT rect = { dis->rcItem.left+3, dis->rcItem.top+3, dis->rcItem.right-dis->rcItem.left-4, dis->rcItem.bottom-dis->rcItem.top-4 }; if (dis->itemState & ODS_SELECTED) { ++rect.left; ++rect.top; ++rect.right; ++rect.bottom; } DrawFocusRect(dis->hDC, &rect); } }
BOOL PASCAL _Cover_GrayString( HDC dc, HBRUSH brush, FARPROC p, DWORD data, short count, short x, short y, short width, short height ) { return( GrayString( dc, brush, SetProc( p, GETPROC_GRAYSTRING ), data, count, x, y, width, height ) ); }