📄 button.c
字号:
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;
}
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 + -