Attempt to paint the checkbox and radio buttons better.
diff --git a/controls/button.c b/controls/button.c
index 747b732..671bb11 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -759,10 +759,24 @@
if (wndPtr->dwStyle & WS_DISABLED) state |= DFCS_INACTIVE;
+ /* rbox must have the correct height */
+ delta = rbox.bottom - rbox.top - checkBoxHeight;
+ if (delta > 0)
+ {
+ int ofs = (abs(delta) / 2);
+ rbox.bottom -= ofs + 1;
+ rbox.top = rbox.bottom - checkBoxHeight;
+ }
+ else if (delta < 0)
+ {
+ int ofs = (abs(delta) / 2);
+ rbox.top -= ofs + 1;
+ rbox.bottom = rbox.top + checkBoxHeight;
+ }
+
DrawFrameControl( hDC, &rbox, DFC_BUTTON, state );
}
-
if( textlen && action != ODA_SELECT )
{
if (wndPtr->dwStyle & WS_DISABLED &&
diff --git a/controls/uitools.c b/controls/uitools.c
index 4f514df..c9d0657 100644
--- a/controls/uitools.c
+++ b/controls/uitools.c
@@ -705,13 +705,12 @@
* however there because MS uses a TrueType font (Marlett) to draw
* the buttons.
*/
-#define DFC_CHECKPOINTSMAX 6
static BOOL UITOOLS95_DFC_ButtonCheck(HDC dc, LPRECT r, UINT uFlags)
{
- RECT myr;
- int SmallDiam = UITOOLS_MakeSquareRect(r, &myr);
+ RECT myr, bar;
UINT flags = BF_RECT | BF_ADJUST;
+ UITOOLS_MakeSquareRect(r, &myr);
if(uFlags & DFCS_FLAT) flags |= BF_FLAT;
else if(uFlags & DFCS_MONO) flags |= BF_MONO;
@@ -729,34 +728,20 @@
if(uFlags & DFCS_CHECKED)
{
- POINT CheckPoints[DFC_CHECKPOINTSMAX];
- int i;
- HBRUSH hbsave;
- HPEN hpsave;
+ int i, k;
+ i = (uFlags & DFCS_INACTIVE) || (uFlags & 0xff) == DFCS_BUTTON3STATE ?
+ COLOR_BTNSHADOW : COLOR_WINDOWTEXT;
- /* FIXME: This comes very close to M$'s checkmark, but not */
- /* exactly... When small or large there is a few pixels */
- /* shift. Not bad, but could be better :) */
- UITOOLS_MakeSquareRect(r, &myr);
- CheckPoints[0].x = myr.left + 253*SmallDiam/1000;
- CheckPoints[0].y = myr.top + 345*SmallDiam/1000;
- CheckPoints[1].x = myr.left + 409*SmallDiam/1000;
- CheckPoints[1].y = CheckPoints[0].y + (CheckPoints[1].x-CheckPoints[0].x);
- CheckPoints[2].x = myr.left + 690*SmallDiam/1000;
- CheckPoints[2].y = CheckPoints[1].y - (CheckPoints[2].x-CheckPoints[1].x);
- CheckPoints[3].x = CheckPoints[2].x;
- CheckPoints[3].y = CheckPoints[2].y + 3*SmallDiam/16;
- CheckPoints[4].x = CheckPoints[1].x;
- CheckPoints[4].y = CheckPoints[1].y + 3*SmallDiam/16;
- CheckPoints[5].x = CheckPoints[0].x;
- CheckPoints[5].y = CheckPoints[0].y + 3*SmallDiam/16;
-
- i = (uFlags & DFCS_INACTIVE) || (uFlags & 0xff) == DFCS_BUTTON3STATE ? COLOR_BTNSHADOW : COLOR_WINDOWTEXT;
- hbsave = (HBRUSH)SelectObject(dc, GetSysColorBrush(i));
- hpsave = (HPEN)SelectObject(dc, GetSysColorPen(i));
- Polygon(dc, CheckPoints, DFC_CHECKPOINTSMAX);
- SelectObject(dc, hpsave);
- SelectObject(dc, hbsave);
+ /* draw 7 bars, with h=3w to form the check */
+ bar.left = myr.left;
+ bar.top = myr.top + 2;
+ for (k = 0; k < 7; k++) {
+ bar.left = bar.left + 1;
+ bar.top = (k < 3) ? bar.top + 1 : bar.top - 1;
+ bar.bottom = bar.top + 3;
+ bar.right = bar.left + 1;
+ FillRect(dc, &bar, GetSysColorBrush(i));
+ }
}
return TRUE;
}
@@ -779,7 +764,6 @@
int BorderShrink = SmallDiam / 16;
HPEN hpsave;
HBRUSH hbsave;
- int xe, ye;
int xc, yc;
if(BorderShrink < 1) BorderShrink = 1;
@@ -789,9 +773,6 @@
FillRect(dc, r, (HBRUSH)GetStockObject(BLACK_BRUSH));
}
- xe = myr.left;
- ye = myr.top + SmallDiam - SmallDiam/2;
-
xc = myr.left + SmallDiam - SmallDiam/2;
yc = myr.top + SmallDiam - SmallDiam/2;
@@ -805,7 +786,7 @@
if((uFlags & 0xff) == DFCS_BUTTONRADIOMASK)
{
hbsave = (HBRUSH)SelectObject(dc, GetStockObject(BLACK_BRUSH));
- Pie(dc, myr.left, myr.top, myr.right, myr.bottom, xe, ye, xe, ye);
+ Ellipse(dc, myr.left, myr.top, myr.right, myr.bottom);
SelectObject(dc, hbsave);
}
else
@@ -814,7 +795,7 @@
{
hpsave = (HPEN)SelectObject(dc, GetSysColorPen(COLOR_WINDOWFRAME));
hbsave = (HBRUSH)SelectObject(dc, GetSysColorBrush(COLOR_WINDOWFRAME));
- Pie(dc, myr.left, myr.top, myr.right, myr.bottom, xe, ye, xe, ye);
+ Ellipse(dc, myr.left, myr.top, myr.right, myr.bottom);
SelectObject(dc, hbsave);
SelectObject(dc, hpsave);
}
@@ -822,11 +803,11 @@
{
hpsave = (HPEN)SelectObject(dc, GetSysColorPen(COLOR_BTNHIGHLIGHT));
hbsave = (HBRUSH)SelectObject(dc, GetSysColorBrush(COLOR_BTNHIGHLIGHT));
- Pie(dc, myr.left, myr.top, myr.right, myr.bottom, myr.left-1, myr.bottom, myr.right-1, myr.top);
+ Pie(dc, myr.left, myr.top, myr.right+1, myr.bottom+1, myr.left-1, myr.bottom, myr.right+1, myr.top);
SelectObject(dc, GetSysColorPen(COLOR_BTNSHADOW));
SelectObject(dc, GetSysColorBrush(COLOR_BTNSHADOW));
- Pie(dc, myr.left, myr.top, myr.right, myr.bottom, myr.right+1, myr.top, myr.left+1, myr.bottom);
+ Pie(dc, myr.left, myr.top, myr.right+1, myr.bottom+1, myr.right+1, myr.top, myr.left-1, myr.bottom);
myr.left += BorderShrink;
myr.right -= BorderShrink;
@@ -835,11 +816,11 @@
SelectObject(dc, GetSysColorPen(COLOR_3DLIGHT));
SelectObject(dc, GetSysColorBrush(COLOR_3DLIGHT));
- Pie(dc, myr.left, myr.top, myr.right, myr.bottom, myr.left-1, myr.bottom, myr.right-1, myr.top);
+ Pie(dc, myr.left, myr.top, myr.right+1, myr.bottom+1, myr.left-1, myr.bottom, myr.right+1, myr.top);
SelectObject(dc, GetSysColorPen(COLOR_3DDKSHADOW));
SelectObject(dc, GetSysColorBrush(COLOR_3DDKSHADOW));
- Pie(dc, myr.left, myr.top, myr.right, myr.bottom, myr.right+1, myr.top, myr.left+1, myr.bottom);
+ Pie(dc, myr.left, myr.top, myr.right+1, myr.bottom+1, myr.right+1, myr.top, myr.left-1, myr.bottom);
SelectObject(dc, hbsave);
SelectObject(dc, hpsave);
}
@@ -852,7 +833,7 @@
i= !(uFlags & (DFCS_INACTIVE|DFCS_PUSHED)) ? COLOR_WINDOW : COLOR_BTNFACE;
hpsave = (HPEN)SelectObject(dc, GetSysColorPen(i));
hbsave = (HBRUSH)SelectObject(dc, GetSysColorBrush(i));
- Pie(dc, myr.left, myr.top, myr.right, myr.bottom, xe, ye, xe, ye);
+ Ellipse(dc, myr.left, myr.top, myr.right, myr.bottom);
SelectObject(dc, hbsave);
SelectObject(dc, hpsave);
}
@@ -869,7 +850,7 @@
i = uFlags & DFCS_INACTIVE ? COLOR_BTNSHADOW : COLOR_WINDOWTEXT;
hbsave = (HBRUSH)SelectObject(dc, GetSysColorBrush(i));
hpsave = (HPEN)SelectObject(dc, GetSysColorPen(i));
- Pie(dc, myr.left, myr.top, myr.right, myr.bottom, xe, ye, xe, ye);
+ Ellipse(dc, myr.left, myr.top, myr.right, myr.bottom);
SelectObject(dc, hpsave);
SelectObject(dc, hbsave);
}