| /* File: button.c -- Button type widgets | |
| * | |
| * Copyright (C) 1993 Johannes Ruscheinski | |
| * Copyright (C) 1993 David Metcalfe | |
| */ | |
| static char Copyright1[] = "Copyright Johannes Ruscheinski, 1993"; | |
| static char Copyright2[] = "Copyright David Metcalfe, 1993"; | |
| #include <windows.h> | |
| #include "win.h" | |
| #include "user.h" | |
| LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam); | |
| static COLORREF color_windowtext, color_windowframe, color_btnface, | |
| color_btnshadow, color_btntext, color_btnhighlight; | |
| static BOOL pressed; | |
| #define NOTIFY_PARENT(hWndCntrl, wNotifyCode) \ | |
| SendMessage(GetParent(hWndCntrl), WM_COMMAND, \ | |
| GetDlgCtrlID(hWndCntrl), MAKELPARAM(hWndCntrl, wNotifyCode)); | |
| #define DIM(array) ((sizeof array)/(sizeof array[0])) | |
| 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); | |
| static LONG PB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam); | |
| static LONG PB_KillFocus(HWND hwnd); | |
| static void DrawRaisedPushButton(HDC hDC, HWND hButton, RECT rc); | |
| static void DrawPressedPushButton(HDC hDC, HWND hButton, RECT rc); | |
| static LONG CB_Paint(HWND hWnd); | |
| static LONG CB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam); | |
| static LONG CB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam); | |
| static LONG CB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam); | |
| static LONG CB_KillFocus(HWND hWnd); | |
| static LONG CB_SetCheck(HWND hWnd, WORD wParam); | |
| static LONG CB_GetCheck(HWND hWnd); | |
| static LONG RB_Paint(HWND hWnd); | |
| static LONG RB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam); | |
| static LONG RB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam); | |
| static LONG RB_LButtonDblClk(HWND hWnd, WORD wParam, LONG lParam); | |
| static LONG RB_KillFocus(HWND hWnd); | |
| static LONG RB_SetCheck(HWND hWnd, WORD wParam); | |
| static LONG RB_GetCheck(HWND hWnd); | |
| static LONG GB_Paint(HWND hWnd); | |
| static LONG UB_Paint(HWND hWnd); | |
| static LONG UB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam); | |
| static LONG UB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam); | |
| static LONG UB_KillFocus(HWND hWnd); | |
| static LONG OB_Paint(HWND hWnd); | |
| static LONG OB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam); | |
| static LONG OB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam); | |
| static LONG OB_KillFocus(HWND hWnd); | |
| typedef struct | |
| { | |
| LONG (*paintfn)(); | |
| LONG (*lButtonDownfn)(); | |
| LONG (*lButtonUpfn)(); | |
| LONG (*lButtonDblClkfn)(); | |
| LONG (*killFocusfn)(); | |
| LONG (*setCheckfn)(); | |
| LONG (*getCheckfn)(); | |
| } 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 | |
| }, | |
| }; | |
| 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; | |
| switch (uMsg) { | |
| /* case WM_GETDLGCODE: | |
| lResult = DLGC_BUTTON; | |
| break; | |
| */ | |
| case WM_ENABLE: | |
| InvalidateRect(hWnd, NULL, FALSE); | |
| break; | |
| case WM_CREATE: | |
| if (style < 0L || style >= (LONG)DIM(btnfn)) | |
| lResult = -1L; | |
| else | |
| { | |
| /* initialise colours used for button rendering: */ | |
| color_windowtext = GetSysColor(COLOR_WINDOWTEXT); | |
| color_windowframe = GetSysColor(COLOR_WINDOWFRAME); | |
| color_btnface = GetSysColor(COLOR_BTNFACE); | |
| color_btnshadow = GetSysColor(COLOR_BTNSHADOW); | |
| color_btntext = GetSysColor(COLOR_BTNTEXT); | |
| color_btnhighlight = GetSysColor(COLOR_BTNHIGHLIGHT); | |
| (WORD)(*(wndPtr->wExtra)) = 0; | |
| pressed = FALSE; | |
| lResult = 0L; | |
| } | |
| break; | |
| case WM_PAINT: | |
| if (btnfn[style].paintfn) | |
| (btnfn[style].paintfn)(hWnd); | |
| break; | |
| case WM_LBUTTONDOWN: | |
| if (btnfn[style].lButtonDownfn) | |
| (btnfn[style].lButtonDownfn)(hWnd, wParam, lParam); | |
| break; | |
| case WM_LBUTTONUP: | |
| if (btnfn[style].lButtonUpfn) | |
| (btnfn[style].lButtonUpfn)(hWnd, wParam, lParam); | |
| break; | |
| case WM_LBUTTONDBLCLK: | |
| if (btnfn[style].lButtonDblClkfn) | |
| (btnfn[style].lButtonDblClkfn)(hWnd, wParam, lParam); | |
| break; | |
| case WM_SETFOCUS: | |
| break; | |
| case WM_KILLFOCUS: | |
| if (btnfn[style].killFocusfn) | |
| (btnfn[style].killFocusfn)(hWnd); | |
| break; | |
| case WM_SYSCOLORCHANGE: | |
| color_windowtext = GetSysColor(COLOR_WINDOWTEXT); | |
| color_windowframe = GetSysColor(COLOR_WINDOWFRAME); | |
| color_btnface = GetSysColor(COLOR_BTNFACE); | |
| color_btnshadow = GetSysColor(COLOR_BTNSHADOW); | |
| color_btntext = GetSysColor(COLOR_BTNTEXT); | |
| color_btnhighlight = GetSysColor(COLOR_BTNHIGHLIGHT); | |
| InvalidateRect(hWnd, NULL, TRUE); | |
| break; | |
| case BM_SETCHECK: | |
| if (btnfn[style].setCheckfn) | |
| (btnfn[style].setCheckfn)(hWnd, wParam); | |
| break; | |
| case BM_GETCHECK: | |
| if (btnfn[style].getCheckfn) | |
| return (btnfn[style].getCheckfn)(hWnd); | |
| break; | |
| default: | |
| lResult = DefWindowProc(hWnd, uMsg, wParam, lParam); | |
| break; | |
| } | |
| GlobalUnlock(hWnd); | |
| return lResult; | |
| } | |
| /********************************************************************** | |
| * Push Button Functions | |
| */ | |
| static LONG PB_Paint(HWND hWnd) | |
| { | |
| PAINTSTRUCT ps; | |
| RECT rc; | |
| HDC hDC; | |
| hDC = BeginPaint(hWnd, &ps); | |
| GetClientRect(hWnd, &rc); | |
| if (pressed) | |
| DrawPressedPushButton(hDC, hWnd, rc); | |
| else | |
| DrawRaisedPushButton(hDC, hWnd, rc); | |
| EndPaint(hWnd, &ps); | |
| } | |
| static LONG PB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam) | |
| { | |
| /* SetFocus(hWnd); */ | |
| SetCapture(hWnd); | |
| pressed = TRUE; | |
| InvalidateRect(hWnd, NULL, FALSE); | |
| UpdateWindow(hWnd); | |
| } | |
| 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); | |
| } | |
| 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); | |
| } | |
| static LONG PB_KillFocus(HWND hWnd) | |
| { | |
| pressed = FALSE; | |
| InvalidateRect(hWnd, NULL, FALSE); | |
| UpdateWindow(hWnd); | |
| } | |
| static void DrawRaisedPushButton(HDC hDC, HWND hButton, RECT rc) | |
| { | |
| HPEN hOldPen, hFramePen; | |
| HBRUSH hOldBrush, hShadowBrush, hHighlightBrush, hBackgrndBrush; | |
| HRGN rgn1, rgn2, rgn; | |
| int len; | |
| static char text[50+1]; | |
| POINT points[6]; | |
| DWORD dwTextSize; | |
| int delta; | |
| TEXTMETRIC tm; | |
| int i; | |
| hFramePen = CreatePen(PS_SOLID, 1, color_windowframe); | |
| hBackgrndBrush = CreateSolidBrush(color_btnface); | |
| hOldPen = (HPEN)SelectObject(hDC, (HANDLE)hFramePen); | |
| hOldBrush = (HBRUSH)SelectObject(hDC, (HANDLE)hBackgrndBrush); | |
| 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)); | |
| Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom); | |
| /* draw button label, if any: */ | |
| len = GetWindowText(hButton, text, sizeof text); | |
| if (len >= 1) { | |
| rc.left--; rc.bottom--; | |
| DrawText(hDC, text, len, &rc, | |
| DT_SINGLELINE | DT_CENTER| DT_VCENTER); | |
| } | |
| /* draw button highlight */ | |
| points[0].x = rc.left+2; | |
| points[0].y = rc.bottom; | |
| points[1].x = rc.left+4; | |
| points[1].y = rc.bottom-2; | |
| points[2].x = rc.left+4; | |
| points[2].y = rc.top+3; | |
| points[3].x = rc.right-3; | |
| points[3].y = rc.top+3; | |
| points[4].x = rc.right-1; | |
| points[4].y = rc.top+1; | |
| points[5].x = rc.left+2; | |
| points[5].y = rc.top+1; | |
| hHighlightBrush = CreateSolidBrush(color_btnhighlight); | |
| rgn2 = CreatePolygonRgn(points, DIM(points), ALTERNATE); | |
| CombineRgn(rgn, rgn1, rgn2, RGN_AND); | |
| FillRgn(hDC, rgn2, hHighlightBrush); | |
| /* draw button shadow: */ | |
| points[0].x = rc.left+2; | |
| points[0].y = rc.bottom; | |
| points[1].x = rc.left+4; | |
| points[1].y = rc.bottom-2; | |
| points[2].x = rc.right-3; | |
| points[2].y = rc.bottom-2; | |
| points[3].x = rc.right-3; | |
| points[3].y = rc.top+3; | |
| points[4].x = rc.right-1; | |
| points[4].y = rc.top; | |
| points[5].x = rc.right-1; | |
| points[5].y = rc.bottom; | |
| hShadowBrush = CreateSolidBrush(color_btnshadow); | |
| rgn2 = CreatePolygonRgn(points, DIM(points), ALTERNATE); | |
| CombineRgn(rgn, rgn1, rgn2, RGN_AND); | |
| FillRgn(hDC, rgn2, hShadowBrush); | |
| /* do we have the focus? */ | |
| if (len >= 1 && GetFocus() == hButton) { | |
| dwTextSize = GetTextExtent(hDC, text, len); | |
| delta = ((rc.right - rc.left) - LOWORD(dwTextSize) - 1) >> 1; | |
| rc.left += delta; rc.right -= delta; | |
| GetTextMetrics(hDC, &tm); | |
| delta = ((rc.bottom - rc.top) - tm.tmHeight - 1) >> 1; | |
| rc.top += delta; rc.bottom -= delta; | |
| DrawFocusRect(hDC, &rc); | |
| } | |
| SelectObject(hDC, (HANDLE)hOldPen); | |
| SelectObject(hDC, (HANDLE)hOldBrush); | |
| DeleteObject((HANDLE)hFramePen); | |
| DeleteObject((HANDLE)hShadowBrush); | |
| DeleteObject((HANDLE)hBackgrndBrush); | |
| DeleteObject((HANDLE)rgn1); | |
| DeleteObject((HANDLE)rgn2); | |
| DeleteObject((HANDLE)rgn); | |
| } | |
| static void DrawPressedPushButton(HDC hDC, HWND hButton, RECT rc) | |
| { | |
| HPEN hOldPen, hShadowPen, hFramePen; | |
| HBRUSH hOldBrush, hBackgrndBrush; | |
| HRGN rgn1, rgn2, rgn; | |
| int len; | |
| static char text[50+1]; | |
| DWORD dwTextSize; | |
| int delta; | |
| TEXTMETRIC tm; | |
| hFramePen = CreatePen(PS_SOLID, 1, color_windowframe); | |
| hBackgrndBrush = CreateSolidBrush(color_btnface); | |
| hOldBrush = (HBRUSH)SelectObject(hDC, (HANDLE)hBackgrndBrush); | |
| hOldPen = (HPEN)SelectObject(hDC, (HANDLE)hFramePen); | |
| SetBkMode(hDC, TRANSPARENT); | |
| /* give parent a chance to alter parameters: */ | |
| SendMessage(GetParent(hButton), WM_CTLCOLOR, (WORD)hDC, | |
| MAKELPARAM(hButton, CTLCOLOR_BTN)); | |
| Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom); | |
| /* draw button shadow: */ | |
| hShadowPen = CreatePen(PS_SOLID, 1, color_btnshadow); | |
| SelectObject(hDC, (HANDLE)hShadowPen); | |
| MoveTo(hDC, rc.left+1, rc.bottom-1); | |
| LineTo(hDC, rc.left+1, rc.top+1); | |
| LineTo(hDC, rc.right-1, rc.top+1); | |
| /* draw button label, if any: */ | |
| len = GetWindowText(hButton, text, sizeof text); | |
| if (len >= 1) { | |
| rc.top++; rc.left++; | |
| DrawText(hDC, text, len, &rc, | |
| DT_SINGLELINE | DT_CENTER| DT_VCENTER); | |
| } | |
| /* do we have the focus? */ | |
| if (len >= 1 && GetFocus() == hButton) { | |
| dwTextSize = GetTextExtent(hDC, text, len); | |
| delta = ((rc.right - rc.left) - LOWORD(dwTextSize) - 1) >> 1; | |
| rc.left += delta; rc.right -= delta; | |
| GetTextMetrics(hDC, &tm); | |
| delta = ((rc.bottom - rc.top) - tm.tmHeight - 1) >> 1; | |
| rc.top += delta; rc.bottom -= delta; | |
| DrawFocusRect(hDC, &rc); | |
| } | |
| SelectObject(hDC, (HANDLE)hOldPen); | |
| SelectObject(hDC, (HANDLE)hOldBrush); | |
| DeleteObject((HANDLE)hBackgrndBrush); | |
| DeleteObject(SelectObject(hDC, (HANDLE)hFramePen)); | |
| DeleteObject(SelectObject(hDC, (HANDLE)hShadowPen)); | |
| } | |
| /********************************************************************** | |
| * Check Box Functions | |
| */ | |
| static LONG CB_Paint(HWND hWnd) | |
| { | |
| PAINTSTRUCT ps; | |
| RECT rc, rc3; | |
| HDC hDC; | |
| HPEN hPen, hOldPen; | |
| HBRUSH hBrush, hGrayBrush; | |
| int textlen, delta; | |
| char *text; | |
| HANDLE hText; | |
| TEXTMETRIC tm; | |
| SIZE size; | |
| WND *wndPtr = WIN_FindWndPtr(hWnd); | |
| hDC = BeginPaint(hWnd, &ps); | |
| GetClientRect(hWnd, &rc); | |
| hPen = CreatePen(PS_SOLID, 1, color_windowtext); | |
| hOldPen = (HPEN)SelectObject(hDC, (HANDLE)hPen); | |
| 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 = LocalAlloc(LMEM_MOVEABLE, textlen+1); | |
| text = LocalLock(hText); | |
| GetWindowText(hWnd, text, textlen+1); | |
| 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; | |
| 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; | |
| DrawText(hDC, text, textlen, &rc, DT_SINGLELINE | DT_VCENTER); | |
| /* do we have the focus? */ | |
| if (GetFocus() == hWnd) | |
| { | |
| GetTextExtentPoint(hDC, text, textlen, &size); | |
| rc.top += delta - 1; | |
| rc.bottom -= delta + 1; | |
| rc.left--; | |
| rc.right = rc.left + size.cx + 2; | |
| DrawFocusRect(hDC, &rc); | |
| } | |
| LocalUnlock(hText); | |
| LocalFree(hText); | |
| GlobalUnlock(hWnd); | |
| EndPaint(hWnd, &ps); | |
| } | |
| 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; | |
| rc.right = tm.tmHeight; | |
| if (PtInRect(&rc, MAKEPOINT(lParam))) | |
| { | |
| /* SetFocus(hWnd); */ | |
| SetCapture(hWnd); | |
| pressed = TRUE; | |
| InvalidateRect(hWnd, NULL, FALSE); | |
| UpdateWindow(hWnd); | |
| } | |
| } | |
| 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; | |
| rc.right = tm.tmHeight; | |
| if (PtInRect(&rc, MAKEPOINT(lParam))) | |
| { | |
| style = wndPtr->dwStyle & 0x0000000F; | |
| if (style == BS_AUTOCHECKBOX) | |
| { | |
| switch ((WORD)(*(wndPtr->wExtra))) | |
| { | |
| case 0: | |
| (WORD)(*(wndPtr->wExtra)) = 1; | |
| break; | |
| case 1: | |
| (WORD)(*(wndPtr->wExtra)) = 0; | |
| break; | |
| } | |
| } | |
| else if (style == BS_AUTO3STATE) | |
| { | |
| switch ((WORD)(*(wndPtr->wExtra))) | |
| { | |
| case 0: | |
| (WORD)(*(wndPtr->wExtra)) = 1; | |
| break; | |
| case 1: | |
| (WORD)(*(wndPtr->wExtra)) = 2; | |
| break; | |
| case 2: | |
| (WORD)(*(wndPtr->wExtra)) = 0; | |
| break; | |
| } | |
| } | |
| NOTIFY_PARENT(hWnd, BN_CLICKED); | |
| } | |
| GlobalUnlock(hWnd); | |
| InvalidateRect(hWnd, NULL, FALSE); | |
| UpdateWindow(hWnd); | |
| } | |
| 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; | |
| rc.right = tm.tmHeight; | |
| if (PtInRect(&rc, MAKEPOINT(lParam))) | |
| NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED); | |
| } | |
| static LONG CB_KillFocus(HWND hWnd) | |
| { | |
| pressed = FALSE; | |
| InvalidateRect(hWnd, NULL, FALSE); | |
| UpdateWindow(hWnd); | |
| } | |
| static LONG CB_SetCheck(HWND hWnd, WORD wParam) | |
| { | |
| WND *wndPtr = WIN_FindWndPtr(hWnd); | |
| if ((WORD)(*(wndPtr->wExtra)) != wParam) | |
| { | |
| (WORD)(*(wndPtr->wExtra)) = wParam; | |
| InvalidateRect(hWnd, NULL, FALSE); | |
| UpdateWindow(hWnd); | |
| } | |
| GlobalUnlock(hWnd); | |
| } | |
| static LONG CB_GetCheck(HWND hWnd) | |
| { | |
| WORD wResult; | |
| WND *wndPtr = WIN_FindWndPtr(hWnd); | |
| wResult = (WORD)(*(wndPtr->wExtra)); | |
| GlobalUnlock(hWnd); | |
| return (LONG)wResult; | |
| } | |
| /********************************************************************** | |
| * Radio Button Functions | |
| */ | |
| static LONG RB_Paint(HWND hWnd) | |
| { | |
| PAINTSTRUCT ps; | |
| RECT rc; | |
| HDC hDC; | |
| HPEN hPen, hOldPen; | |
| HBRUSH hBrush, hOldBrush; | |
| int textlen, delta; | |
| char *text; | |
| HANDLE hText; | |
| TEXTMETRIC tm; | |
| SIZE size; | |
| WND *wndPtr = WIN_FindWndPtr(hWnd); | |
| hDC = BeginPaint(hWnd, &ps); | |
| GetClientRect(hWnd, &rc); | |
| hPen = CreatePen(PS_SOLID, 1, color_windowtext); | |
| hOldPen = (HPEN)SelectObject(hDC, (HANDLE)hPen); | |
| hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC, | |
| MAKELPARAM(hWnd, CTLCOLOR_BTN)); | |
| FillRect(hDC, &rc, hBrush); | |
| textlen = GetWindowTextLength(hWnd); | |
| hText = LocalAlloc(LMEM_MOVEABLE, textlen+1); | |
| text = LocalLock(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); | |
| if ((WORD)(*(wndPtr->wExtra)) == 1) | |
| { | |
| hBrush = CreateSolidBrush(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; | |
| DrawText(hDC, text, textlen, &rc, DT_SINGLELINE | DT_VCENTER); | |
| /* do we have the focus? */ | |
| if (GetFocus() == hWnd) | |
| { | |
| GetTextExtentPoint(hDC, text, textlen, &size); | |
| rc.top += delta - 1; | |
| rc.bottom -= delta + 1; | |
| rc.left--; | |
| rc.right = rc.left + size.cx + 2; | |
| DrawFocusRect(hDC, &rc); | |
| } | |
| LocalUnlock(hText); | |
| LocalFree(hText); | |
| GlobalUnlock(hWnd); | |
| EndPaint(hWnd, &ps); | |
| } | |
| 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; | |
| rc.right = tm.tmHeight; | |
| if (PtInRect(&rc, MAKEPOINT(lParam))) | |
| { | |
| /* SetFocus(hWnd); */ | |
| SetCapture(hWnd); | |
| pressed = TRUE; | |
| InvalidateRect(hWnd, NULL, FALSE); | |
| UpdateWindow(hWnd); | |
| } | |
| } | |
| 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; | |
| rc.right = tm.tmHeight; | |
| if (PtInRect(&rc, MAKEPOINT(lParam))) | |
| { | |
| style = wndPtr->dwStyle & 0x0000000F; | |
| if (style == BS_AUTORADIOBUTTON) | |
| (WORD)(*(wndPtr->wExtra)) = 1; | |
| NOTIFY_PARENT(hWnd, BN_CLICKED); | |
| } | |
| GlobalUnlock(hWnd); | |
| InvalidateRect(hWnd, NULL, FALSE); | |
| UpdateWindow(hWnd); | |
| } | |
| 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; | |
| rc.right = tm.tmHeight; | |
| if (PtInRect(&rc, MAKEPOINT(lParam))) | |
| NOTIFY_PARENT(hWnd, BN_DOUBLECLICKED); | |
| } | |
| static LONG RB_KillFocus(HWND hWnd) | |
| { | |
| pressed = FALSE; | |
| InvalidateRect(hWnd, NULL, FALSE); | |
| UpdateWindow(hWnd); | |
| } | |
| static LONG RB_SetCheck(HWND hWnd, WORD wParam) | |
| { | |
| WND *wndPtr = WIN_FindWndPtr(hWnd); | |
| if ((WORD)(*(wndPtr->wExtra)) != wParam) | |
| { | |
| (WORD)(*(wndPtr->wExtra)) = wParam; | |
| InvalidateRect(hWnd, NULL, FALSE); | |
| UpdateWindow(hWnd); | |
| } | |
| GlobalUnlock(hWnd); | |
| } | |
| static LONG RB_GetCheck(HWND hWnd) | |
| { | |
| WORD wResult; | |
| WND *wndPtr = WIN_FindWndPtr(hWnd); | |
| wResult = (WORD)(*(wndPtr->wExtra)); | |
| GlobalUnlock(hWnd); | |
| return (LONG)wResult; | |
| } | |
| /********************************************************************** | |
| * Group Box Functions | |
| */ | |
| static LONG GB_Paint(HWND hWnd) | |
| { | |
| PAINTSTRUCT ps; | |
| RECT rc; | |
| HDC hDC; | |
| HPEN hPen, hOldPen; | |
| HBRUSH hBrush; | |
| int textlen; | |
| char *text; | |
| HANDLE hText; | |
| SIZE size; | |
| hDC = BeginPaint(hWnd, &ps); | |
| GetClientRect(hWnd, &rc); | |
| hPen = CreatePen(PS_SOLID, 1, color_windowtext); | |
| hOldPen = (HPEN)SelectObject(hDC, (HANDLE)hPen); | |
| hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC, | |
| MAKELPARAM(hWnd, CTLCOLOR_BTN)); | |
| FillRect(hDC, &rc, hBrush); | |
| textlen = GetWindowTextLength(hWnd); | |
| hText = LocalAlloc(LMEM_MOVEABLE, textlen+1); | |
| text = LocalLock(hText); | |
| GetWindowText(hWnd, text, textlen+1); | |
| GetTextExtentPoint(hDC, text, textlen, &size); | |
| rc.top = 5; | |
| Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom); | |
| rc.left = 10; | |
| rc.top = 0; | |
| rc.right = rc.left + size.cx + 1; | |
| rc.bottom = size.cy; | |
| DrawText(hDC, text, textlen, &rc, DT_SINGLELINE); | |
| LocalUnlock(hText); | |
| LocalFree(hText); | |
| EndPaint(hWnd, &ps); | |
| } | |
| /********************************************************************** | |
| * User Button Functions | |
| */ | |
| static LONG UB_Paint(HWND hWnd) | |
| { | |
| PAINTSTRUCT ps; | |
| HDC hDC; | |
| RECT rc; | |
| HBRUSH hBrush; | |
| hDC = BeginPaint(hWnd, &ps); | |
| GetClientRect(hWnd, &rc); | |
| hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC, | |
| MAKELPARAM(hWnd, CTLCOLOR_BTN)); | |
| FillRect(hDC, &rc, hBrush); | |
| NOTIFY_PARENT(hWnd, BN_PAINT); | |
| /* do we have the focus? */ | |
| if (GetFocus() == hWnd) | |
| DrawFocusRect(hDC, &rc); | |
| EndPaint(hWnd, &ps); | |
| } | |
| 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); | |
| } | |
| static LONG UB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam) | |
| { | |
| RECT rc; | |
| ReleaseCapture(); | |
| GetClientRect(hWnd, &rc); | |
| if (PtInRect(&rc, MAKEPOINT(lParam))) | |
| NOTIFY_PARENT(hWnd, BN_UNHILITE); | |
| InvalidateRect(hWnd, NULL, FALSE); | |
| UpdateWindow(hWnd); | |
| } | |
| static LONG UB_KillFocus(HWND hWnd) | |
| { | |
| InvalidateRect(hWnd, NULL, FALSE); | |
| UpdateWindow(hWnd); | |
| } | |
| /********************************************************************** | |
| * Ownerdrawn Button Functions | |
| */ | |
| static LONG OB_Paint(HWND hWnd) | |
| { | |
| PAINTSTRUCT ps; | |
| HDC hDC; | |
| RECT rc; | |
| HANDLE hDis; | |
| LPDRAWITEMSTRUCT lpdis; | |
| WND *wndPtr = WIN_FindWndPtr(hWnd); | |
| hDC = BeginPaint(hWnd, &ps); | |
| GetClientRect(hWnd, &rc); | |
| hDis = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT)); | |
| lpdis = (LPDRAWITEMSTRUCT)USER_HEAP_ADDR(hDis); | |
| lpdis->hDC = hDC; | |
| lpdis->itemID = 0; | |
| CopyRect(&lpdis->rcItem, &rc); | |
| lpdis->CtlID = wndPtr->wIDmenu; | |
| lpdis->CtlType = ODT_BUTTON; | |
| lpdis->itemAction = ODA_DRAWENTIRE; | |
| /* printf("ownerdrawn button WM_DRAWITEM CtrlID=%X\n", lpdis->CtlID);*/ | |
| SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM)lpdis); | |
| USER_HEAP_FREE(hDis); | |
| EndPaint(hWnd, &ps); | |
| } | |
| 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); | |
| hDis = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(DRAWITEMSTRUCT)); | |
| lpdis = (LPDRAWITEMSTRUCT)USER_HEAP_ADDR(hDis); | |
| lpdis->hDC = hDC; | |
| lpdis->itemID = 0; | |
| CopyRect(&lpdis->rcItem, &rc); | |
| 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); | |
| } | |
| static LONG OB_LButtonUp(HWND hWnd, WORD wParam, LONG lParam) | |
| { | |
| HDC hDC; | |
| RECT rc; | |
| HANDLE hDis; | |
| LPDRAWITEMSTRUCT lpdis; | |
| WND *wndPtr = WIN_FindWndPtr(hWnd); | |
| ReleaseCapture(); | |
| hDC = GetDC(hWnd); | |
| 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; | |
| lpdis->itemID = 0; | |
| CopyRect(&lpdis->rcItem, &rc); | |
| 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); | |
| } | |
| static LONG OB_KillFocus(HWND hWnd) | |
| { | |
| InvalidateRect(hWnd, NULL, FALSE); | |
| UpdateWindow(hWnd); | |
| } | |