HBRUSH FASTCALL DefWndControlColor(HDC hDC, UINT ctlType) { if (ctlType == CTLCOLOR_SCROLLBAR) { HBRUSH hb = IntGetSysColorBrush(COLOR_SCROLLBAR); COLORREF bk = IntGetSysColor(COLOR_3DHILIGHT); IntGdiSetTextColor(hDC, IntGetSysColor(COLOR_3DFACE)); IntGdiSetBkColor(hDC, bk); /* if COLOR_WINDOW happens to be the same as COLOR_3DHILIGHT * we better use 0x55aa bitmap brush to make scrollbar's background * look different from the window background. */ if ( bk == IntGetSysColor(COLOR_WINDOW)) return gpsi->hbrGray; NtGdiUnrealizeObject( hb ); return hb; } IntGdiSetTextColor(hDC, IntGetSysColor(COLOR_WINDOWTEXT)); if ((ctlType == CTLCOLOR_EDIT) || (ctlType == CTLCOLOR_LISTBOX)) { IntGdiSetBkColor(hDC, IntGetSysColor(COLOR_WINDOW)); } else { IntGdiSetBkColor(hDC, IntGetSysColor(COLOR_3DFACE)); return IntGetSysColorBrush(COLOR_3DFACE); } return IntGetSysColorBrush(COLOR_WINDOW); }
INT WINAPI FillRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr) { BOOL Ret; HBRUSH prevhbr = NULL; /* Select brush if specified */ if (hbr) { /* Handle system colors */ if (hbr <= (HBRUSH)(COLOR_MENUBAR + 1)) hbr = IntGetSysColorBrush(PtrToUlong(hbr) - 1); prevhbr = NtGdiSelectBrush(hDC, hbr); if (prevhbr == NULL) return (INT)FALSE; } Ret = NtGdiPatBlt(hDC, lprc->left, lprc->top, lprc->right - lprc->left, lprc->bottom - lprc->top, PATCOPY); /* Select old brush */ if (prevhbr) NtGdiSelectBrush(hDC, prevhbr); return (INT)Ret; }
/* Ported from WINE20020904 */ void FASTCALL UITOOLS_DrawCheckedRect( HDC dc, LPRECT rect ) { if(IntGetSysColor(COLOR_BTNHIGHLIGHT) == RGB(255, 255, 255)) { HBRUSH hbsave; COLORREF bg; FillRect(dc, rect, IntGetSysColorBrush(COLOR_BTNFACE)); bg = IntGdiSetBkColor(dc, RGB(255, 255, 255)); hbsave = NtGdiSelectBrush(dc, gpsi->hbrGray); NtGdiPatBlt(dc, rect->left, rect->top, rect->right-rect->left, rect->bottom-rect->top, 0x00FA0089); NtGdiSelectBrush(dc, hbsave); IntGdiSetBkColor(dc, bg); } else { FillRect(dc, rect, IntGetSysColorBrush(COLOR_BTNHIGHLIGHT)); } }
/* Draw a push button coming from DrawFrameControl() * * Does a pretty good job in emulating MS behavior. Some quirks are * however there because MS uses a TrueType font (Marlett) to draw * the buttons. * * FIXME: This looks a little bit strange, needs to be rewritten completely * (several quirks with adjust, DFCS_CHECKED aso) */ BOOL FASTCALL UITOOLS95_DFC_ButtonPush(HDC dc, LPRECT r, UINT uFlags) { UINT edge; RECT myr = *r; if(uFlags & (DFCS_PUSHED | DFCS_CHECKED | DFCS_FLAT)) edge = EDGE_SUNKEN; else edge = EDGE_RAISED; if(uFlags & DFCS_CHECKED) { if(uFlags & DFCS_MONO) IntDrawRectEdge(dc, &myr, edge, BF_MONO|BF_RECT|BF_ADJUST); else IntDrawRectEdge(dc, &myr, edge, (uFlags&DFCS_FLAT)|BF_RECT|BF_SOFT|BF_ADJUST); UITOOLS_DrawCheckedRect( dc, &myr ); } else { if(uFlags & DFCS_MONO) { IntDrawRectEdge(dc, &myr, edge, BF_MONO|BF_RECT|BF_ADJUST); FillRect(dc, &myr, IntGetSysColorBrush(COLOR_BTNFACE)); } else { IntDrawRectEdge(dc, r, edge, (uFlags&DFCS_FLAT) | BF_MIDDLE | BF_RECT | BF_SOFT); } } /* Adjust rectangle if asked */ if(uFlags & DFCS_ADJUSTRECT) { r->left += 2; r->right -= 2; r->top += 2; r->bottom -= 2; } return TRUE; }
/* Same as DrawEdge invoked without BF_DIAGONAL * * 23-Nov-1997: Changed by Bertho Stultiens * * Well, I started testing this and found out that there are a few things * that weren't quite as win95. The following rewrite should reproduce * win95 results completely. * The colorselection is table-driven to avoid awfull if-statements. * The table below show the color settings. * * Pen selection table for uFlags = 0 * * uType | LTI | LTO | RBI | RBO * ------+-------+-------+-------+------- * 0000 | x | x | x | x * 0001 | x | 22 | x | 21 * 0010 | x | 16 | x | 20 * 0011 | x | x | x | x * ------+-------+-------+-------+------- * 0100 | x | 20 | x | 16 * 0101 | 20 | 22 | 16 | 21 * 0110 | 20 | 16 | 16 | 20 * 0111 | x | x | x | x * ------+-------+-------+-------+------- * 1000 | x | 21 | x | 22 * 1001 | 21 | 22 | 22 | 21 * 1010 | 21 | 16 | 22 | 20 * 1011 | x | x | x | x * ------+-------+-------+-------+------- * 1100 | x | x | x | x * 1101 | x | x (22)| x | x (21) * 1110 | x | x (16)| x | x (20) * 1111 | x | x | x | x * * Pen selection table for uFlags = BF_SOFT * * uType | LTI | LTO | RBI | RBO * ------+-------+-------+-------+------- * 0000 | x | x | x | x * 0001 | x | 20 | x | 21 * 0010 | x | 21 | x | 20 * 0011 | x | x | x | x * ------+-------+-------+-------+------- * 0100 | x | 22 | x | 16 * 0101 | 22 | 20 | 16 | 21 * 0110 | 22 | 21 | 16 | 20 * 0111 | x | x | x | x * ------+-------+-------+-------+------- * 1000 | x | 16 | x | 22 * 1001 | 16 | 20 | 22 | 21 * 1010 | 16 | 21 | 22 | 20 * 1011 | x | x | x | x * ------+-------+-------+-------+------- * 1100 | x | x | x | x * 1101 | x | x (20)| x | x (21) * 1110 | x | x (21)| x | x (20) * 1111 | x | x | x | x * * x = don't care; (n) = is what win95 actually uses * LTI = left Top Inner line * LTO = left Top Outer line * RBI = Right Bottom Inner line * RBO = Right Bottom Outer line * 15 = COLOR_BTNFACE * 16 = COLOR_BTNSHADOW * 20 = COLOR_BTNHIGHLIGHT * 21 = COLOR_3DDKSHADOW * 22 = COLOR_3DLIGHT */ BOOL FASTCALL IntDrawRectEdge(HDC hdc, LPRECT rc, UINT uType, UINT uFlags) { signed char LTInnerI, LTOuterI; signed char RBInnerI, RBOuterI; HPEN LTInnerPen, LTOuterPen; HPEN RBInnerPen, RBOuterPen; RECT InnerRect = *rc; POINT SavePoint; HPEN SavePen; int LBpenplus = 0; int LTpenplus = 0; int RTpenplus = 0; int RBpenplus = 0; BOOL retval = !( ((uType & BDR_INNER) == BDR_INNER || (uType & BDR_OUTER) == BDR_OUTER) && !(uFlags & (BF_FLAT|BF_MONO)) ); /* Init some vars */ LTInnerPen = LTOuterPen = RBInnerPen = RBOuterPen = (HPEN)NtGdiGetStockObject(NULL_PEN); SavePen = (HPEN)NtGdiSelectPen(hdc, LTInnerPen); /* Determine the colors of the edges */ if(uFlags & BF_MONO) { LTInnerI = RBInnerI = LTRBInnerMono[uType & (BDR_INNER|BDR_OUTER)]; LTOuterI = RBOuterI = LTRBOuterMono[uType & (BDR_INNER|BDR_OUTER)]; } else if(uFlags & BF_FLAT) { LTInnerI = RBInnerI = LTRBInnerFlat[uType & (BDR_INNER|BDR_OUTER)]; LTOuterI = RBOuterI = LTRBOuterFlat[uType & (BDR_INNER|BDR_OUTER)]; /* Bertho Stultiens states above that this function exactly matches win95 * In win98 BF_FLAT rectangles have an inner border same color as the * middle (COLOR_BTNFACE). I believe it's the same for win95 but since * I don't know I go with Bertho and just sets it for win98 until proven * otherwise. * Dennis Björklund, 10 June, 99 */ if( LTInnerI != -1 ) LTInnerI = RBInnerI = COLOR_BTNFACE; } else if(uFlags & BF_SOFT) { LTInnerI = LTInnerSoft[uType & (BDR_INNER|BDR_OUTER)]; LTOuterI = LTOuterSoft[uType & (BDR_INNER|BDR_OUTER)]; RBInnerI = RBInnerSoft[uType & (BDR_INNER|BDR_OUTER)]; RBOuterI = RBOuterSoft[uType & (BDR_INNER|BDR_OUTER)]; } else { LTInnerI = LTInnerNormal[uType & (BDR_INNER|BDR_OUTER)]; LTOuterI = LTOuterNormal[uType & (BDR_INNER|BDR_OUTER)]; RBInnerI = RBInnerNormal[uType & (BDR_INNER|BDR_OUTER)]; RBOuterI = RBOuterNormal[uType & (BDR_INNER|BDR_OUTER)]; } if((uFlags & BF_BOTTOMLEFT) == BF_BOTTOMLEFT) LBpenplus = 1; if((uFlags & BF_TOPRIGHT) == BF_TOPRIGHT) RTpenplus = 1; if((uFlags & BF_BOTTOMRIGHT) == BF_BOTTOMRIGHT) RBpenplus = 1; if((uFlags & BF_TOPLEFT) == BF_TOPLEFT) LTpenplus = 1; if(LTInnerI != -1) LTInnerPen = NtGdiGetStockObject(DC_PEN); if(LTOuterI != -1) LTOuterPen = NtGdiGetStockObject(DC_PEN); if(RBInnerI != -1) RBInnerPen = NtGdiGetStockObject(DC_PEN); if(RBOuterI != -1) RBOuterPen = NtGdiGetStockObject(DC_PEN); if((uFlags & BF_MIDDLE) && retval) { FillRect(hdc, &InnerRect, IntGetSysColorBrush(uFlags & BF_MONO ? COLOR_WINDOW : COLOR_BTNFACE)); } GreMoveTo(hdc, 0, 0, &SavePoint); /* Draw the outer edge */ NtGdiSelectPen(hdc, LTOuterPen); IntSetDCPenColor(hdc, IntGetSysColor(LTOuterI)); if(uFlags & BF_TOP) { GreMoveTo(hdc, InnerRect.left, InnerRect.top, NULL); NtGdiLineTo(hdc, InnerRect.right, InnerRect.top); } if(uFlags & BF_LEFT) { GreMoveTo(hdc, InnerRect.left, InnerRect.top, NULL); NtGdiLineTo(hdc, InnerRect.left, InnerRect.bottom); } NtGdiSelectPen(hdc, RBOuterPen); IntSetDCPenColor(hdc, IntGetSysColor(RBOuterI)); if(uFlags & BF_BOTTOM) { GreMoveTo(hdc, InnerRect.left, InnerRect.bottom-1, NULL); NtGdiLineTo(hdc, InnerRect.right, InnerRect.bottom-1); } if(uFlags & BF_RIGHT) { GreMoveTo(hdc, InnerRect.right-1, InnerRect.top, NULL); NtGdiLineTo(hdc, InnerRect.right-1, InnerRect.bottom); } /* Draw the inner edge */ NtGdiSelectPen(hdc, LTInnerPen); IntSetDCPenColor(hdc, IntGetSysColor(LTInnerI)); if(uFlags & BF_TOP) { GreMoveTo(hdc, InnerRect.left+LTpenplus, InnerRect.top+1, NULL); NtGdiLineTo(hdc, InnerRect.right-RTpenplus, InnerRect.top+1); } if(uFlags & BF_LEFT) { GreMoveTo(hdc, InnerRect.left+1, InnerRect.top+LTpenplus, NULL); NtGdiLineTo(hdc, InnerRect.left+1, InnerRect.bottom-LBpenplus); } NtGdiSelectPen(hdc, RBInnerPen); IntSetDCPenColor(hdc, IntGetSysColor(RBInnerI)); if(uFlags & BF_BOTTOM) { GreMoveTo(hdc, InnerRect.left+LBpenplus, InnerRect.bottom-2, NULL); NtGdiLineTo(hdc, InnerRect.right-RBpenplus, InnerRect.bottom-2); } if(uFlags & BF_RIGHT) { GreMoveTo(hdc, InnerRect.right-2, InnerRect.top+RTpenplus, NULL); NtGdiLineTo(hdc, InnerRect.right-2, InnerRect.bottom-RBpenplus); } if( ((uFlags & BF_MIDDLE) && retval) || (uFlags & BF_ADJUST) ) { int add = (LTRBInnerMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? 1 : 0) + (LTRBOuterMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? 1 : 0); if(uFlags & BF_LEFT) InnerRect.left += add; if(uFlags & BF_RIGHT) InnerRect.right -= add; if(uFlags & BF_TOP) InnerRect.top += add; if(uFlags & BF_BOTTOM) InnerRect.bottom -= add; if(uFlags & BF_ADJUST) *rc = InnerRect; } /* Cleanup */ NtGdiSelectPen(hdc, SavePen); GreMoveTo(hdc, SavePoint.x, SavePoint.y, NULL); return retval; }
static void IntDrawScrollInterior(PWND pWnd, HDC hDC, INT nBar, BOOL Vertical, PSCROLLBARINFO ScrollBarInfo) { INT ThumbSize = ScrollBarInfo->xyThumbBottom - ScrollBarInfo->xyThumbTop; INT ThumbTop = ScrollBarInfo->xyThumbTop; RECT Rect; HBRUSH hSaveBrush, hBrush; BOOL TopSelected = FALSE, BottomSelected = FALSE; if (ScrollBarInfo->rgstate[SCROLL_TOP_RECT] & STATE_SYSTEM_PRESSED) TopSelected = TRUE; if (ScrollBarInfo->rgstate[SCROLL_BOTTOM_RECT] & STATE_SYSTEM_PRESSED) BottomSelected = TRUE; /* * Only scrollbar controls send WM_CTLCOLORSCROLLBAR. * The window-owned scrollbars need to call DefWndControlColor * to correctly setup default scrollbar colors */ if (nBar == SB_CTL) { hBrush = GetControlBrush( pWnd, hDC, WM_CTLCOLORSCROLLBAR); if (!hBrush) hBrush = IntGetSysColorBrush(COLOR_SCROLLBAR); } else { hBrush = DefWndControlColor(hDC, CTLCOLOR_SCROLLBAR); } hSaveBrush = NtGdiSelectBrush(hDC, hBrush); /* Calculate the scroll rectangle */ if (Vertical) { Rect.top = ScrollBarInfo->rcScrollBar.top + ScrollBarInfo->dxyLineButton; Rect.bottom = ScrollBarInfo->rcScrollBar.bottom - ScrollBarInfo->dxyLineButton; Rect.left = ScrollBarInfo->rcScrollBar.left; Rect.right = ScrollBarInfo->rcScrollBar.right; } else { Rect.top = ScrollBarInfo->rcScrollBar.top; Rect.bottom = ScrollBarInfo->rcScrollBar.bottom; Rect.left = ScrollBarInfo->rcScrollBar.left + ScrollBarInfo->dxyLineButton; Rect.right = ScrollBarInfo->rcScrollBar.right - ScrollBarInfo->dxyLineButton; } /* Draw the scroll rectangles and thumb */ if (!ScrollBarInfo->xyThumbBottom) { NtGdiPatBlt(hDC, Rect.left, Rect.top, Rect.right - Rect.left, Rect.bottom - Rect.top, PATCOPY); /* Cleanup and return */ NtGdiSelectBrush(hDC, hSaveBrush); return; } ThumbTop -= ScrollBarInfo->dxyLineButton; if (ScrollBarInfo->dxyLineButton) { if (Vertical) { if (ThumbSize) { NtGdiPatBlt(hDC, Rect.left, Rect.top, Rect.right - Rect.left, ThumbTop, TopSelected ? BLACKNESS : PATCOPY); Rect.top += ThumbTop; NtGdiPatBlt(hDC, Rect.left, Rect.top + ThumbSize, Rect.right - Rect.left, Rect.bottom - Rect.top - ThumbSize, BottomSelected ? BLACKNESS : PATCOPY); Rect.bottom = Rect.top + ThumbSize; } else { if (ThumbTop) { NtGdiPatBlt(hDC, Rect.left, ScrollBarInfo->dxyLineButton, Rect.right - Rect.left, Rect.bottom - Rect.top, PATCOPY); } } } else { if (ThumbSize) { NtGdiPatBlt(hDC, Rect.left, Rect.top, ThumbTop, Rect.bottom - Rect.top, TopSelected ? BLACKNESS : PATCOPY); Rect.left += ThumbTop; NtGdiPatBlt(hDC, Rect.left + ThumbSize, Rect.top, Rect.right - Rect.left - ThumbSize, Rect.bottom - Rect.top, BottomSelected ? BLACKNESS : PATCOPY); Rect.right = Rect.left + ThumbSize; } else { if (ThumbTop) { NtGdiPatBlt(hDC, ScrollBarInfo->dxyLineButton, Rect.top, Rect.right - Rect.left, Rect.bottom - Rect.top, PATCOPY); } } } } /* Draw the thumb */ if (ThumbSize) DrawEdge(hDC, &Rect, EDGE_RAISED, BF_RECT | BF_MIDDLE); /* Cleanup */ NtGdiSelectBrush(hDC, hSaveBrush); }