Author: mkupfer
Date: Sun Mar 8 17:08:28 2009
New Revision: 39906
URL:
http://svn.reactos.org/svn/reactos?rev=39906&view=rev
Log:
- continue "marletting"
- use marlett font for caption buttons
Modified:
trunk/reactos/dll/win32/user32/windows/draw.c
Modified: trunk/reactos/dll/win32/user32/windows/draw.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/d…
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/draw.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/windows/draw.c [iso-8859-1] Sun Mar 8 17:08:28 2009
@@ -845,226 +845,74 @@
return FALSE;
}
-/* Ported from WINE20020904 */
-/* Draw caption buttons (win95), coming from DrawFrameControl() */
static BOOL UITOOLS95_DrawFrameCaption(HDC dc, LPRECT r, UINT uFlags)
{
- POINT Line1[10];
- POINT Line2[10];
- int Line1N;
- int Line2N;
+ int colorIdx = uFlags & DFCS_INACTIVE ? COLOR_BTNSHADOW : COLOR_BTNTEXT;
+ LOGFONT lf;
+ HFONT hFont, hOldFont;
+ COLORREF clrsave;
RECT myr;
- int SmallDiam = UITOOLS_MakeSquareRect(r, &myr)-2;
- int i;
- HBRUSH hbsave;
- HPEN hpsave;
- HFONT hfsave, hf;
- int colorIdx = uFlags & DFCS_INACTIVE ? COLOR_BTNSHADOW : COLOR_BTNTEXT;
- int xc = (myr.left+myr.right)/2;
- int yc = (myr.top+myr.bottom)/2;
- int edge, move;
- char str[2] = "?";
- UINT alignsave;
- int bksave;
- COLORREF clrsave;
- SIZE size;
-
+ INT bkmode;
+ TCHAR Symbol;
+ switch(uFlags & 0xff)
+ {
+ case DFCS_CAPTIONCLOSE:
+ Symbol = 'r';
+ break;
+ case DFCS_CAPTIONHELP:
+ Symbol = 's';
+ break;
+ case DFCS_CAPTIONMIN:
+ Symbol = '0';
+ break;
+ case DFCS_CAPTIONMAX:
+ Symbol = '1';
+ break;
+ case DFCS_CAPTIONRESTORE:
+ Symbol = '2';
+ break;
+ default:
+ return FALSE;
+ }
if(uFlags & DFCS_PUSHED)
IntDrawRectEdge(dc,r,EDGE_SUNKEN, BF_RECT | BF_MIDDLE | BF_SOFT);
else
IntDrawRectEdge(dc,r,BDR_RAISEDINNER | BDR_RAISEDOUTER, BF_RECT |
BF_SOFT | BF_MIDDLE);
-
- switch(uFlags & 0xff)
- {
- case DFCS_CAPTIONCLOSE:
- {
- /* The "X" is made by drawing a series of lines.
- * The number of lines drawn depends on the size
- * of the bounding rect. e.g. For a 6x5 inside rect,
- * two lines are drawn from top-left to bottom-right,
- * and two lines from top-right to bottom-left.
- *
- * 0 1 2 3 4 5 0 1 2 3 4 5
- * 1 * * * *
- * 2 * * * *
- * 3 * * * *
- * 4 * * * *
- *
- * Drawing one line for every 6 pixels in width
- * seems to provide the best proportions.
- */
-
- POINT start, oldPos;
- INT width = myr.right - (++myr.left) - 5;
- INT height = (--myr.bottom) - myr.top - 6;
- INT numLines = (width / 6) + 1;
-
- hpsave = (HPEN)SelectObject(dc, GetSysColorPen(colorIdx));
-
- start.x = myr.left + 2;
- start.y = myr.top + 2;
-
- if (width < 6)
- height = width;
- else
- start.y++;
-
- if (uFlags & DFCS_PUSHED)
- {
- start.x++;
- start.y++;
- }
-
- /* now use the width of each line */
- width -= numLines - 1;
-
- for (i = 0; i < numLines; i++)
- {
- MoveToEx(dc, start.x + i, start.y, &oldPos);
- LineTo(dc, start.x + i + width, start.y + height);
-
- MoveToEx(dc, start.x + i, start.y + height - 1, &oldPos);
- LineTo(dc, start.x + i + width, start.y - 1);
- }
-
- SelectObject(dc, hpsave);
- return TRUE;
- }
-
- case DFCS_CAPTIONHELP:
- /* This one breaks the flow */
- /* FIXME: We need the Marlett font in order to get this right. */
-
- hf = CreateFontA(-SmallDiam, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
- ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
- DEFAULT_QUALITY, FIXED_PITCH|FF_DONTCARE,
"System");
- alignsave = SetTextAlign(dc, TA_TOP|TA_LEFT);
- bksave = SetBkMode(dc, TRANSPARENT);
- clrsave = GetTextColor(dc);
- hfsave = (HFONT)SelectObject(dc, hf);
- GetTextExtentPoint32A(dc, str, 1, &size);
-
- if(uFlags & DFCS_INACTIVE)
- {
- SetTextColor(dc, GetSysColor(COLOR_BTNHIGHLIGHT));
- TextOutA(dc, xc-size.cx/2+1, yc-size.cy/2+1, str, 1);
- }
- SetTextColor(dc, GetSysColor(colorIdx));
- TextOutA(dc, xc-size.cx/2, yc-size.cy/2, str, 1);
-
- SelectObject(dc, hfsave);
- SetTextColor(dc, clrsave);
- SetBkMode(dc, bksave);
- SetTextAlign(dc, alignsave);
- DeleteObject(hf);
- return TRUE;
-
- case DFCS_CAPTIONMIN:
- /*
- * If the button goes from x 0 -- w-1, the leftmost point of the
- * minimize line always starts at x>=4.
- */
- {
- const int width = myr.right - myr.left;
- const int xInsetPixels = (width>=9 ? width - 9 : 0) / 8 + 4;
- Line1[0].x = Line1[3].x = myr.left + xInsetPixels;
- Line1[1].x = Line1[2].x = Line1[0].x + 372*SmallDiam/750;
- Line1[0].y = Line1[1].y = myr.top + 563*SmallDiam/750+1;
- Line1[2].y = Line1[3].y = Line1[0].y + 92*SmallDiam/750;
- Line1N = 4;
- Line2N = 0;
- }
- break;
-
- case DFCS_CAPTIONMAX:
- edge = 47*SmallDiam/750;
- Line1[0].x = Line1[5].x = myr.left + 57*SmallDiam/750+3;
- Line1[0].y = Line1[1].y = myr.top + 143*SmallDiam/750+1;
- Line1[1].x = Line1[2].x = Line1[0].x + 562*SmallDiam/750;
- Line1[5].y = Line1[4].y = Line1[0].y + 93*SmallDiam/750;
- Line1[2].y = Line1[3].y = Line1[0].y + 513*SmallDiam/750;
- Line1[3].x = Line1[4].x = Line1[1].x - edge;
-
- Line2[0].x = Line2[5].x = Line1[0].x;
- Line2[3].x = Line2[4].x = Line1[1].x;
- Line2[1].x = Line2[2].x = Line1[0].x + edge;
- Line2[0].y = Line2[1].y = Line1[0].y;
- Line2[4].y = Line2[5].y = Line1[2].y;
- Line2[2].y = Line2[3].y = Line1[2].y - edge;
- Line1N = 6;
- Line2N = 6;
- break;
-
- case DFCS_CAPTIONRESTORE:
- /* FIXME: this one looks bad at small sizes < 15x15 :( */
- edge = 47*SmallDiam/750;
- move = 420*SmallDiam/750;
- Line1[0].x = Line1[9].x = myr.left + 198*SmallDiam/750+2;
- Line1[0].y = Line1[1].y = myr.top + 169*SmallDiam/750+1;
- Line1[6].y = Line1[7].y = Line1[0].y + 93*SmallDiam/750;
- Line1[7].x = Line1[8].x = Line1[0].x + edge;
- Line1[1].x = Line1[2].x = Line1[0].x + move;
- Line1[5].x = Line1[6].x = Line1[1].x - edge;
- Line1[9].y = Line1[8].y = Line1[0].y + 187*SmallDiam/750;
- Line1[2].y = Line1[3].y = Line1[0].y + 327*SmallDiam/750;
- Line1[4].y = Line1[5].y = Line1[2].y - edge;
- Line1[3].x = Line1[4].x = Line1[2].x - 140*SmallDiam/750;
-
- Line2[1].x = Line2[2].x = Line1[3].x;
- Line2[7].x = Line2[8].x = Line2[1].x - edge;
- Line2[0].x = Line2[9].x = Line2[3].x = Line2[4].x = Line2[1].x - move;
- Line2[5].x = Line2[6].x = Line2[0].x + edge;
- Line2[0].y = Line2[1].y = Line1[9].y + 93*SmallDiam/750;
- Line2[4].y = Line2[5].y = Line2[8].y = Line2[9].y = Line2[0].y +
93*SmallDiam/750;
- Line2[2].y = Line2[3].y = Line2[0].y + 327*SmallDiam/750;
- Line2[6].y = Line2[7].y = Line2[2].y - edge;
- Line1N = 10;
- Line2N = 10;
- break;
-
- default:
- return FALSE;
- }
-
- /* Here the drawing takes place */
+ ZeroMemory(&lf, sizeof(LOGFONT));
+ UITOOLS_MakeSquareRect(r, &myr);
+ myr.left += 1;
+ myr.top += 1;
+ myr.right -= 1;
+ myr.bottom -= 1;
+ if(uFlags & DFCS_PUSHED)
+ OffsetRect(&myr,1,1);
+ lf.lfHeight = myr.bottom - myr.top;
+ lf.lfWidth = 0;
+ lf.lfWeight = FW_NORMAL;
+ lf.lfCharSet = DEFAULT_CHARSET;
+ lstrcpy(lf.lfFaceName, TEXT("Marlett"));
+ hFont = CreateFontIndirect(&lf);
+ /* save font and text color */
+ hOldFont = SelectObject(dc, hFont);
+ clrsave = GetTextColor(dc);
+ bkmode = GetBkMode(dc);
+ /* set color and drawing mode */
+ SetBkMode(dc, TRANSPARENT);
if(uFlags & DFCS_INACTIVE)
{
- /* If we have an inactive button, then you see a shadow */
- hbsave = (HBRUSH)SelectObject(dc, GetSysColorBrush(COLOR_BTNHIGHLIGHT));
- hpsave = (HPEN)SelectObject(dc, GetSysColorPen(COLOR_BTNHIGHLIGHT));
- Polygon(dc, Line1, Line1N);
- if(Line2N > 0)
- Polygon(dc, Line2, Line2N);
- SelectObject(dc, hpsave);
- SelectObject(dc, hbsave);
- }
-
- /* Correct for the shadow shift */
- if (!(uFlags & DFCS_PUSHED))
- {
- for(i = 0; i < Line1N; i++)
- {
- Line1[i].x--;
- Line1[i].y--;
- }
- for(i = 0; i < Line2N; i++)
- {
- Line2[i].x--;
- Line2[i].y--;
- }
- }
-
- /* Make the final picture */
- hbsave = (HBRUSH)SelectObject(dc, GetSysColorBrush(colorIdx));
- hpsave = (HPEN)SelectObject(dc, GetSysColorPen(colorIdx));
-
- Polygon(dc, Line1, Line1N);
- if(Line2N > 0)
- Polygon(dc, Line2, Line2N);
- SelectObject(dc, hpsave);
- SelectObject(dc, hbsave);
-
+ /* draw shadow */
+ SetTextColor(dc, GetSysColor(COLOR_BTNHIGHLIGHT));
+ TextOut(dc, myr.left + 1, myr.top + 1, &Symbol, 1);
+ }
+ SetTextColor(dc, GetSysColor(colorIdx));
+ /* draw selected symbol */
+ TextOut(dc, myr.left, myr.top, &Symbol, 1);
+ /* restore previous settings */
+ SetTextColor(dc, clrsave);
+ SelectObject(dc, hOldFont);
+ SetBkMode(dc, bkmode);
+ DeleteObject(hFont);
return TRUE;
}