📄 button.c
字号:
} NotifyParent (hWnd, pCtrl->id, BN_CLICKED); InvalidateRect (hWnd, NULL, TRUE); } break; case MSG_SETTEXT: { int len = strlen((char*)lParam); FreeFixStr (pCtrl->spCaption); pCtrl->spCaption = FixStrAlloc (len); if (len > 0) strcpy (pCtrl->spCaption, (char*)lParam); InvalidateRect (hWnd, NULL, TRUE); break; } case BM_SETCHECK: { DWORD dwOldState = BUTTON_STATUS (pCtrl); switch (dwStyle & BS_TYPEMASK) { case BS_CHECKBOX: case BS_AUTOCHECKBOX: if (wParam & BST_CHECKED) BUTTON_STATUS(pCtrl) |= BST_CHECKED; else BUTTON_STATUS(pCtrl) &= ~BST_CHECKED; break; case BS_AUTORADIOBUTTON: case BS_RADIOBUTTON: if ( ((BUTTON_STATUS(pCtrl) & BST_CHECKED) == 0) && (wParam & BST_CHECKED) ) { BUTTON_STATUS(pCtrl) |= BST_CHECKED; btnUncheckOthers (pCtrl); } else if ( (BUTTON_STATUS(pCtrl) & BST_CHECKED) && (!(wParam & BST_CHECKED)) ) { BUTTON_STATUS(pCtrl) &= ~BST_CHECKED; } break; case BS_3STATE: case BS_AUTO3STATE: switch (wParam) { case BST_INDETERMINATE: case BST_CHECKED: case BST_UNCHECKED: BUTTON_STATUS(pCtrl) &= 0xFFFFFFFC; BUTTON_STATUS(pCtrl) += (wParam & 0x00000003); } break; } if (dwOldState != BUTTON_STATUS(pCtrl)) InvalidateRect (hWnd, NULL, TRUE); return dwOldState; } case BM_SETSTATE: { DWORD dwOldState = BUTTON_STATUS(pCtrl) & BST_PUSHED; if (wParam) BUTTON_STATUS(pCtrl) |= BST_PUSHED; else BUTTON_STATUS(pCtrl) &= ~BST_PUSHED; if (dwOldState != (BUTTON_STATUS(pCtrl) & BST_PUSHED)) InvalidateRect (hWnd, NULL, TRUE); return dwOldState; } case BM_SETSTYLE: pCtrl->dwStyle &= 0xFFFF0000; pCtrl->dwStyle |= (DWORD)(wParam & 0x0000FFFF); if (LOWORD (lParam)) InvalidateRect (hWnd, NULL, TRUE); break; case MSG_CHAR: if (HIBYTE (wParam) == 0 && ((dwStyle & BS_TYPEMASK) == BS_CHECKBOX || (dwStyle & BS_TYPEMASK) == BS_AUTOCHECKBOX)) { DWORD dwOldState = BUTTON_STATUS(pCtrl); if (LOBYTE(wParam) == '+' || LOBYTE(wParam) == '=') BUTTON_STATUS(pCtrl) |= BST_CHECKED; else if (LOBYTE(wParam) == '-') BUTTON_STATUS(pCtrl) &= ~BST_CHECKED; if (dwOldState != BUTTON_STATUS(pCtrl)) InvalidateRect (hWnd, NULL, TRUE); } break; case MSG_ENABLE: if (wParam && (dwStyle & WS_DISABLED)) pCtrl->dwStyle &= ~WS_DISABLED; else if (!wParam && !(dwStyle & WS_DISABLED)) pCtrl->dwStyle |= WS_DISABLED; else return 0; InvalidateRect (hWnd, NULL, TRUE); return 0; case MSG_GETDLGCODE: switch (dwStyle & BS_TYPEMASK) { case BS_CHECKBOX: case BS_AUTOCHECKBOX: return DLGC_WANTCHARS | DLGC_BUTTON; case BS_RADIOBUTTON: case BS_AUTORADIOBUTTON: return DLGC_RADIOBUTTON | DLGC_BUTTON; case BS_DEFPUSHBUTTON: return DLGC_DEFPUSHBUTTON; case BS_PUSHBUTTON: return DLGC_PUSHBUTTON; case BS_3STATE: case BS_AUTO3STATE: return DLGC_3STATE; default: return 0; } break; case MSG_NCHITTEST: { int x, y; x = (int)wParam; y = (int)lParam; if (PtInRect ((PRECT) &(pCtrl->cl), x, y)) return HT_CLIENT; else return HT_OUT; } break; case MSG_KILLFOCUS: BUTTON_STATUS(pCtrl) &= (~BST_FOCUS); if (GetCapture() == hWnd) { ReleaseCapture (); BUTTON_STATUS(pCtrl) &= (~BST_PUSHED); } if (dwStyle & BS_NOTIFY) NotifyParent (hWnd, pCtrl->id, BN_KILLFOCUS); InvalidateRect (hWnd, NULL, TRUE); break; case MSG_SETFOCUS: BUTTON_STATUS(pCtrl) |= BST_FOCUS; if (dwStyle & BS_NOTIFY) NotifyParent (hWnd, pCtrl->id, BN_SETFOCUS); InvalidateRect (hWnd, NULL, TRUE); break; case MSG_KEYDOWN: if (wParam != SCANCODE_SPACE && wParam != SCANCODE_ENTER) break; if (GetCapture () == hWnd) break; SetCapture (hWnd); BUTTON_STATUS(pCtrl) |= BST_PUSHED; BUTTON_STATUS(pCtrl) |= BST_FOCUS; if (dwStyle & BS_NOTIFY) NotifyParent (hWnd, pCtrl->id, BN_PUSHED); InvalidateRect (hWnd, NULL, TRUE); break; case MSG_KEYUP: { DWORD dwState; if (wParam != SCANCODE_SPACE && wParam != SCANCODE_ENTER) break; if (GetCapture () != hWnd) break; BUTTON_STATUS(pCtrl) &= ~BST_PUSHED; ReleaseCapture (); InvalidateRect (hWnd, NULL, TRUE); 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 = (dwState + 1) % 3; SendMessage (hWnd, BM_SETCHECK, (WPARAM)dwState, 0); break; case BS_PUSHBUTTON: case BS_DEFPUSHBUTTON: break; } NotifyParent (hWnd, pCtrl->id, BN_CLICKED); if (dwStyle & BS_NOTIFY) NotifyParent (hWnd, pCtrl->id, BN_UNPUSHED); } break; case MSG_LBUTTONDBLCLK: if (dwStyle & BS_NOTIFY) NotifyParent (hWnd, pCtrl->id, BN_DBLCLK); break; case MSG_LBUTTONDOWN: if (GetCapture () == hWnd) break; SetCapture (hWnd); BUTTON_STATUS(pCtrl) |= BST_PUSHED; BUTTON_STATUS(pCtrl) |= BST_FOCUS; if (dwStyle & BS_NOTIFY) NotifyParent (hWnd, pCtrl->id, BN_PUSHED); InvalidateRect (hWnd, NULL, TRUE); break; case MSG_LBUTTONUP: { int x, y; DWORD dwState; if (GetCapture() != hWnd) break; ReleaseCapture (); x = LOSWORD(lParam); y = HISWORD(lParam); ScreenToClient (GetParent (hWnd), &x, &y); if (PtInRect ((PRECT) &(pCtrl->cl), x, y)) { 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 = (dwState + 1) % 3; SendMessage (hWnd, BM_SETCHECK, (WPARAM)dwState, 0); break; case BS_PUSHBUTTON: case BS_DEFPUSHBUTTON: break; } BUTTON_STATUS(pCtrl) &= ~BST_PUSHED; if (dwStyle & BS_NOTIFY) NotifyParent (hWnd, pCtrl->id, BN_UNPUSHED); NotifyParent (hWnd, pCtrl->id, BN_CLICKED); InvalidateRect (hWnd, NULL, TRUE); } else if (BUTTON_STATUS(pCtrl) & BST_PUSHED) { BUTTON_STATUS(pCtrl) &= ~BST_PUSHED; if (dwStyle & BS_NOTIFY) NotifyParent (hWnd, pCtrl->id, BN_UNPUSHED); InvalidateRect (hWnd, NULL, TRUE); } } return 0; case MSG_MOUSEMOVE: { int x, y; if (GetCapture() != hWnd) break; x = LOSWORD(lParam); y = HISWORD(lParam); ScreenToClient (GetParent (hWnd), &x, &y); if (PtInRect ((PRECT) &(pCtrl->cl), x, y)) { if ( !(BUTTON_STATUS(pCtrl) & BST_PUSHED) ) { BUTTON_STATUS(pCtrl) |= BST_PUSHED; if (dwStyle & BS_NOTIFY) NotifyParent (hWnd, pCtrl->id, BN_PUSHED); InvalidateRect (hWnd, NULL, TRUE); } } else if (BUTTON_STATUS(pCtrl) & BST_PUSHED) { BUTTON_STATUS(pCtrl) &= ~BST_PUSHED; if (dwStyle & BS_NOTIFY) NotifyParent (hWnd, pCtrl->id, BN_UNPUSHED); InvalidateRect (hWnd, NULL, TRUE); } } break; case MSG_PAINT: { hdc = BeginPaint (hWnd); btnGetRects (hWnd, dwStyle, &rcClient, &rcText, &rcBitmap); if (BUTTON_STATUS(pCtrl) & BST_PUSHED) btnPaintPushedButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); else if (BUTTON_STATUS(pCtrl) & BST_CHECKED) btnPaintCheckedButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); else if (BUTTON_STATUS(pCtrl) & BST_INDETERMINATE) btnPaintInterminateButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); else btnPaintNormalButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); btnPaintContent (pCtrl, hdc, dwStyle, &rcText); if (BUTTON_STATUS(pCtrl) & BST_FOCUS) btnPaintFocusButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); EndPaint (hWnd, hdc); } return 0; default: break; } return DefaultControlProc (hWnd, uMsg, wParam, lParam);}#endif /* _CTRL_BUTTON */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -