Release 940912

Thu Aug 25 15:24:36 EDT 1994            <jrichard@cs.uml.edu>

        * [include/win.h]
        Removed seperate X window for icon, added icon width,height.

	* [include/windows.h]
	Commented out the old SW_xxx emum and added defines since
	they aren't enumerated.

	* [windows/dce.c]
        Removed some older IsIconic checks from GetDCEx(), functionality
        is now in nonclient and generic wine window handling code.
        Lots of thanks to Alexandre Julliard all the hints and
        help...

        * [windows/defwnd.c]
        Removed call to NC_HandleNCPaintIcon() under case WM_PAINTICON,
        WM_PAINTICON now calls NC_HandleNCPaint.  

        * [windows/event.c]
        Removed IsIconic checks.

        * [windows/icon.c]
        Removed everything in this file for now... could be used later.
        Icon functionality is now handled by the generic wine windows
        handling functions.
        
        * [windows/mdi.c]
        Added a ShowWindow in MDIRestoreChild().  MDI child windows now
        show up when deiconified.  Removed IsIconic checks.

        * [windows/message.c]
        Removed old icon routines from hardware_event().

        * [windows/nonclient.c]
        Changed NC_HandleNCCalcSize() so it doesn't change the size
        of an icon window.  Made NC_InternalNCHitTest() on an Iconic
        window always return HTCAPTION.  Made NC_HandleNCLButtonDblClk()
        on an Iconic window always send a SC_RESTORE message.

        * [windows/painting.c]
        Changed RedrawWindow() so it doesn't redraw an iconic window
        unless it has to (no icon for this class).
        
        * [windows/win.c]
        Removed creation of seperate icon window from CreateWindowEx().
        
        * [windows/winpos.c]
        Added saving and restoring of window rectangle during
        iconification/deiconification to ShowWindow().  Added
	functions to recursively hide and show children... called
	by ShowWindow during iconification/deiconification.

Sat, 27 Aug 1994 18:47:34 +0100 (MET DST)  micky@marie.physik.tu-berlin.de (Michael Patra)

        * [windows/message.c]
        WaitMessage(): Fixed handling of wm_timer-messages

        * [miscemu/int21.c]
        FindNextFCB(): Rewritten to support other functions than just
        returning the volume label

	* [misc/file.c]
	OpenFile(): Fix in handling of OF_CREATE

Wed Aug 24 19:40:42 PDT 1994  Andrew Lagodzinski  (andrew@netcom.com)

	* [if1632/user.spec]
	Added SetParent.

	* [windows/win.c]
	Added SetParent.

Fri Aug 19 16:37:00 1994  Thomas Sandford <t.d.g.sandford@bradford.ac.uk>

	* [loader/selector.c]
	Many changes throughout file to correct handling of shared memory
	function return codes. FreeBSD and SunOS shm functions return
	-1 not 0 on error. If Linux is different, these changes
	will have to be backed out.
	CleanupSelectors(): this is a new (internal) call to free
	up all selectors (and shm handles/memory) for use on exit.

	* [include/segmem.h]
	Change comment to reflect new use of shm_key

	* [misc/main.c]
	called_at_exit(): add call to CleanupSelectors()

Mon Aug 22 18:19:25 1994  Alexandre Julliard  (julliard@lamisun.epfl.ch)

	* [controls/button.c]
	Use OBM_CHECKBOXES to draw check boxes with correct colors.
	Fixed bug with WM_SETTEXT handling.
	A few drawing optimisations.

	* [controls/menu.c]
	Implemented correct \t and \a handling in menu items.
	Implemented help items (flush right) on menu bar.
	Added WM_ENTERMENULOOP and WM_EXITMENULOOP messages.

	* [controls/static.c]
	Fixed SS_ICON controls and implemented STM_SETICON message
	handling.

	* [controls/widget.c]
	Set cursor to IDC_ARROW for built-in classes.

	* [include/options.h] [misc/main.c]
	Backing store is now off by default.

	* [objects/region.c]
	Use X regions for rectangle and polygon regions: *major* speed
	improvement.

	* [windows/dialog.c]
	Fixed the fix for integer ids in controls. SS_ICON controls in
	dialogs should work now.
	Implemented DS_ABSALIGN style.

	* [windows/graphics.c]
	Implemented InvertRgn().
	New internal function GRAPH_DrawBitmap() to draw bitmaps faster
	than with CreateCompatibleDC() + BitBlt().

	* [windows/message.c]
	Determining the window for a mouse message is now done at
	GetMessage() time.
	Modified PeekMessage() handling to avoid needlessly flushing the
	output queue.

	* [windows/timer.c]
	Check for restart of a timer (SetTimer call with the same hwnd and
	id than an existing timer).
diff --git a/controls/button.c b/controls/button.c
index a5d3946..7e2d99e 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -12,15 +12,19 @@
 #include "user.h"
 #include "syscolor.h"
 
-LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam);
 
-static BOOL pressed;
+LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam);
 
 #define NOTIFY_PARENT(hWndCntrl, wNotifyCode) \
 	SendMessage(GetParent(hWndCntrl), WM_COMMAND, \
 		GetDlgCtrlID(hWndCntrl), MAKELPARAM(hWndCntrl, wNotifyCode));
 #define DIM(array)	((sizeof array)/(sizeof array[0]))
 
+extern BOOL GRAPH_DrawBitmap( HDC hdc, HBITMAP hbitmap, int xdest, int ydest,
+			      int xsrc, int ysrc, int width, int height,
+			      int rop );              /* windows/graphics.c */
+extern void DEFWND_SetText( HWND hwnd, LPSTR text );  /* windows/defwnd.c */
+
 static LONG PB_Paint(HWND hWnd);
 static LONG PB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam);
 static LONG PB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam);
@@ -54,136 +58,60 @@
 
 typedef struct
 {
-    LONG (*paintfn)();
-    LONG (*lButtonDownfn)();
-    LONG (*lButtonUpfn)();
-    LONG (*lButtonDblClkfn)();
-    LONG (*killFocusfn)();
-    LONG (*setCheckfn)();
-    LONG (*getCheckfn)();
+    LONG (*paintfn)( HWND );
+    LONG (*lButtonDownfn)( HWND, WORD, LONG );
+    LONG (*lButtonUpfn)( HWND, WORD, LONG );
+    LONG (*lButtonDblClkfn)( HWND, WORD, LONG );
+    LONG (*killFocusfn)( HWND );
+    LONG (*setCheckfn)( HWND, WORD );
+    LONG (*getCheckfn)( HWND );
 } BTNFN;
 
 #define MAX_BTN_TYPE  12
 
 static BTNFN btnfn[MAX_BTN_TYPE] =
 {
-    { 
-	(LONG(*)())PB_Paint,                       /* BS_PUSHBUTTON */
-	(LONG(*)())PB_LButtonDown,
-	(LONG(*)())PB_LButtonUp,
-	(LONG(*)())PB_LButtonDblClk,
-	(LONG(*)())PB_KillFocus,
-	(LONG(*)())NULL,
-	(LONG(*)())NULL
-    },
-    { 
-	(LONG(*)())PB_Paint,                       /* BS_DEFPUSHBUTTON */
-	(LONG(*)())PB_LButtonDown,
-	(LONG(*)())PB_LButtonUp,
-	(LONG(*)())PB_LButtonDblClk,
-	(LONG(*)())PB_KillFocus,
-	(LONG(*)())NULL,
-	(LONG(*)())NULL
-    },
-    {
-	(LONG(*)())CB_Paint,                       /* BS_CHECKBOX */
-	(LONG(*)())CB_LButtonDown,
-	(LONG(*)())CB_LButtonUp,
-	(LONG(*)())CB_LButtonDblClk,
-	(LONG(*)())CB_KillFocus,
-	(LONG(*)())CB_SetCheck,
-	(LONG(*)())CB_GetCheck
-    },
-    {
-	(LONG(*)())CB_Paint,                       /* BS_AUTOCHECKBOX */
-	(LONG(*)())CB_LButtonDown,
-	(LONG(*)())CB_LButtonUp,
-	(LONG(*)())CB_LButtonDblClk,
-	(LONG(*)())CB_KillFocus,
-	(LONG(*)())CB_SetCheck,
-	(LONG(*)())CB_GetCheck
-    },
-    {
-	(LONG(*)())RB_Paint,                       /* BS_RADIOBUTTON */
-	(LONG(*)())RB_LButtonDown,
-	(LONG(*)())RB_LButtonUp,
-	(LONG(*)())RB_LButtonDblClk,
-	(LONG(*)())RB_KillFocus,
-	(LONG(*)())RB_SetCheck,
-	(LONG(*)())RB_GetCheck
-    },
-    {
-	(LONG(*)())CB_Paint,                       /* BS_3STATE */
-	(LONG(*)())CB_LButtonDown,
-	(LONG(*)())CB_LButtonUp,
-	(LONG(*)())CB_LButtonDblClk,
-	(LONG(*)())CB_KillFocus,
-	(LONG(*)())CB_SetCheck,
-	(LONG(*)())CB_GetCheck
-    },
-    {
-	(LONG(*)())CB_Paint,                       /* BS_AUTO3STATE */
-	(LONG(*)())CB_LButtonDown,
-	(LONG(*)())CB_LButtonUp,
-	(LONG(*)())CB_LButtonDblClk,
-	(LONG(*)())CB_KillFocus,
-	(LONG(*)())CB_SetCheck,
-	(LONG(*)())CB_GetCheck
-    },
-    {
-	(LONG(*)())GB_Paint,                       /* BS_GROUPBOX */
-	(LONG(*)())NULL,
-	(LONG(*)())NULL,
-	(LONG(*)())NULL,
-	(LONG(*)())NULL,
-	(LONG(*)())NULL,
-	(LONG(*)())NULL
-    },
-    {
-	(LONG(*)())UB_Paint,                       /* BS_USERBUTTON */
-	(LONG(*)())UB_LButtonDown,
-	(LONG(*)())UB_LButtonUp,
-	(LONG(*)())NULL,
-	(LONG(*)())UB_KillFocus,
-	(LONG(*)())NULL,
-	(LONG(*)())NULL
-    },
-    {
-	(LONG(*)())RB_Paint,                       /* BS_AUTORADIOBUTTON */
-	(LONG(*)())RB_LButtonDown,
-	(LONG(*)())RB_LButtonUp,
-	(LONG(*)())RB_LButtonDblClk,
-	(LONG(*)())RB_KillFocus,
-	(LONG(*)())RB_SetCheck,
-	(LONG(*)())RB_GetCheck
-    },
-    {
-	(LONG(*)())NULL,                           /* Not defined */
-	(LONG(*)())NULL,
-	(LONG(*)())NULL,
-	(LONG(*)())NULL,
-	(LONG(*)())NULL,
-	(LONG(*)())NULL,
-	(LONG(*)())NULL
-    },
-    { 
-	(LONG(*)())OB_Paint,                       /* BS_OWNERDRAW */
-	(LONG(*)())OB_LButtonDown,
-	(LONG(*)())OB_LButtonUp,
-	(LONG(*)())NULL,
-	(LONG(*)())OB_KillFocus,
-	(LONG(*)())NULL,
-	(LONG(*)())NULL
-    },
+    /* BS_PUSHBUTTON */
+    { PB_Paint, PB_LButtonDown, PB_LButtonUp, PB_LButtonDblClk, 
+      PB_KillFocus, NULL, NULL },
+    /* BS_DEFPUSHBUTTON */
+    { PB_Paint, PB_LButtonDown, PB_LButtonUp, PB_LButtonDblClk,
+      PB_KillFocus, NULL, NULL },
+    /* BS_CHECKBOX */
+    { CB_Paint, CB_LButtonDown, CB_LButtonUp, CB_LButtonDblClk,
+      CB_KillFocus, CB_SetCheck, CB_GetCheck },
+    /* BS_AUTOCHECKBOX */
+    { CB_Paint, CB_LButtonDown, CB_LButtonUp, CB_LButtonDblClk,
+      CB_KillFocus, CB_SetCheck, CB_GetCheck },
+    /* BS_RADIOBUTTON */
+    { RB_Paint, RB_LButtonDown, RB_LButtonUp, RB_LButtonDblClk,
+      RB_KillFocus, RB_SetCheck, RB_GetCheck },
+    /* BS_3STATE */
+    { CB_Paint, CB_LButtonDown, CB_LButtonUp, CB_LButtonDblClk,
+      CB_KillFocus, CB_SetCheck, CB_GetCheck },
+    /* BS_AUTO3STATE */
+    { CB_Paint, CB_LButtonDown, CB_LButtonUp, CB_LButtonDblClk,
+      CB_KillFocus, CB_SetCheck, CB_GetCheck },
+    /* BS_GROUPBOX */
+    { GB_Paint, NULL, NULL, NULL, NULL, NULL, NULL },
+    /* BS_USERBUTTON */
+    { UB_Paint, UB_LButtonDown, UB_LButtonUp, NULL, UB_KillFocus, NULL, NULL },
+    /* BS_AUTORADIOBUTTON */
+    { RB_Paint, RB_LButtonDown, RB_LButtonUp, RB_LButtonDblClk,
+      RB_KillFocus, RB_SetCheck, RB_GetCheck },
+    /* Not defined */
+    { NULL, NULL, NULL, NULL, NULL, NULL, NULL },
+    /* BS_OWNERDRAW */
+    { OB_Paint, OB_LButtonDown, OB_LButtonUp, NULL, OB_KillFocus, NULL, NULL }
 };
 
+static HBITMAP hbitmapCheckBoxes = 0;
+static WORD checkBoxWidth = 0, checkBoxHeight = 0;
+
 
 LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
 {
 	LONG lResult = 0;
-	HDC hDC;
-	RECT rc;
-
 	WND *wndPtr = WIN_FindWndPtr(hWnd);
 	LONG style = wndPtr->dwStyle & 0x0000000F;
 
@@ -197,12 +125,20 @@
 		break;
 
 	case WM_CREATE:
+		if (!hbitmapCheckBoxes)
+		{
+		    BITMAP bmp;
+		    hbitmapCheckBoxes = LoadBitmap( 0, MAKEINTRESOURCE(OBM_CHECKBOXES) );
+		    GetObject( hbitmapCheckBoxes, sizeof(bmp), (LPSTR)&bmp );
+		    checkBoxWidth  = bmp.bmWidth / 4;
+		    checkBoxHeight = bmp.bmHeight / 3;
+		}
+		
 		if (style < 0L || style >= (LONG)DIM(btnfn))
 		    lResult = -1L;
 		else
 		{
 		    (WORD)(*(wndPtr->wExtra)) = 0;
-		    pressed = FALSE;
 		    lResult = 0L;
 		}
 		break;
@@ -227,6 +163,12 @@
 		    (btnfn[style].lButtonDblClkfn)(hWnd, wParam, lParam);
 		break;
 
+        case WM_SETTEXT:
+		DEFWND_SetText( hWnd, (LPSTR)lParam );
+		InvalidateRect( hWnd, NULL, FALSE );
+		UpdateWindow( hWnd );
+		return 0;
+
 	case WM_SETFOCUS:
 		break;
 
@@ -270,76 +212,71 @@
 
     hDC = BeginPaint(hWnd, &ps);
     GetClientRect(hWnd, &rc);
-    if (pressed)
+    if (GetCapture() == hWnd)
 	DrawPressedPushButton(hDC, hWnd, rc);
     else
 	DrawRaisedPushButton(hDC, hWnd, rc);
     EndPaint(hWnd, &ps);
+    return 0;
 }
 
 static LONG PB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam)
 {
     SetFocus(hWnd);
     SetCapture(hWnd);
-    pressed = TRUE;
     InvalidateRect(hWnd, NULL, FALSE);
     UpdateWindow(hWnd);
+    return 0;
 }
 
 static LONG PB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam)
 {
     RECT rc;
 
-    pressed = FALSE;
     ReleaseCapture();
     GetClientRect(hWnd, &rc);
     if (PtInRect(&rc, MAKEPOINT(lParam)))
 	NOTIFY_PARENT(hWnd, BN_CLICKED);
     InvalidateRect(hWnd, NULL, FALSE);
     UpdateWindow(hWnd);
+    return 0;
 }
 
 static LONG PB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam)
 {
-    RECT rc;
-
-    GetClientRect(hWnd, &rc);
-    if (PtInRect(&rc, MAKEPOINT(lParam)))
-	NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED);
+    NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED);
+    return 0;
 }
 
 static LONG PB_KillFocus(HWND hWnd)
 {
-    pressed = FALSE;
     InvalidateRect(hWnd, NULL, FALSE);
     UpdateWindow(hWnd);
+    return 0;
 }
 
 static void DrawRaisedPushButton(HDC hDC, HWND hButton, RECT rc)
 {
 	HPEN hOldPen;
 	HBRUSH hOldBrush;
-	HRGN rgn1, rgn2, rgn;
+	HRGN rgn;
 	int len;
-	static char text[50+1];
+	char *text;
 	POINT points[6];
 	DWORD dwTextSize;
 	int delta;
 	TEXTMETRIC tm;
+	WND *wndPtr = WIN_FindWndPtr( hButton );
 
 	hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowFrame);
 	hOldBrush = (HBRUSH)SelectObject(hDC, sysColorObjects.hbrushBtnFace);
 	SetBkMode(hDC, TRANSPARENT);
-
-	rgn = CreateRectRgn(0, 0,  0,  0);
-	rgn1 = CreateRectRgn(rc.left, rc.top, rc.right, rc.bottom);
-
-	SendMessage(GetParent(hButton), WM_CTLCOLOR, (WORD)hDC,
-		    MAKELPARAM(hButton, CTLCOLOR_BTN));
+	SetTextColor( hDC, GetSysColor(COLOR_BTNTEXT) );
 	Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
 
 	/* draw button label, if any: */
-	len = GetWindowText(hButton, text, sizeof text);
+	text = USER_HEAP_ADDR( wndPtr->hText );
+	len = strlen(text);
 	if (len >= 1) {
 		rc.left--;	rc.bottom--;
 		DrawText(hDC, text, len, &rc,
@@ -359,9 +296,8 @@
 	points[4].y = rc.top+1;
 	points[5].x = rc.left+2;
 	points[5].y = rc.top+1;
-	rgn2 = CreatePolygonRgn(points, DIM(points), ALTERNATE);
-	CombineRgn(rgn, rgn1, rgn2, RGN_AND);
-	FillRgn(hDC, rgn2, sysColorObjects.hbrushBtnHighlight);
+	rgn = CreatePolygonRgn(points, DIM(points), ALTERNATE);
+	FillRgn(hDC, rgn, sysColorObjects.hbrushBtnHighlight);
 
 	/* draw button shadow: */
 	points[0].x = rc.left+2;
@@ -376,9 +312,8 @@
 	points[4].y = rc.top;
 	points[5].x = rc.right-1;
 	points[5].y = rc.bottom;
-	rgn2 = CreatePolygonRgn(points, DIM(points), ALTERNATE);
-	CombineRgn(rgn, rgn1, rgn2, RGN_AND);
-	FillRgn(hDC, rgn2, sysColorObjects.hbrushBtnShadow);
+	rgn = CreatePolygonRgn(points, DIM(points), ALTERNATE);
+	FillRgn(hDC, rgn, sysColorObjects.hbrushBtnShadow);
 
 	/* do we have the focus? */
 	if (len >= 1 && GetFocus() == hButton) {
@@ -393,8 +328,6 @@
 
 	SelectObject(hDC, (HANDLE)hOldPen);
 	SelectObject(hDC, (HANDLE)hOldBrush);
-	DeleteObject((HANDLE)rgn1);
-	DeleteObject((HANDLE)rgn2);
 	DeleteObject((HANDLE)rgn);
 }
 
@@ -404,18 +337,16 @@
 	HPEN hOldPen;
 	HBRUSH hOldBrush;
 	int len;
-	static char text[50+1];
+	char *text;
 	DWORD dwTextSize;
 	int delta;
 	TEXTMETRIC tm;
+	WND *wndPtr = WIN_FindWndPtr( hButton );
 
 	hOldBrush = (HBRUSH)SelectObject(hDC, sysColorObjects.hbrushBtnFace);
 	hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowFrame);
 	SetBkMode(hDC, TRANSPARENT);
-
-	/* give parent a chance to alter parameters: */
-	SendMessage(GetParent(hButton), WM_CTLCOLOR, (WORD)hDC,
-		    MAKELPARAM(hButton, CTLCOLOR_BTN));
+	SetTextColor( hDC, GetSysColor(COLOR_BTNTEXT) );
 	Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
 
 	/* draw button shadow: */
@@ -424,7 +355,8 @@
 	PatBlt(hDC, rc.left+1, rc.top+1, rc.right-rc.left-2, 1, PATCOPY );
 
 	/* draw button label, if any: */
-	len = GetWindowText(hButton, text, sizeof text);
+	text = USER_HEAP_ADDR( wndPtr->hText );
+	len = strlen(text);
 	if (len >= 1) {
 		rc.top++;	rc.left++;
 		DrawText(hDC, text, len, &rc,
@@ -454,13 +386,11 @@
 static LONG CB_Paint(HWND hWnd)
 {
     PAINTSTRUCT ps;
-    RECT rc, rc3;
+    RECT rc;
     HDC hDC;
-    HPEN hOldPen;
-    HBRUSH hBrush, hGrayBrush;
+    HBRUSH hBrush;
     int textlen, delta;
     char *text;
-    HANDLE hText;
     TEXTMETRIC tm;
     SIZE size;
     WND *wndPtr = WIN_FindWndPtr(hWnd);
@@ -468,44 +398,23 @@
     hDC = BeginPaint(hWnd, &ps);
     GetClientRect(hWnd, &rc);
 
-    hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowText);
-    hGrayBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
-
     hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
 			 MAKELPARAM(hWnd, CTLCOLOR_BTN));
     FillRect(hDC, &rc, hBrush);
 
-    textlen = GetWindowTextLength(hWnd);
-    hText = USER_HEAP_ALLOC(0, textlen+1);
-    text = USER_HEAP_ADDR(hText);
-    GetWindowText(hWnd, text, textlen+1);
+    text = USER_HEAP_ADDR( wndPtr->hText );
+    textlen = strlen( text );
     GetTextMetrics(hDC, &tm);
-
     delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
-    Rectangle(hDC, 0, rc.top + delta, tm.tmHeight, tm.tmHeight + delta);
-    if (pressed)
-	Rectangle(hDC, 1, rc.top + delta + 1, tm.tmHeight - 1, 
-		                              tm.tmHeight + delta - 1);
 
-    switch ((WORD)(*(wndPtr->wExtra)))
-    {
-    case 1:
-	MoveTo(hDC, 0, rc.top + delta);
-	LineTo(hDC, tm.tmHeight - 1, tm.tmHeight + delta - 1);
-	MoveTo(hDC, 0, tm.tmHeight + delta - 1);
-	LineTo(hDC, tm.tmHeight - 1, rc.top + delta);
-	break;
+    GRAPH_DrawBitmap( hDC, hbitmapCheckBoxes,
+		      rc.left, rc.top + delta,
+		      ((GetCapture() == hWnd) ?  2*checkBoxWidth : 0) +
+		      (wndPtr->wExtra[0] ? checkBoxWidth : 0),
+		      ((wndPtr->wExtra[0] == 2) ? 2*checkBoxHeight : 0),
+		      checkBoxWidth, checkBoxHeight, SRCCOPY );
 
-    case 2:
-	rc3.left = 1;
-	rc3.top = rc.top + delta + 1;
-	rc3.right = tm.tmHeight - 1;
-	rc3.bottom = tm.tmHeight + delta - 1;
-	FillRect(hDC, &rc3, hGrayBrush);
-	break;
-    }
-
-    rc.left = tm.tmHeight + tm.tmAveCharWidth / 2;
+    rc.left = checkBoxWidth + tm.tmAveCharWidth / 2;
     DrawText(hDC, text, textlen, &rc, DT_SINGLELINE | DT_VCENTER);
 
     /* do we have the focus? */
@@ -519,53 +428,30 @@
 	DrawFocusRect(hDC, &rc);
     }
 
-    SelectObject(hDC, hOldPen);
-    USER_HEAP_FREE(hText);
     EndPaint(hWnd, &ps);
+    return 0;
 }
 
 static LONG CB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam)
 {
     RECT rc;
-    HDC hDC;
-    TEXTMETRIC tm;
-    int delta;
 
-    hDC = GetDC(hWnd);
-    GetTextMetrics(hDC, &tm);
-    ReleaseDC(hWnd, hDC);
     GetClientRect(hWnd, &rc);
-    delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
-    rc.top += delta;
-    rc.bottom = tm.tmHeight + delta;
-    if (PtInRect(&rc, MAKEPOINT(lParam)))
-    {
-	SetFocus(hWnd);
-	SetCapture(hWnd);
-	pressed = TRUE;
-	InvalidateRect(hWnd, NULL, FALSE);
-	UpdateWindow(hWnd);
-    }
+    SetFocus(hWnd);
+    SetCapture(hWnd);
+    InvalidateRect(hWnd, NULL, FALSE);
+    UpdateWindow(hWnd);
+    return 0;
 }
 
 static LONG CB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam)
 {
     RECT rc;
-    HDC hDC;
-    TEXTMETRIC tm;
-    int delta;
     WND *wndPtr = WIN_FindWndPtr(hWnd);
     LONG style;
 
-    pressed = FALSE;
     ReleaseCapture();
-    hDC = GetDC(hWnd);
-    GetTextMetrics(hDC, &tm);
-    ReleaseDC(hWnd, hDC);
     GetClientRect(hWnd, &rc);
-    delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
-    rc.top += delta;
-    rc.bottom = tm.tmHeight + delta;
 
     if (PtInRect(&rc, MAKEPOINT(lParam)))
     {
@@ -604,31 +490,20 @@
     }
     InvalidateRect(hWnd, NULL, FALSE);
     UpdateWindow(hWnd);
+    return 0;
 }
 
 static LONG CB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam)
 {
-    RECT rc;
-    HDC hDC;
-    TEXTMETRIC tm;
-    int delta;
-
-    hDC = GetDC(hWnd);
-    GetTextMetrics(hDC, &tm);
-    ReleaseDC(hWnd, hDC);
-    GetClientRect(hWnd, &rc);
-    delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
-    rc.top += delta;
-    rc.bottom = tm.tmHeight + delta;
-    if (PtInRect(&rc, MAKEPOINT(lParam)))
-	NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED);
+    NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED);
+    return 0;
 }
 
 static LONG CB_KillFocus(HWND hWnd)
 {
-    pressed = FALSE;
     InvalidateRect(hWnd, NULL, FALSE);
     UpdateWindow(hWnd);
+    return 0;
 }
 
 static LONG CB_SetCheck(HWND hWnd, WORD wParam)
@@ -637,10 +512,14 @@
 
     if ((WORD)(*(wndPtr->wExtra)) != wParam)
     {
+	RECT rect;
+	GetClientRect( hWnd, &rect );
+	rect.right = rect.left + checkBoxWidth; /* Only invalidate check-box */
 	(WORD)(*(wndPtr->wExtra)) = wParam;
-	InvalidateRect(hWnd, NULL, FALSE);
+	InvalidateRect(hWnd, &rect, FALSE);
 	UpdateWindow(hWnd);
     }
+    return 0;
 }
 
 static LONG CB_GetCheck(HWND hWnd)
@@ -662,11 +541,9 @@
     PAINTSTRUCT ps;
     RECT rc;
     HDC hDC;
-    HPEN hOldPen;
-    HBRUSH hBrush, hOldBrush;
+    HBRUSH hBrush;
     int textlen, delta;
     char *text;
-    HANDLE hText;
     TEXTMETRIC tm;
     SIZE size;
     WND *wndPtr = WIN_FindWndPtr(hWnd);
@@ -674,37 +551,23 @@
     hDC = BeginPaint(hWnd, &ps);
     GetClientRect(hWnd, &rc);
 
-    hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowText);
-
     hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
 			 MAKELPARAM(hWnd, CTLCOLOR_BTN));
     FillRect(hDC, &rc, hBrush);
 
