📄 button.c
字号:
/* case BS_DEFPUSHBUTTON: case BS_PUSHBUTTON: case BS_OWNERDRAW: break;*/ default: break; }}static void btnPaintInterminateButton (PCONTROL pCtrl, HDC hdc, DWORD dwStyle, RECT* prcClient, RECT* prcText, RECT* prcBitmap){ switch (dwStyle & BS_TYPEMASK) { case BS_3STATE: case BS_AUTO3STATE: if (dwStyle & BS_PUSHLIKE) { break; } FillBoxWithBitmapPart (hdc, prcBitmap->left, prcBitmap->top, BTN_WIDTH_BMP, BTN_HEIGHT_BMP, 0, 0, &sg_bmpButton, BTN_WIDTH_BMP << 1, 0); break;/* case BS_AUTORADIOBUTTON: case BS_RADIOBUTTON: case BS_AUTOCHECKBOX: case BS_CHECKBOX: case BS_DEFPUSHBUTTON: case BS_PUSHBUTTON: case BS_OWNERDRAW: break;*/ default: break; }}static void btnPaintPushedButton (PCONTROL pCtrl, HDC hdc, DWORD dwStyle, RECT* prcClient, RECT* prcText, RECT* prcBitmap){ switch (dwStyle & BS_TYPEMASK) { case BS_DEFPUSHBUTTON: case BS_PUSHBUTTON: Draw3DControlFrame (hdc, prcClient->left, prcClient->top, prcClient->right, prcClient->bottom, GetWindowBkColor ((HWND)pCtrl), FALSE); OffsetRect (prcText, 1, 1); break; case BS_AUTORADIOBUTTON: case BS_RADIOBUTTON: if (dwStyle & BS_PUSHLIKE) { Draw3DControlFrame (hdc, prcClient->left, prcClient->top, prcClient->right, prcClient->bottom, #if 0 GetWindowBkColor ((HWND)pCtrl),#else PIXEL_darkgray,#endif FALSE); OffsetRect (prcText, 1, 1); break; } if (pCtrl->dwAddData2 & BST_CHECKED) { FillBoxWithBitmapPart (hdc, prcBitmap->left, prcBitmap->top, BTN_WIDTH_BMP, BTN_HEIGHT_BMP, 0, 0, &sg_bmpButton, BTN_WIDTH_BMP * 3, BTN_HEIGHT_BMP); } else { FillBoxWithBitmapPart (hdc, prcBitmap->left, prcBitmap->top, BTN_WIDTH_BMP, BTN_HEIGHT_BMP, 0, 0, &sg_bmpButton, BTN_WIDTH_BMP << 1, BTN_HEIGHT_BMP); } break; case BS_3STATE: case BS_AUTO3STATE: case BS_AUTOCHECKBOX: case BS_CHECKBOX: if (dwStyle & BS_PUSHLIKE) { Draw3DControlFrame (hdc, prcClient->left, prcClient->top, prcClient->right, prcClient->bottom, #if 0 GetWindowBkColor ((HWND)pCtrl),#else PIXEL_darkgray,#endif FALSE); OffsetRect (prcText, 1, 1); break; } if (pCtrl->dwAddData2 & BST_CHECKED) { FillBoxWithBitmapPart (hdc, prcBitmap->left, prcBitmap->top, BTN_WIDTH_BMP, BTN_HEIGHT_BMP, 0, 0, &sg_bmpButton, BTN_WIDTH_BMP * 3, 0); } else { FillBoxWithBitmapPart (hdc, prcBitmap->left, prcBitmap->top, BTN_WIDTH_BMP, BTN_HEIGHT_BMP, 0, 0, &sg_bmpButton, BTN_WIDTH_BMP << 1, 0); } break;/* case BS_OWNERDRAW: break;*/ default: break; }}static void btnPaintFocusButton (PCONTROL pCtrl, HDC hdc, DWORD dwStyle, RECT* prcClient, RECT* prcText, RECT* prcBitmap){ RECT rcBounds; switch (dwStyle & BS_TYPEMASK) { case BS_DEFPUSHBUTTON: case BS_PUSHBUTTON: FocusRect (hdc, prcClient->left + BTN_WIDTH_BORDER, prcClient->top + BTN_WIDTH_BORDER, prcClient->right - BTN_WIDTH_BORDER, prcClient->bottom - BTN_WIDTH_BORDER); break; case BS_3STATE: case BS_AUTO3STATE: case BS_AUTOCHECKBOX: case BS_CHECKBOX: case BS_AUTORADIOBUTTON: case BS_RADIOBUTTON: if (dwStyle & BS_PUSHLIKE) { FocusRect (hdc, prcClient->left + BTN_WIDTH_BORDER, prcClient->top + BTN_WIDTH_BORDER, prcClient->right - BTN_WIDTH_BORDER, prcClient->bottom - BTN_WIDTH_BORDER); break; } btnGetTextBoundsRect (pCtrl, hdc, dwStyle, prcText, &rcBounds); FocusRect (hdc, rcBounds.left - 1, rcBounds.top - 1, rcBounds.right + 1, rcBounds.bottom + 1); break;/* case BS_OWNERDRAW: break;*/ default: break; }}static int btnUncheckOthers (PCONTROL pCtrl){ PCONTROL pGroupLeader = pCtrl; PCONTROL pOthers; DWORD dwType = pCtrl->dwStyle & BS_TYPEMASK; while (pGroupLeader) { if (pGroupLeader->dwStyle & WS_GROUP) break; pGroupLeader = pGroupLeader->prev; } pOthers = pGroupLeader; while (pOthers) { if ((pOthers->dwStyle & BS_TYPEMASK) != dwType) break; if ((pOthers != pCtrl) && (pOthers->dwAddData2 | BST_CHECKED)) { pOthers->dwAddData2 &= ~BST_CHECKED; InvalidateRect ((HWND)pOthers, NULL, FALSE); } pOthers = pOthers->next; } return pCtrl->id;}int ButtonCtrlProc (HWND hWnd, int uMsg, WPARAM wParam, LPARAM lParam){ HDC hdc; PCONTROL pCtrl; DWORD dwStyle; RECT rcClient; RECT rcText; RECT rcBitmap; pCtrl = Control(hWnd); dwStyle = pCtrl->dwStyle; switch(uMsg) { case MSG_NCCREATE: break; case MSG_CREATE: // load resource here. switch (dwStyle & BS_CONTENTMASK) { case BS_BITMAP: { PBITMAP pBmp = malloc (sizeof (BITMAP)); if (!pBmp) return -1; if (LoadBitmap (HDC_SCREEN, pBmp, pCtrl->spCaption) < 0) { free (pBmp); pCtrl->dwAddData = 0; } else pCtrl->dwAddData = (DWORD) pBmp; } break; case BS_ICON: pCtrl->dwAddData = (DWORD)LoadIconFromFile (HDC_SCREEN, pCtrl->spCaption, 0); break; default: pCtrl->dwAddData = 0; break; } // reset button state. pCtrl->dwAddData2 = 0; break; case MSG_DESTROY: if (pCtrl->dwAddData == 0) break; switch (dwStyle & BS_CONTENTMASK) { case BS_BITMAP: UnloadBitmap ((PBITMAP)(pCtrl->dwAddData)); free ((void*)pCtrl->dwAddData); break; case BS_ICON: DestroyIcon ((HICON)(pCtrl->dwAddData)); break; } break; case BM_CLICK: { DWORD dwState; switch (pCtrl->dwStyle & BS_TYPEMASK) { case BS_AUTORADIOBUTTON: if (!(pCtrl->dwAddData2 & BST_CHECKED)) SendMessage (hWnd, BM_SETCHECK, BST_CHECKED, 0); break; case BS_AUTOCHECKBOX: if (pCtrl->dwAddData2 & BST_CHECKED) dwState = BST_UNCHECKED; else dwState = BST_CHECKED; SendMessage (hWnd, BM_SETCHECK, (WPARAM)dwState, 0); break; case BS_AUTO3STATE: dwState = (pCtrl->dwAddData2 & 0x00000003L); dwState = BST_INDETERMINATE - dwState; SendMessage (hWnd, BM_SETCHECK, (WPARAM)dwState, 0); break; case BS_PUSHBUTTON: case BS_DEFPUSHBUTTON: break; } InvalidateRect (hWnd, NULL, FALSE); NotifyParent (hWnd, pCtrl->id, BN_CLICKED); } break; case BM_GETCHECK: switch (dwStyle & BS_TYPEMASK) { case BS_AUTOCHECKBOX: case BS_AUTORADIOBUTTON: case BS_CHECKBOX: case BS_RADIOBUTTON: return (pCtrl->dwAddData2 & BST_CHECKED); case BS_3STATE: case BS_AUTO3STATE: if (pCtrl->dwAddData2 & BST_INDETERMINATE) return (BST_INDETERMINATE); return (pCtrl->dwAddData2 & BST_CHECKED); default: return 0; } break; case BM_GETSTATE: return (int)(pCtrl->dwAddData2); break; case BM_GETIMAGE: if ((wParam == BM_IMAGE_BITMAP) && (dwStyle & BS_BITMAP)) return (int)(pCtrl->dwAddData); if ((wParam == BM_IMAGE_ICON) && (dwStyle & BS_ICON)) return (int)(pCtrl->dwAddData); break; case MSG_SETTEXT: FreeFixStr (pCtrl->spCaption); pCtrl->spCaption = FixStrAlloc (strlen((char*)lParam)); strcpy (pCtrl->spCaption, (char*)lParam); InvalidateRect (hWnd, NULL, TRUE); break; case BM_SETIMAGE: if ( ((wParam == BM_IMAGE_BITMAP) && (dwStyle & BS_BITMAP)) || ((wParam == BM_IMAGE_ICON) && (dwStyle & BS_ICON)) ) { int oldImage = (int)pCtrl->dwAddData; pCtrl->dwAddData = (DWORD)lParam; InvalidateRect (hWnd, NULL, TRUE); return oldImage; } break; case BM_SETCHECK: { DWORD dwOldState = pCtrl->dwAddData2; switch (dwStyle & BS_TYPEMASK) { case BS_CHECKBOX: case BS_AUTOCHECKBOX: if (wParam & BST_CHECKED) pCtrl->dwAddData2 |= BST_CHECKED; else pCtrl->dwAddData2 &= ~BST_CHECKED; break; case BS_AUTORADIOBUTTON: case BS_RADIOBUTTON: if ( ((pCtrl->dwAddData2 & BST_CHECKED) == 0) && (wParam & BST_CHECKED) ) { pCtrl->dwAddData2 |= BST_CHECKED; btnUncheckOthers (pCtrl); } else if ( (pCtrl->dwAddData2 & BST_CHECKED) && (!(wParam & BST_CHECKED)) ) { pCtrl->dwAddData2 &= ~BST_CHECKED; } break; case BS_3STATE: case BS_AUTO3STATE: switch (wParam) { case BST_INDETERMINATE: case BST_CHECKED: case BST_UNCHECKED: pCtrl->dwAddData2 &= 0xFFFFFFFC; pCtrl->dwAddData2 += (wParam & 0x00000003); } break; } if (dwOldState != pCtrl->dwAddData2) InvalidateRect (hWnd, NULL, TRUE); } break; case BM_SETSTATE: { DWORD dwOldState = pCtrl->dwAddData2 & BST_PUSHED; if (wParam) pCtrl->dwAddData2 |= BST_PUSHED;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -