Author: fireball
Date: Fri Jan 21 17:19:57 2011
New Revision: 50453
URL:
http://svn.reactos.org/svn/reactos?rev=50453&view=rev
Log:
- Change DrawFocusRect to use PatBlt instead of alternate pen, as it's done in trunk.
It looks like earlier Windows also used PatBlt for this purpose, and even Wine itself
hints that it should be done this way. Fixes bug #5280.
Modified:
branches/arwinss/reactos/dll/win32/user32/uitools.c
Modified: branches/arwinss/reactos/dll/win32/user32/uitools.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/user3…
==============================================================================
--- branches/arwinss/reactos/dll/win32/user32/uitools.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/user32/uitools.c [iso-8859-1] Fri Jan 21 17:19:57
2011
@@ -1493,31 +1493,37 @@
/***********************************************************************
* DrawFocusRect (USER32.@)
- *
- * FIXME: PatBlt(PATINVERT) with background brush.
- */
-BOOL WINAPI DrawFocusRect( HDC hdc, const RECT* rc )
-{
- HBRUSH hOldBrush;
- HPEN hOldPen, hNewPen;
- INT oldDrawMode, oldBkMode;
- LOGBRUSH lb;
-
- hOldBrush = SelectObject(hdc, GetStockObject(NULL_BRUSH));
- lb.lbStyle = BS_SOLID;
- lb.lbColor = GetSysColor(COLOR_WINDOWTEXT);
- hNewPen = ExtCreatePen(PS_COSMETIC|PS_ALTERNATE, 1, &lb, 0, NULL);
- hOldPen = SelectObject(hdc, hNewPen);
- oldDrawMode = SetROP2(hdc, R2_XORPEN);
- oldBkMode = SetBkMode(hdc, TRANSPARENT);
-
- Rectangle(hdc, rc->left, rc->top, rc->right, rc->bottom);
-
- SetBkMode(hdc, oldBkMode);
- SetROP2(hdc, oldDrawMode);
- SelectObject(hdc, hOldPen);
- DeleteObject(hNewPen);
- SelectObject(hdc, hOldBrush);
+ */
+BOOL WINAPI DrawFocusRect( HDC hdc, const RECT* rect )
+{
+ static HBRUSH hFocusRectBrush = NULL;
+ HGDIOBJ OldObj;
+ UINT cx, cy;
+
+ if(!hFocusRectBrush)
+ {
+ static HBITMAP hFocusPattern = NULL;
+ const DWORD Pattern[4] = {0x5555AAAA, 0x5555AAAA, 0x5555AAAA, 0x5555AAAA};
+
+ hFocusPattern = CreateBitmap(8, 8, 1, 1, Pattern);
+ hFocusRectBrush = CreatePatternBrush(hFocusPattern);
+ }
+
+ SystemParametersInfoW(SPI_GETFOCUSBORDERWIDTH, 0, &cx, 0);
+ SystemParametersInfoW(SPI_GETFOCUSBORDERHEIGHT, 0, &cy, 0);
+
+ OldObj = SelectObject(hdc, hFocusRectBrush);
+
+ /* top */
+ PatBlt(hdc, rect->left, rect->top, rect->right - rect->left, cy,
PATINVERT);
+ /* bottom */
+ PatBlt(hdc, rect->left, rect->bottom - cy, rect->right - rect->left, cy,
PATINVERT);
+ /* left */
+ PatBlt(hdc, rect->left, rect->top + cy, cx, rect->bottom - rect->top - (2
* cy), PATINVERT);
+ /* right */
+ PatBlt(hdc, rect->right - cx, rect->top + cy, cx, rect->bottom -
rect->top - (2 * cy), PATINVERT);
+
+ SelectObject(hdc, OldObj);
return TRUE;
}