-    textlen = GetWindowTextLength(hWnd);
-    hText = USER_HEAP_ALLOC(0, textlen+1);
-    text = USER_HEAP_ADDR(hText);
-    GetWindowText(hWnd, text, textlen+1);
     GetTextMetrics(hDC, &tm);
-
     delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
-    Ellipse(hDC, 0, rc.top + delta, tm.tmHeight, tm.tmHeight + delta);
-    if (pressed)
-	Ellipse(hDC, 1, rc.top + delta + 1, tm.tmHeight - 1, 
-		                              tm.tmHeight + delta - 1);
+    GRAPH_DrawBitmap( hDC, hbitmapCheckBoxes,
+		      rc.left, rc.top + delta,
+		      ((GetCapture() == hWnd) ?  2*checkBoxWidth : 0) +
+		      (wndPtr->wExtra[0] ? checkBoxWidth : 0), checkBoxHeight,
+		      checkBoxWidth, checkBoxHeight, SRCCOPY );
 
-    if ((WORD)(*(wndPtr->wExtra)) == 1)
-    {
-	hBrush = CreateSolidBrush( GetNearestColor(hDC, GetSysColor(COLOR_WINDOWTEXT)));
-	hOldBrush = (HBRUSH)SelectObject(hDC, (HANDLE)hBrush);
-	Ellipse(hDC, 3, rc.top + delta + 3, tm.tmHeight - 3,
-		                            tm.tmHeight + delta -3); 
-	SelectObject(hDC, (HANDLE)hOldBrush);
-	DeleteObject((HANDLE)hBrush);
-    }
-
-    rc.left = tm.tmHeight + tm.tmAveCharWidth / 2;
+    text = USER_HEAP_ADDR( wndPtr->hText );
+    textlen = strlen( text );
+    rc.left = checkBoxWidth + tm.tmAveCharWidth / 2;
     DrawText(hDC, text, textlen, &rc, DT_SINGLELINE | DT_VCENTER);
-
+    
     /* do we have the focus? */
     if (GetFocus() == hWnd)
     {
@@ -716,53 +579,31 @@
 	DrawFocusRect(hDC, &rc);
     }
 
-    SelectObject(hDC, hOldPen );
-    USER_HEAP_FREE(hText);
     EndPaint(hWnd, &ps);
+    return 0;
 }
 
 static LONG RB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam)
 {
     RECT rc;
-    HDC hDC;
-    TEXTMETRIC tm;
-    int delta;
 
-    hDC = GetDC(hWnd);
-    GetTextMetrics(hDC, &tm);
-    ReleaseDC(hWnd, hDC);
     GetClientRect(hWnd, &rc);
-    delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
-    rc.top += delta;
-    rc.bottom = tm.tmHeight + delta;
-    if (PtInRect(&rc, MAKEPOINT(lParam)))
-    {
-	SetFocus(hWnd);
-	SetCapture(hWnd);
-	pressed = TRUE;
-	InvalidateRect(hWnd, NULL, FALSE);
-	UpdateWindow(hWnd);
-    }
+    if (GetFocus() != hWnd) SetFocus(hWnd);
+    else rc.right = rc.left + checkBoxWidth;
+    SetCapture(hWnd);
+    InvalidateRect(hWnd, &rc, FALSE);
+    UpdateWindow(hWnd);
+    return 0;
 }
 
 static LONG RB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam)
 {
     RECT rc;
-    HDC hDC;
-    TEXTMETRIC tm;
-    int delta;
     WND *wndPtr = WIN_FindWndPtr(hWnd);
     LONG style;
 
-    pressed = FALSE;
     ReleaseCapture();
-    hDC = GetDC(hWnd);
-    GetTextMetrics(hDC, &tm);
-    ReleaseDC(hWnd, hDC);
     GetClientRect(hWnd, &rc);
-    delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
-    rc.top += delta;
-    rc.bottom = tm.tmHeight + delta;
 
     if (PtInRect(&rc, MAKEPOINT(lParam)))
     {
@@ -771,33 +612,24 @@
 	    (WORD)(*(wndPtr->wExtra)) = 1;
 	NOTIFY_PARENT(hWnd, BN_CLICKED);
     }
-    InvalidateRect(hWnd, NULL, FALSE);
+    rc.right = rc.left + checkBoxWidth;
+    InvalidateRect(hWnd, &rc, FALSE);
     UpdateWindow(hWnd);
+    return 0;
 }
 
+
 static LONG RB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam)
 {
-    RECT rc;
-    HDC hDC;
-    TEXTMETRIC tm;
-    int delta;
-
-    hDC = GetDC(hWnd);
-    GetTextMetrics(hDC, &tm);
-    ReleaseDC(hWnd, hDC);
-    GetClientRect(hWnd, &rc);
-    delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
-    rc.top += delta;
-    rc.bottom = tm.tmHeight + delta;
-    if (PtInRect(&rc, MAKEPOINT(lParam)))
-	NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED);
+    NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED);
+    return 0;
 }
 
 static LONG RB_KillFocus(HWND hWnd)
 {
-    pressed = FALSE;
     InvalidateRect(hWnd, NULL, FALSE);
     UpdateWindow(hWnd);
+    return 0;
 }
 
 static LONG RB_SetCheck(HWND hWnd, WORD wParam)
@@ -806,10 +638,14 @@
 
     if ((WORD)(*(wndPtr->wExtra)) != wParam)
     {
+	RECT rc;
+	GetClientRect( hWnd, &rc );
+	rc.right = rc.left + checkBoxWidth;
 	(WORD)(*(wndPtr->wExtra)) = wParam;
-	InvalidateRect(hWnd, NULL, FALSE);
+	InvalidateRect(hWnd, &rc, FALSE);
 	UpdateWindow(hWnd);
     }
+    return 0;
 }
 
 static LONG RB_GetCheck(HWND hWnd)
@@ -831,39 +667,38 @@
     PAINTSTRUCT ps;
     RECT rc;
     HDC hDC;
-    HPEN hOldPen;
     HBRUSH hBrush;
-    int textlen;
     char *text;
-    HANDLE hText;
     SIZE size;
+    WND *wndPtr = WIN_FindWndPtr( hWnd );
 
     hDC = BeginPaint(hWnd, &ps);
     GetClientRect(hWnd, &rc);
 
-    hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowText);
-
+    SelectObject( hDC, sysColorObjects.hpenWindowFrame );
     hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
 			 MAKELPARAM(hWnd, CTLCOLOR_BTN));
     FillRect(hDC, &rc, hBrush);
 
-    textlen = GetWindowTextLength(hWnd);
-    hText = USER_HEAP_ALLOC(0, textlen+1);
-    text = USER_HEAP_ADDR(hText);
-    GetWindowText(hWnd, text, textlen+1);
-    GetTextExtentPoint(hDC, text, textlen, &size);
+    text = USER_HEAP_ADDR( wndPtr->hText );
+    GetTextExtentPoint(hDC, text, strlen(text), &size);
 
-    rc.top = 5;
-    Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
+    MoveTo( hDC, 8, 5 );
+    LineTo( hDC, rc.left, 5 );
+    LineTo( hDC, rc.left, rc.bottom-1 );
+    LineTo( hDC, rc.right-1, rc.bottom-1 );
+    LineTo( hDC, rc.right-1, 5 );
+    LineTo( hDC, rc.left + size.cx + 12, 5 );
+
     rc.left = 10;
     rc.top = 0;
     rc.right = rc.left + size.cx + 1;
     rc.bottom = size.cy;
-    DrawText(hDC, text, textlen, &rc, DT_SINGLELINE);
+    SetTextColor( hDC, GetSysColor(COLOR_WINDOWTEXT) );
+    DrawText(hDC, text, -1, &rc, DT_SINGLELINE );
 
-    SelectObject(hDC, hOldPen );
-    USER_HEAP_FREE(hText);
     EndPaint(hWnd, &ps);
+    return 0;
 }
 
 
@@ -892,19 +727,16 @@
 	DrawFocusRect(hDC, &rc);
 
     EndPaint(hWnd, &ps);
+    return 0;
 }
 
 static LONG UB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam)
 {
-    RECT rc;
-
     SetFocus(hWnd);
     SetCapture(hWnd);
-    GetClientRect(hWnd, &rc);
-    if (PtInRect(&rc, MAKEPOINT(lParam)))
-	NOTIFY_PARENT(hWnd, BN_HILITE);
     InvalidateRect(hWnd, NULL, FALSE);
     UpdateWindow(hWnd);
+    return 0;
 }
 
 static LONG UB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam)
@@ -920,12 +752,14 @@
     }
     InvalidateRect(hWnd, NULL, FALSE);
     UpdateWindow(hWnd);
+    return 0;
 }
 
 static LONG UB_KillFocus(HWND hWnd)
 {
     InvalidateRect(hWnd, NULL, FALSE);
     UpdateWindow(hWnd);
+    return 0;
 }
 
 
@@ -955,33 +789,31 @@
     SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM)lpdis); 
     USER_HEAP_FREE(hDis);
     EndPaint(hWnd, &ps);
+    return 0;
 }
 
 static LONG OB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam)
 {
     HDC 	hDC;
-    RECT 	rc;
     HANDLE	hDis;
     LPDRAWITEMSTRUCT lpdis;
     WND *wndPtr = WIN_FindWndPtr(hWnd);
     SetFocus(hWnd);
     SetCapture(hWnd);
     hDC = GetDC(hWnd);
-    GetClientRect(hWnd, &rc);
-    if (PtInRect(&rc, MAKEPOINT(lParam)))
-	NOTIFY_PARENT(hWnd, BN_CLICKED);
-    GetClientRect(hWnd, &rc);
+    NOTIFY_PARENT(hWnd, BN_CLICKED);
     hDis = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT));
     lpdis = (LPDRAWITEMSTRUCT)USER_HEAP_ADDR(hDis);
     lpdis->hDC = hDC;
     lpdis->itemID = 0;
-    CopyRect(&lpdis->rcItem, &rc);
+    GetClientRect( hWnd, &lpdis->rcItem );
     lpdis->CtlID = wndPtr->wIDmenu;
     lpdis->CtlType = ODT_BUTTON;
     lpdis->itemAction = ODA_SELECT;
     SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM)lpdis); 
     USER_HEAP_FREE(hDis);
     ReleaseDC(hWnd, hDC);
+    return 0;
 }
 
 static LONG OB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam)
@@ -996,7 +828,6 @@
     GetClientRect(hWnd, &rc);
     if (PtInRect(&rc, MAKEPOINT(lParam)))
 	NOTIFY_PARENT(hWnd, BN_CLICKED);
-    GetClientRect(hWnd, &rc);
     hDis = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT));
     lpdis = (LPDRAWITEMSTRUCT)USER_HEAP_ADDR(hDis);
     lpdis->hDC = hDC;
@@ -1008,11 +839,13 @@
     SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM)lpdis); 
     USER_HEAP_FREE(hDis);
     ReleaseDC(hWnd, hDC);
+    return 0;
 }
 
 static LONG OB_KillFocus(HWND hWnd)
 {
     InvalidateRect(hWnd, NULL, FALSE);
     UpdateWindow(hWnd);
+    return 0;
 }