📄 button.c
字号:
else pCtrl->dwAddData2 &= ~BST_PUSHED; if (dwOldState != (pCtrl->dwAddData2 & BST_PUSHED)) InvalidateRect (hWnd, NULL, TRUE); } break; 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 = pCtrl->dwAddData2; if (LOBYTE(wParam) == '+' || LOBYTE(wParam) == '=') pCtrl->dwAddData2 |= BST_CHECKED; else if (LOBYTE(wParam) == '-') pCtrl->dwAddData2 &= ~BST_CHECKED; if (dwOldState != pCtrl->dwAddData2) 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_ERASEBKGND: if ((dwStyle & BS_TYPEMASK) != BS_OWNERDRAW) return 0; break; 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_GETFONT: break; case MSG_SETFONT: 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: pCtrl->dwAddData2 &= (~BST_FOCUS); if (GetCapture() == hWnd) { ReleaseCapture (); pCtrl->dwAddData2 &= (~BST_PUSHED); } hdc = GetClientDC (hWnd); btnGetRects (hWnd, dwStyle, &rcClient, &rcText, &rcBitmap); if (pCtrl->dwAddData2 & BST_PUSHED) { btnPaintPushedButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); btnPaintContent (pCtrl, hdc, dwStyle, &rcText); } btnPaintFocusButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); ReleaseDC (hdc); if (dwStyle & BS_NOTIFY) NotifyParent (hWnd, pCtrl->id, BN_KILLFOCUS); break; case MSG_SETFOCUS: pCtrl->dwAddData2 |= BST_FOCUS; hdc = GetClientDC (hWnd); btnGetRects (hWnd, dwStyle, &rcClient, &rcText, &rcBitmap); if (pCtrl->dwAddData2 & BST_PUSHED) { btnPaintPushedButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); btnPaintContent (pCtrl, hdc, dwStyle, &rcText); } btnPaintFocusButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); ReleaseDC (hdc); if ( ((dwStyle & BS_TYPEMASK) == BS_RADIOBUTTON) || ((dwStyle & BS_TYPEMASK) == BS_AUTORADIOBUTTON)) NotifyParent (hWnd, pCtrl->id, BN_SETFOCUS); break; case MSG_KEYDOWN: if (wParam != SCANCODE_SPACE) break; pCtrl->dwAddData2 |= BST_PUSHED; pCtrl->dwAddData2 |= BST_FOCUS; SetCapture (hWnd); hdc = GetClientDC (hWnd); btnGetRects (hWnd, dwStyle, &rcClient, &rcText, &rcBitmap); btnPaintPushedButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); btnPaintContent (pCtrl, hdc, dwStyle, &rcText); btnPaintFocusButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); ReleaseDC (hdc); NotifyParent (hWnd, pCtrl->id, BN_PUSHED); break; case MSG_KEYUP: { DWORD dwState; if (wParam != SCANCODE_SPACE || GetCapture () != hWnd) break; pCtrl->dwAddData2 &= ~BST_PUSHED; ReleaseCapture (); hdc = GetClientDC (hWnd); btnGetRects (hWnd, dwStyle, &rcClient, &rcText, &rcBitmap); btnPaintNormalButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); btnPaintContent (pCtrl, hdc, dwStyle, &rcText); btnPaintFocusButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); ReleaseDC (hdc); switch (pCtrl->dwStyle & BS_TYPEMASK) { case BS_AUTORADIOBUTTON: if (!(pCtrl->dwAddData2 & BST_CHECKED)) SendMessage (hWnd, BM_SETCHECK, BST_CHECKED, 0); // check this one and uncheck others. 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; } NotifyParent (hWnd, pCtrl->id, BN_CLICKED); NotifyParent (hWnd, pCtrl->id, BN_UNPUSHED); } break; case MSG_LBUTTONDBLCLK: if ( ((dwStyle & BS_TYPEMASK) == BS_RADIOBUTTON) || ((dwStyle & BS_TYPEMASK) == BS_OWNERDRAW)) NotifyParent (hWnd, pCtrl->id, BN_DBLCLK); break; case MSG_LBUTTONDOWN: if (GetCapture () == hWnd) break; SetCapture (hWnd); pCtrl->dwAddData2 |= BST_PUSHED; pCtrl->dwAddData2 |= BST_FOCUS; hdc = GetClientDC (hWnd); btnGetRects (hWnd, dwStyle, &rcClient, &rcText, &rcBitmap); btnPaintPushedButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); btnPaintContent (pCtrl, hdc, dwStyle, &rcText); btnPaintFocusButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); ReleaseDC (hdc); break; case MSG_LBUTTONUP: { int x, y; DWORD dwState; if (GetCapture() != hWnd) break; ReleaseCapture (); x = LOWORD(lParam); y = HIWORD(lParam); ScreenToClient (GetParent (hWnd), &x, &y); if (PtInRect ((PRECT) &(pCtrl->cl), x, y)) { 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; } pCtrl->dwAddData2 &= ~BST_PUSHED; InvalidateRect (hWnd, NULL, FALSE); SendMessage (hWnd, MSG_PAINT, 0, 0); NotifyParent (hWnd, pCtrl->id, BN_CLICKED); }#if 0 else if (pCtrl->dwAddData2 & BST_PUSHED) { pCtrl->dwAddData2 &= ~BST_PUSHED; InvalidateRect (hWnd, NULL, FALSE); }#endif } return 0; case MSG_MOUSEMOVE: { int x, y; if (GetCapture() != hWnd) break; x = LOWORD(lParam); y = HIWORD(lParam); ScreenToClient (GetParent (hWnd), &x, &y); if (PtInRect ((PRECT) &(pCtrl->cl), x, y)) { if ( !(pCtrl->dwAddData2 & BST_PUSHED) ) { pCtrl->dwAddData2 |= BST_PUSHED; hdc = GetClientDC (hWnd); btnGetRects (hWnd, dwStyle, &rcClient, &rcText, &rcBitmap); btnPaintPushedButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); btnPaintContent (pCtrl, hdc, dwStyle, &rcText); btnPaintFocusButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); ReleaseDC (hdc); } } else if (pCtrl->dwAddData2 & BST_PUSHED) { pCtrl->dwAddData2 &= ~BST_PUSHED; hdc = GetClientDC (hWnd); btnGetRects (hWnd, dwStyle, &rcClient, &rcText, &rcBitmap); if (pCtrl->dwAddData2 & BST_CHECKED) btnPaintCheckedButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); else if (pCtrl->dwAddData2 & BST_INDETERMINATE) btnPaintInterminateButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); else btnPaintNormalButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); btnPaintContent (pCtrl, hdc, dwStyle, &rcText); btnPaintFocusButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); ReleaseDC (hdc); } } break; case MSG_PAINT: { hdc = BeginPaint (hWnd); btnGetRects (hWnd, dwStyle, &rcClient, &rcText, &rcBitmap); if (pCtrl->dwAddData2 & BST_PUSHED) btnPaintPushedButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); else if (pCtrl->dwAddData2 & BST_CHECKED) btnPaintCheckedButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); else if (pCtrl->dwAddData2 & BST_INDETERMINATE) btnPaintInterminateButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); else btnPaintNormalButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); btnPaintContent (pCtrl, hdc, dwStyle, &rcText); if (pCtrl->dwAddData2 & BST_FOCUS) btnPaintFocusButton (pCtrl, hdc, dwStyle, &rcClient, &rcText, &rcBitmap); EndPaint (hWnd, hdc); } break; default: break; } return DefaultControlProc (hWnd, uMsg, wParam, lParam);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -