1 /* File: button.c -- Button type widgets
3 * Copyright (C) 1993 Johannes Ruscheinski
4 * Copyright (C) 1993 David Metcalfe
7 static char Copyright1[] = "Copyright Johannes Ruscheinski, 1993";
8 static char Copyright2[] = "Copyright David Metcalfe, 1993";
15 LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam);
19 #define NOTIFY_PARENT(hWndCntrl, wNotifyCode) \
20 SendMessage(GetParent(hWndCntrl), WM_COMMAND, \
21 GetDlgCtrlID(hWndCntrl), MAKELPARAM(hWndCntrl, wNotifyCode));
22 #define DIM(array) ((sizeof array)/(sizeof array[0]))
24 static LONG PB_Paint(HWND hWnd);
25 static LONG PB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam);
26 static LONG PB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam);
27 static LONG PB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam);
28 static LONG PB_KillFocus(HWND hwnd);
29 static void DrawRaisedPushButton(HDC hDC, HWND hButton, RECT rc);
30 static void DrawPressedPushButton(HDC hDC, HWND hButton, RECT rc);
31 static LONG CB_Paint(HWND hWnd);
32 static LONG CB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam);
33 static LONG CB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam);
34 static LONG CB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam);
35 static LONG CB_KillFocus(HWND hWnd);
36 static LONG CB_SetCheck(HWND hWnd, WORD wParam);
37 static LONG CB_GetCheck(HWND hWnd);
38 static LONG RB_Paint(HWND hWnd);
39 static LONG RB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam);
40 static LONG RB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam);
41 static LONG RB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam);
42 static LONG RB_KillFocus(HWND hWnd);
43 static LONG RB_SetCheck(HWND hWnd, WORD wParam);
44 static LONG RB_GetCheck(HWND hWnd);
45 static LONG GB_Paint(HWND hWnd);
46 static LONG UB_Paint(HWND hWnd);
47 static LONG UB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam);
48 static LONG UB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam);
49 static LONG UB_KillFocus(HWND hWnd);
50 static LONG OB_Paint(HWND hWnd);
51 static LONG OB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam);
52 static LONG OB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam);
53 static LONG OB_KillFocus(HWND hWnd);
58 LONG (*lButtonDownfn)();
59 LONG (*lButtonUpfn)();
60 LONG (*lButtonDblClkfn)();
61 LONG (*killFocusfn)();
66 #define MAX_BTN_TYPE 12
68 static BTNFN btnfn[MAX_BTN_TYPE] =
71 (LONG(*)())PB_Paint, /* BS_PUSHBUTTON */
72 (LONG(*)())PB_LButtonDown,
73 (LONG(*)())PB_LButtonUp,
74 (LONG(*)())PB_LButtonDblClk,
75 (LONG(*)())PB_KillFocus,
80 (LONG(*)())PB_Paint, /* BS_DEFPUSHBUTTON */
81 (LONG(*)())PB_LButtonDown,
82 (LONG(*)())PB_LButtonUp,
83 (LONG(*)())PB_LButtonDblClk,
84 (LONG(*)())PB_KillFocus,
89 (LONG(*)())CB_Paint, /* BS_CHECKBOX */
90 (LONG(*)())CB_LButtonDown,
91 (LONG(*)())CB_LButtonUp,
92 (LONG(*)())CB_LButtonDblClk,
93 (LONG(*)())CB_KillFocus,
94 (LONG(*)())CB_SetCheck,
95 (LONG(*)())CB_GetCheck
98 (LONG(*)())CB_Paint, /* BS_AUTOCHECKBOX */
99 (LONG(*)())CB_LButtonDown,
100 (LONG(*)())CB_LButtonUp,
101 (LONG(*)())CB_LButtonDblClk,
102 (LONG(*)())CB_KillFocus,
103 (LONG(*)())CB_SetCheck,
104 (LONG(*)())CB_GetCheck
107 (LONG(*)())RB_Paint, /* BS_RADIOBUTTON */
108 (LONG(*)())RB_LButtonDown,
109 (LONG(*)())RB_LButtonUp,
110 (LONG(*)())RB_LButtonDblClk,
111 (LONG(*)())RB_KillFocus,
112 (LONG(*)())RB_SetCheck,
113 (LONG(*)())RB_GetCheck
116 (LONG(*)())CB_Paint, /* BS_3STATE */
117 (LONG(*)())CB_LButtonDown,
118 (LONG(*)())CB_LButtonUp,
119 (LONG(*)())CB_LButtonDblClk,
120 (LONG(*)())CB_KillFocus,
121 (LONG(*)())CB_SetCheck,
122 (LONG(*)())CB_GetCheck
125 (LONG(*)())CB_Paint, /* BS_AUTO3STATE */
126 (LONG(*)())CB_LButtonDown,
127 (LONG(*)())CB_LButtonUp,
128 (LONG(*)())CB_LButtonDblClk,
129 (LONG(*)())CB_KillFocus,
130 (LONG(*)())CB_SetCheck,
131 (LONG(*)())CB_GetCheck
134 (LONG(*)())GB_Paint, /* BS_GROUPBOX */
143 (LONG(*)())UB_Paint, /* BS_USERBUTTON */
144 (LONG(*)())UB_LButtonDown,
145 (LONG(*)())UB_LButtonUp,
147 (LONG(*)())UB_KillFocus,
152 (LONG(*)())RB_Paint, /* BS_AUTORADIOBUTTON */
153 (LONG(*)())RB_LButtonDown,
154 (LONG(*)())RB_LButtonUp,
155 (LONG(*)())RB_LButtonDblClk,
156 (LONG(*)())RB_KillFocus,
157 (LONG(*)())RB_SetCheck,
158 (LONG(*)())RB_GetCheck
161 (LONG(*)())NULL, /* Not defined */
170 (LONG(*)())OB_Paint, /* BS_OWNERDRAW */
171 (LONG(*)())OB_LButtonDown,
172 (LONG(*)())OB_LButtonUp,
174 (LONG(*)())OB_KillFocus,
181 LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
187 WND *wndPtr = WIN_FindWndPtr(hWnd);
188 LONG style = wndPtr->dwStyle & 0x0000000F;
191 /* case WM_GETDLGCODE:
192 lResult = DLGC_BUTTON;
196 InvalidateRect(hWnd, NULL, FALSE);
200 if (style < 0L || style >= (LONG)DIM(btnfn))
204 (WORD)(*(wndPtr->wExtra)) = 0;
211 if (btnfn[style].paintfn)
212 (btnfn[style].paintfn)(hWnd);
216 if (btnfn[style].lButtonDownfn)
217 (btnfn[style].lButtonDownfn)(hWnd, wParam, lParam);
221 if (btnfn[style].lButtonUpfn)
222 (btnfn[style].lButtonUpfn)(hWnd, wParam, lParam);
225 case WM_LBUTTONDBLCLK:
226 if (btnfn[style].lButtonDblClkfn)
227 (btnfn[style].lButtonDblClkfn)(hWnd, wParam, lParam);
234 if (btnfn[style].killFocusfn)
235 (btnfn[style].killFocusfn)(hWnd);
238 case WM_SYSCOLORCHANGE:
239 InvalidateRect(hWnd, NULL, TRUE);
243 if (btnfn[style].setCheckfn)
244 (btnfn[style].setCheckfn)(hWnd, wParam);
248 if (btnfn[style].getCheckfn)
249 return (btnfn[style].getCheckfn)(hWnd);
253 lResult = DefWindowProc(hWnd, uMsg, wParam, lParam);
262 /**********************************************************************
263 * Push Button Functions
266 static LONG PB_Paint(HWND hWnd)
272 hDC = BeginPaint(hWnd, &ps);
273 GetClientRect(hWnd, &rc);
275 DrawPressedPushButton(hDC, hWnd, rc);
277 DrawRaisedPushButton(hDC, hWnd, rc);
281 static LONG PB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam)
286 InvalidateRect(hWnd, NULL, FALSE);
290 static LONG PB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam)
296 GetClientRect(hWnd, &rc);
297 if (PtInRect(&rc, MAKEPOINT(lParam)))
298 NOTIFY_PARENT(hWnd, BN_CLICKED);
299 InvalidateRect(hWnd, NULL, FALSE);
303 static LONG PB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam)
307 GetClientRect(hWnd, &rc);
308 if (PtInRect(&rc, MAKEPOINT(lParam)))
309 NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED);
312 static LONG PB_KillFocus(HWND hWnd)
315 InvalidateRect(hWnd, NULL, FALSE);
319 static void DrawRaisedPushButton(HDC hDC, HWND hButton, RECT rc)
323 HRGN rgn1, rgn2, rgn;
325 static char text[50+1];
331 hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowFrame);
332 hOldBrush = (HBRUSH)SelectObject(hDC, sysColorObjects.hbrushBtnFace);
333 SetBkMode(hDC, TRANSPARENT);
335 rgn = CreateRectRgn(0, 0, 0, 0);
336 rgn1 = CreateRectRgn(rc.left, rc.top, rc.right, rc.bottom);
338 SendMessage(GetParent(hButton), WM_CTLCOLOR, (WORD)hDC,
339 MAKELPARAM(hButton, CTLCOLOR_BTN));
340 Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
342 /* draw button label, if any: */
343 len = GetWindowText(hButton, text, sizeof text);
345 rc.left--; rc.bottom--;
346 DrawText(hDC, text, len, &rc,
347 DT_SINGLELINE | DT_CENTER| DT_VCENTER);
350 /* draw button highlight */
351 points[0].x = rc.left+2;
352 points[0].y = rc.bottom;
353 points[1].x = rc.left+4;
354 points[1].y = rc.bottom-2;
355 points[2].x = rc.left+4;
356 points[2].y = rc.top+3;
357 points[3].x = rc.right-3;
358 points[3].y = rc.top+3;
359 points[4].x = rc.right-1;
360 points[4].y = rc.top+1;
361 points[5].x = rc.left+2;
362 points[5].y = rc.top+1;
363 rgn2 = CreatePolygonRgn(points, DIM(points), ALTERNATE);
364 CombineRgn(rgn, rgn1, rgn2, RGN_AND);
365 FillRgn(hDC, rgn2, sysColorObjects.hbrushBtnHighlight);
367 /* draw button shadow: */
368 points[0].x = rc.left+2;
369 points[0].y = rc.bottom;
370 points[1].x = rc.left+4;
371 points[1].y = rc.bottom-2;
372 points[2].x = rc.right-3;
373 points[2].y = rc.bottom-2;
374 points[3].x = rc.right-3;
375 points[3].y = rc.top+3;
376 points[4].x = rc.right-1;
377 points[4].y = rc.top;
378 points[5].x = rc.right-1;
379 points[5].y = rc.bottom;
380 rgn2 = CreatePolygonRgn(points, DIM(points), ALTERNATE);
381 CombineRgn(rgn, rgn1, rgn2, RGN_AND);
382 FillRgn(hDC, rgn2, sysColorObjects.hbrushBtnShadow);
384 /* do we have the focus? */
385 if (len >= 1 && GetFocus() == hButton) {
386 dwTextSize = GetTextExtent(hDC, text, len);
387 delta = ((rc.right - rc.left) - LOWORD(dwTextSize) - 1) >> 1;
388 rc.left += delta; rc.right -= delta;
389 GetTextMetrics(hDC, &tm);
390 delta = ((rc.bottom - rc.top) - tm.tmHeight - 1) >> 1;
391 rc.top += delta; rc.bottom -= delta;
392 DrawFocusRect(hDC, &rc);
395 SelectObject(hDC, (HANDLE)hOldPen);
396 SelectObject(hDC, (HANDLE)hOldBrush);
397 DeleteObject((HANDLE)rgn1);
398 DeleteObject((HANDLE)rgn2);
399 DeleteObject((HANDLE)rgn);
403 static void DrawPressedPushButton(HDC hDC, HWND hButton, RECT rc)
408 static char text[50+1];
413 hOldBrush = (HBRUSH)SelectObject(hDC, sysColorObjects.hbrushBtnFace);
414 hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowFrame);
415 SetBkMode(hDC, TRANSPARENT);
417 /* give parent a chance to alter parameters: */
418 SendMessage(GetParent(hButton), WM_CTLCOLOR, (WORD)hDC,
419 MAKELPARAM(hButton, CTLCOLOR_BTN));
420 Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
422 /* draw button shadow: */
423 SelectObject(hDC, sysColorObjects.hbrushBtnShadow );
424 PatBlt(hDC, rc.left+1, rc.top+1, 1, rc.bottom-rc.top-2, PATCOPY );
425 PatBlt(hDC, rc.left+1, rc.top+1, rc.right-rc.left-2, 1, PATCOPY );
427 /* draw button label, if any: */
428 len = GetWindowText(hButton, text, sizeof text);
431 DrawText(hDC, text, len, &rc,
432 DT_SINGLELINE | DT_CENTER| DT_VCENTER);
435 /* do we have the focus? */
436 if (len >= 1 && GetFocus() == hButton) {
437 dwTextSize = GetTextExtent(hDC, text, len);
438 delta = ((rc.right - rc.left) - LOWORD(dwTextSize) - 1) >> 1;
439 rc.left += delta; rc.right -= delta;
440 GetTextMetrics(hDC, &tm);
441 delta = ((rc.bottom - rc.top) - tm.tmHeight - 1) >> 1;
442 rc.top += delta; rc.bottom -= delta;
443 DrawFocusRect(hDC, &rc);
446 SelectObject(hDC, (HANDLE)hOldPen);
447 SelectObject(hDC, (HANDLE)hOldBrush);
451 /**********************************************************************
452 * Check Box Functions
455 static LONG CB_Paint(HWND hWnd)
461 HBRUSH hBrush, hGrayBrush;
467 WND *wndPtr = WIN_FindWndPtr(hWnd);
469 hDC = BeginPaint(hWnd, &ps);
470 GetClientRect(hWnd, &rc);
472 hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowText);
473 hGrayBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
475 hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
476 MAKELPARAM(hWnd, CTLCOLOR_BTN));
477 FillRect(hDC, &rc, hBrush);
479 textlen = GetWindowTextLength(hWnd);
480 hText = USER_HEAP_ALLOC(0, textlen+1);
481 text = USER_HEAP_ADDR(hText);
482 GetWindowText(hWnd, text, textlen+1);
483 GetTextMetrics(hDC, &tm);
485 delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
486 Rectangle(hDC, 0, rc.top + delta, tm.tmHeight, tm.tmHeight + delta);
488 Rectangle(hDC, 1, rc.top + delta + 1, tm.tmHeight - 1,
489 tm.tmHeight + delta - 1);
491 switch ((WORD)(*(wndPtr->wExtra)))
494 MoveTo(hDC, 0, rc.top + delta);
495 LineTo(hDC, tm.tmHeight - 1, tm.tmHeight + delta - 1);
496 MoveTo(hDC, 0, tm.tmHeight + delta - 1);
497 LineTo(hDC, tm.tmHeight - 1, rc.top + delta);
502 rc3.top = rc.top + delta + 1;
503 rc3.right = tm.tmHeight - 1;
504 rc3.bottom = tm.tmHeight + delta - 1;
505 FillRect(hDC, &rc3, hGrayBrush);
509 rc.left = tm.tmHeight + tm.tmAveCharWidth / 2;
510 DrawText(hDC, text, textlen, &rc, DT_SINGLELINE | DT_VCENTER);
512 /* do we have the focus? */
513 if (GetFocus() == hWnd)
515 GetTextExtentPoint(hDC, text, textlen, &size);
517 rc.bottom -= delta + 1;
519 rc.right = rc.left + size.cx + 2;
520 DrawFocusRect(hDC, &rc);
523 SelectObject(hDC, hOldPen);
524 USER_HEAP_FREE(hText);
529 static LONG CB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam)
537 GetTextMetrics(hDC, &tm);
538 ReleaseDC(hWnd, hDC);
539 GetClientRect(hWnd, &rc);
540 delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
542 rc.bottom = tm.tmHeight + delta;
543 rc.right = tm.tmHeight;
544 if (PtInRect(&rc, MAKEPOINT(lParam)))
549 InvalidateRect(hWnd, NULL, FALSE);
554 static LONG CB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam)
560 WND *wndPtr = WIN_FindWndPtr(hWnd);
566 GetTextMetrics(hDC, &tm);
567 ReleaseDC(hWnd, hDC);
568 GetClientRect(hWnd, &rc);
569 delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
571 rc.bottom = tm.tmHeight + delta;
572 rc.right = tm.tmHeight;
574 if (PtInRect(&rc, MAKEPOINT(lParam)))
576 style = wndPtr->dwStyle & 0x0000000F;
577 if (style == BS_AUTOCHECKBOX)
579 switch ((WORD)(*(wndPtr->wExtra)))
582 (WORD)(*(wndPtr->wExtra)) = 1;
586 (WORD)(*(wndPtr->wExtra)) = 0;
590 else if (style == BS_AUTO3STATE)
592 switch ((WORD)(*(wndPtr->wExtra)))
595 (WORD)(*(wndPtr->wExtra)) = 1;
599 (WORD)(*(wndPtr->wExtra)) = 2;
603 (WORD)(*(wndPtr->wExtra)) = 0;
607 NOTIFY_PARENT(hWnd, BN_CLICKED);
610 InvalidateRect(hWnd, NULL, FALSE);
614 static LONG CB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam)
622 GetTextMetrics(hDC, &tm);
623 ReleaseDC(hWnd, hDC);
624 GetClientRect(hWnd, &rc);
625 delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
627 rc.bottom = tm.tmHeight + delta;
628 rc.right = tm.tmHeight;
629 if (PtInRect(&rc, MAKEPOINT(lParam)))
630 NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED);
633 static LONG CB_KillFocus(HWND hWnd)
636 InvalidateRect(hWnd, NULL, FALSE);
640 static LONG CB_SetCheck(HWND hWnd, WORD wParam)
642 WND *wndPtr = WIN_FindWndPtr(hWnd);
644 if ((WORD)(*(wndPtr->wExtra)) != wParam)
646 (WORD)(*(wndPtr->wExtra)) = wParam;
647 InvalidateRect(hWnd, NULL, FALSE);
653 static LONG CB_GetCheck(HWND hWnd)
656 WND *wndPtr = WIN_FindWndPtr(hWnd);
658 wResult = (WORD)(*(wndPtr->wExtra));
660 return (LONG)wResult;
664 /**********************************************************************
665 * Radio Button Functions
668 static LONG RB_Paint(HWND hWnd)
674 HBRUSH hBrush, hOldBrush;
680 WND *wndPtr = WIN_FindWndPtr(hWnd);
682 hDC = BeginPaint(hWnd, &ps);
683 GetClientRect(hWnd, &rc);
685 hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowText);
687 hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
688 MAKELPARAM(hWnd, CTLCOLOR_BTN));
689 FillRect(hDC, &rc, hBrush);
691 textlen = GetWindowTextLength(hWnd);
692 hText = USER_HEAP_ALLOC(0, textlen+1);
693 text = USER_HEAP_ADDR(hText);
694 GetWindowText(hWnd, text, textlen+1);
695 GetTextMetrics(hDC, &tm);
697 delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
698 Ellipse(hDC, 0, rc.top + delta, tm.tmHeight, tm.tmHeight + delta);
700 Ellipse(hDC, 1, rc.top + delta + 1, tm.tmHeight - 1,
701 tm.tmHeight + delta - 1);
703 if ((WORD)(*(wndPtr->wExtra)) == 1)
705 hBrush = CreateSolidBrush( GetNearestColor(hDC, GetSysColor(COLOR_WINDOWTEXT)));
706 hOldBrush = (HBRUSH)SelectObject(hDC, (HANDLE)hBrush);
707 Ellipse(hDC, 3, rc.top + delta + 3, tm.tmHeight - 3,
708 tm.tmHeight + delta -3);
709 SelectObject(hDC, (HANDLE)hOldBrush);
710 DeleteObject((HANDLE)hBrush);
713 rc.left = tm.tmHeight + tm.tmAveCharWidth / 2;
714 DrawText(hDC, text, textlen, &rc, DT_SINGLELINE | DT_VCENTER);
716 /* do we have the focus? */
717 if (GetFocus() == hWnd)
719 GetTextExtentPoint(hDC, text, textlen, &size);
721 rc.bottom -= delta + 1;
723 rc.right = rc.left + size.cx + 2;
724 DrawFocusRect(hDC, &rc);
727 SelectObject(hDC, hOldPen );
728 USER_HEAP_FREE(hText);
733 static LONG RB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam)
741 GetTextMetrics(hDC, &tm);
742 ReleaseDC(hWnd, hDC);
743 GetClientRect(hWnd, &rc);
744 delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
746 rc.bottom = tm.tmHeight + delta;
747 rc.right = tm.tmHeight;
748 if (PtInRect(&rc, MAKEPOINT(lParam)))
753 InvalidateRect(hWnd, NULL, FALSE);
758 static LONG RB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam)
764 WND *wndPtr = WIN_FindWndPtr(hWnd);
770 GetTextMetrics(hDC, &tm);
771 ReleaseDC(hWnd, hDC);
772 GetClientRect(hWnd, &rc);
773 delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
775 rc.bottom = tm.tmHeight + delta;
776 rc.right = tm.tmHeight;
778 if (PtInRect(&rc, MAKEPOINT(lParam)))
780 style = wndPtr->dwStyle & 0x0000000F;
781 if (style == BS_AUTORADIOBUTTON)
782 (WORD)(*(wndPtr->wExtra)) = 1;
783 NOTIFY_PARENT(hWnd, BN_CLICKED);
786 InvalidateRect(hWnd, NULL, FALSE);
790 static LONG RB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam)
798 GetTextMetrics(hDC, &tm);
799 ReleaseDC(hWnd, hDC);
800 GetClientRect(hWnd, &rc);
801 delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
803 rc.bottom = tm.tmHeight + delta;
804 rc.right = tm.tmHeight;
805 if (PtInRect(&rc, MAKEPOINT(lParam)))
806 NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED);
809 static LONG RB_KillFocus(HWND hWnd)
812 InvalidateRect(hWnd, NULL, FALSE);
816 static LONG RB_SetCheck(HWND hWnd, WORD wParam)
818 WND *wndPtr = WIN_FindWndPtr(hWnd);
820 if ((WORD)(*(wndPtr->wExtra)) != wParam)
822 (WORD)(*(wndPtr->wExtra)) = wParam;
823 InvalidateRect(hWnd, NULL, FALSE);
829 static LONG RB_GetCheck(HWND hWnd)
832 WND *wndPtr = WIN_FindWndPtr(hWnd);
834 wResult = (WORD)(*(wndPtr->wExtra));
836 return (LONG)wResult;
840 /**********************************************************************
841 * Group Box Functions
844 static LONG GB_Paint(HWND hWnd)
856 hDC = BeginPaint(hWnd, &ps);
857 GetClientRect(hWnd, &rc);
859 hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowText);
861 hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
862 MAKELPARAM(hWnd, CTLCOLOR_BTN));
863 FillRect(hDC, &rc, hBrush);
865 textlen = GetWindowTextLength(hWnd);
866 hText = USER_HEAP_ALLOC(0, textlen+1);
867 text = USER_HEAP_ADDR(hText);
868 GetWindowText(hWnd, text, textlen+1);
869 GetTextExtentPoint(hDC, text, textlen, &size);
872 Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
875 rc.right = rc.left + size.cx + 1;
877 DrawText(hDC, text, textlen, &rc, DT_SINGLELINE);
879 SelectObject(hDC, hOldPen );
880 USER_HEAP_FREE(hText);
885 /**********************************************************************
886 * User Button Functions
889 static LONG UB_Paint(HWND hWnd)
896 hDC = BeginPaint(hWnd, &ps);
897 GetClientRect(hWnd, &rc);
899 hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
900 MAKELPARAM(hWnd, CTLCOLOR_BTN));
901 FillRect(hDC, &rc, hBrush);
903 NOTIFY_PARENT(hWnd, BN_PAINT);
905 /* do we have the focus? */
906 if (GetFocus() == hWnd)
907 DrawFocusRect(hDC, &rc);
912 static LONG UB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam)
918 GetClientRect(hWnd, &rc);
919 if (PtInRect(&rc, MAKEPOINT(lParam)))
920 NOTIFY_PARENT(hWnd, BN_HILITE);
921 InvalidateRect(hWnd, NULL, FALSE);
925 static LONG UB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam)
930 GetClientRect(hWnd, &rc);
931 if (PtInRect(&rc, MAKEPOINT(lParam)))
933 NOTIFY_PARENT(hWnd, BN_CLICKED);
934 NOTIFY_PARENT(hWnd, BN_UNHILITE);
936 InvalidateRect(hWnd, NULL, FALSE);
940 static LONG UB_KillFocus(HWND hWnd)
942 InvalidateRect(hWnd, NULL, FALSE);
947 /**********************************************************************
948 * Ownerdrawn Button Functions
951 static LONG OB_Paint(HWND hWnd)
957 LPDRAWITEMSTRUCT lpdis;
958 WND *wndPtr = WIN_FindWndPtr(hWnd);
959 hDC = BeginPaint(hWnd, &ps);
960 GetClientRect(hWnd, &rc);
961 hDis = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT));
962 lpdis = (LPDRAWITEMSTRUCT)USER_HEAP_ADDR(hDis);
965 CopyRect(&lpdis->rcItem, &rc);
966 lpdis->CtlID = wndPtr->wIDmenu;
967 lpdis->CtlType = ODT_BUTTON;
968 lpdis->itemAction = ODA_DRAWENTIRE;
969 /* printf("ownerdrawn button WM_DRAWITEM CtrlID=%X\n", lpdis->CtlID);*/
970 SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM)lpdis);
971 USER_HEAP_FREE(hDis);
975 static LONG OB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam)
980 LPDRAWITEMSTRUCT lpdis;
981 WND *wndPtr = WIN_FindWndPtr(hWnd);
985 GetClientRect(hWnd, &rc);
986 if (PtInRect(&rc, MAKEPOINT(lParam)))
987 NOTIFY_PARENT(hWnd, BN_CLICKED);
988 GetClientRect(hWnd, &rc);
989 hDis = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT));
990 lpdis = (LPDRAWITEMSTRUCT)USER_HEAP_ADDR(hDis);
993 CopyRect(&lpdis->rcItem, &rc);
994 lpdis->CtlID = wndPtr->wIDmenu;
995 lpdis->CtlType = ODT_BUTTON;
996 lpdis->itemAction = ODA_SELECT;
997 SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM)lpdis);
998 USER_HEAP_FREE(hDis);
999 ReleaseDC(hWnd, hDC);
1002 static LONG OB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam)
1007 LPDRAWITEMSTRUCT lpdis;
1008 WND *wndPtr = WIN_FindWndPtr(hWnd);
1011 GetClientRect(hWnd, &rc);
1012 if (PtInRect(&rc, MAKEPOINT(lParam)))
1013 NOTIFY_PARENT(hWnd, BN_CLICKED);
1014 GetClientRect(hWnd, &rc);
1015 hDis = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT));
1016 lpdis = (LPDRAWITEMSTRUCT)USER_HEAP_ADDR(hDis);
1019 CopyRect(&lpdis->rcItem, &rc);
1020 lpdis->CtlID = wndPtr->wIDmenu;
1021 lpdis->CtlType = ODT_BUTTON;
1022 lpdis->itemAction = ODA_SELECT;
1023 SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM)lpdis);
1024 USER_HEAP_FREE(hDis);
1025 ReleaseDC(hWnd, hDC);
1028 static LONG OB_KillFocus(HWND hWnd)
1030 InvalidateRect(hWnd, NULL, FALSE);