📄 button.c
字号:
static void btnPaintCheckedButton (PCONTROL pCtrl, HDC hdc, DWORD dwStyle, RECT* prcClient, RECT* prcText, RECT* prcBitmap){ switch (dwStyle & BS_TYPEMASK) { case BS_AUTORADIOBUTTON: case BS_RADIOBUTTON: if (dwStyle & BS_PUSHLIKE) { Draw3DControlFrame (hdc, prcClient->left, prcClient->top, prcClient->right, prcClient->bottom, PIXEL_darkgray, FALSE); break; } if (dwStyle & WS_DISABLED) { FillBoxWithBitmapPart (hdc, prcBitmap->left, prcBitmap->top, BTN_WIDTH_BMP, BTN_HEIGHT_BMP, 0, 0, BUTTON_BMP, (BTN_WIDTH_BMP << 2), BTN_HEIGHT_BMP); } else { FillBoxWithBitmapPart (hdc, prcBitmap->left, prcBitmap->top, BTN_WIDTH_BMP, BTN_HEIGHT_BMP, 0, 0, BUTTON_BMP, BTN_WIDTH_BMP, 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, PIXEL_darkgray, FALSE); break; } if (dwStyle & WS_DISABLED) { FillBoxWithBitmapPart (hdc, prcBitmap->left, prcBitmap->top, BTN_WIDTH_BMP, BTN_HEIGHT_BMP, 0, 0, BUTTON_BMP, BTN_WIDTH_BMP << 2, 0); } else { FillBoxWithBitmapPart (hdc, prcBitmap->left, prcBitmap->top, BTN_WIDTH_BMP, BTN_HEIGHT_BMP, 0, 0, BUTTON_BMP, BTN_WIDTH_BMP, 0); } break;/* 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, BUTTON_BMP, 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, PIXEL_darkgray, FALSE); OffsetRect (prcText, 1, 1); break; } if (BUTTON_STATUS(pCtrl) & BST_CHECKED) { FillBoxWithBitmapPart (hdc, prcBitmap->left, prcBitmap->top, BTN_WIDTH_BMP, BTN_HEIGHT_BMP, 0, 0, BUTTON_BMP, BTN_WIDTH_BMP * 3, BTN_HEIGHT_BMP); } else { FillBoxWithBitmapPart (hdc, prcBitmap->left, prcBitmap->top, BTN_WIDTH_BMP, BTN_HEIGHT_BMP, 0, 0, BUTTON_BMP, 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, PIXEL_darkgray, FALSE); OffsetRect (prcText, 1, 1); break; } if (BUTTON_STATUS (pCtrl) & BST_CHECKED) { FillBoxWithBitmapPart (hdc, prcBitmap->left, prcBitmap->top, BTN_WIDTH_BMP, BTN_HEIGHT_BMP, 0, 0, BUTTON_BMP, BTN_WIDTH_BMP * 3, 0); } else { FillBoxWithBitmapPart (hdc, prcBitmap->left, prcBitmap->top, BTN_WIDTH_BMP, BTN_HEIGHT_BMP, 0, 0, BUTTON_BMP, 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; SetPenColor (hdc, PIXEL_darkgray); 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 type = pCtrl->dwStyle & BS_TYPEMASK; while (pGroupLeader) { if (pGroupLeader->dwStyle & WS_GROUP) break; pGroupLeader = pGroupLeader->prev; } pOthers = pGroupLeader; while (pOthers) { if ((pOthers->dwStyle & BS_TYPEMASK) != type) break; if ((pOthers != pCtrl) && (BUTTON_STATUS (pOthers) | BST_CHECKED)) { BUTTON_STATUS (pOthers) &= ~BST_CHECKED; InvalidateRect ((HWND)pOthers, NULL, TRUE); } pOthers = pOthers->next; } return pCtrl->id;}static int ButtonCtrlProc (HWND hWnd, int uMsg, WPARAM wParam, LPARAM lParam){ HDC hdc; PCONTROL pCtrl; DWORD dwStyle; RECT rcClient; RECT rcText; RECT rcBitmap; PBUTTONDATA pData; pCtrl = Control(hWnd); dwStyle = pCtrl->dwStyle; switch(uMsg) { case MSG_CREATE: pData = (BUTTONDATA*) calloc (1, sizeof(BUTTONDATA)); if (pData == NULL) return -1; pData->status = 0; pData->data = pCtrl->dwAddData; pCtrl->dwAddData2 = (DWORD) pData; switch (dwStyle & BS_TYPEMASK) { case BS_PUSHBUTTON: case BS_DEFPUSHBUTTON: SetWindowBkColor (hWnd, GetWindowElementColor (BKC_BUTTON)); break; default: if (dwStyle & BS_CHECKED) pData->status |= BST_CHECKED; break; } break; case MSG_DESTROY: free ((void*) pCtrl->dwAddData2); break; case BM_GETCHECK: switch (dwStyle & BS_TYPEMASK) { case BS_AUTOCHECKBOX: case BS_AUTORADIOBUTTON: case BS_CHECKBOX: case BS_RADIOBUTTON: return (BUTTON_STATUS (pCtrl) & BST_CHECKED); case BS_3STATE: case BS_AUTO3STATE: if (BUTTON_STATUS (pCtrl) & BST_INDETERMINATE) return (BST_INDETERMINATE); return (BUTTON_STATUS (pCtrl) & BST_CHECKED); default: return 0; } break; case BM_GETSTATE: return (int)(BUTTON_STATUS (pCtrl)); case BM_GETIMAGE: { int* image_type = (int*) wParam; if (dwStyle & BS_BITMAP) { if (image_type) { *image_type = BM_IMAGE_BITMAP; } return (int)(BUTTON_DATA (pCtrl)); } else if (dwStyle & BS_ICON) { if (image_type) { *image_type = BM_IMAGE_ICON; } return (int)(BUTTON_DATA (pCtrl)); } } return 0; case BM_SETIMAGE: { int oldImage = (int)BUTTON_DATA (pCtrl); if (wParam == BM_IMAGE_BITMAP) { pCtrl->dwStyle &= ~BS_ICON; pCtrl->dwStyle |= BS_BITMAP; } else if (wParam == BM_IMAGE_ICON){ pCtrl->dwStyle &= ~BS_BITMAP; pCtrl->dwStyle |= BS_ICON; } if (lParam) { BUTTON_DATA (pCtrl) = (DWORD)lParam; InvalidateRect (hWnd, NULL, TRUE); } return oldImage; } break; case BM_CLICK: { DWORD dwState; switch (pCtrl->dwStyle & BS_TYPEMASK) { case BS_AUTORADIOBUTTON: if (!(BUTTON_STATUS (pCtrl) & BST_CHECKED)) SendMessage (hWnd, BM_SETCHECK, BST_CHECKED, 0); break; case BS_AUTOCHECKBOX: if (BUTTON_STATUS (pCtrl) & BST_CHECKED) dwState = BST_UNCHECKED; else dwState = BST_CHECKED; SendMessage (hWnd, BM_SETCHECK, (WPARAM)dwState, 0); break; case BS_AUTO3STATE: dwState = (BUTTON_STATUS (pCtrl) & 0x00000003L); dwState = BST_INDETERMINATE - dwState; SendMessage (hWnd, BM_SETCHECK, (WPARAM)dwState, 0); break; case BS_PUSHBUTTON: case BS_DEFPUSHBUTTON: break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -