diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-06-11 11:19:59 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-06-11 11:19:59 +0200 |
| commit | c41f9dd8ddb935b54f0f57420466e2fc428d61ec (patch) | |
| tree | 4df81928cf111db107aac378a2a37f13f0a5d21a | |
| parent | be3ddf7cb2400f2a744799303ebe05d4caba54c3 (diff) | |
classic button checkbox: implement checking/unchecking with +-= keys
| -rw-r--r-- | alf/alfbutton.cpp | 67 |
1 files changed, 47 insertions, 20 deletions
diff --git a/alf/alfbutton.cpp b/alf/alfbutton.cpp index abdf162..17ff1b0 100644 --- a/alf/alfbutton.cpp +++ b/alf/alfbutton.cpp @@ -1252,6 +1252,32 @@ ALF_ClassicButton_FixRadioButtonCheck(HWND hwnd, ALFClassicButtonPriv *priv, BOO } } +static void +ALF_ClassicButton_HandleClick(ALFClassicButtonPriv *priv, HWND hwnd) +{ + if (priv->flags & ALF_CLSCBTN_FLAG_DRAW_CHECKBOX) { + if (priv->flags & ALF_CLSCBTN_FLAG_IS_CHECKED) { + priv->flags &= ~ALF_CLSCBTN_FLAG_IS_CHECKED; + } else { + priv->flags |= ALF_CLSCBTN_FLAG_IS_CHECKED; + } + + RECT rcCheck; + RECT rcClient; + GetClientRect(hwnd, &rcClient); + + rcCheck.left = 0; + rcCheck.top = 0; + rcCheck.right = 13; + rcCheck.bottom = rcClient.bottom - rcClient.top; + InvalidateRect(hwnd, &rcCheck, TRUE); + } else if (priv->flags & ALF_CLSCBTN_FLAG_DRAW_RADIO) { + priv->flags |= ALF_CLSCBTN_FLAG_IS_CHECKED; + InvalidateRect(hwnd, NULL, TRUE); + ALF_ClassicButton_FixRadioButtonCheck(hwnd, priv, TRUE); + } +} + static LRESULT CALLBACK ALF_ClassicButton_WndProc(ALFClassicButtonPriv *priv, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -1268,26 +1294,8 @@ ALF_ClassicButton_WndProc(ALFClassicButtonPriv *priv, HWND hwnd, UINT uMsg, WPAR return TRUE; } else if (uMsg == 0x2000 + WM_COMMAND) { - if (HIWORD(wParam) == BN_CLICKED && priv->flags & ALF_CLSCBTN_FLAG_DRAW_CHECKBOX) { - if (priv->flags & ALF_CLSCBTN_FLAG_IS_CHECKED) { - priv->flags &= ~ALF_CLSCBTN_FLAG_IS_CHECKED; - } else { - priv->flags |= ALF_CLSCBTN_FLAG_IS_CHECKED; - } - - RECT rcCheck; - RECT rcClient; - GetClientRect(hwnd, &rcClient); - - rcCheck.left = 0; - rcCheck.top = 0; - rcCheck.right = 13; - rcCheck.bottom = rcClient.bottom - rcClient.top; - InvalidateRect(hwnd, &rcCheck, TRUE); - } else if (HIWORD(wParam) == BN_CLICKED && priv->flags & ALF_CLSCBTN_FLAG_DRAW_RADIO) { - priv->flags |= ALF_CLSCBTN_FLAG_IS_CHECKED; - InvalidateRect(hwnd, NULL, TRUE); - ALF_ClassicButton_FixRadioButtonCheck(hwnd, priv, TRUE); + if (HIWORD(wParam) == BN_CLICKED) { + ALF_ClassicButton_HandleClick(priv, hwnd); } } else if (uMsg == WM_ERASEBKGND) { return TRUE; @@ -1314,6 +1322,11 @@ ALF_ClassicButton_WndProc(ALFClassicButtonPriv *priv, HWND hwnd, UINT uMsg, WPAR } } else if (uMsg == WM_GETDLGCODE) { if (priv->flags & ALF_CLSCBTN_FLAG_DRAW_CHECKBOX) { + if (lParam && ((MSG *)lParam)->message == WM_CHAR && ( + ((MSG *)lParam)->wParam == '+' || ((MSG *)lParam)->wParam == '-' || ((MSG *)lParam)->wParam == '=')) { + return DLGC_WANTCHARS | DLGC_BUTTON; + } + return (LRESULT)DLGC_BUTTON; } else if (priv->flags & ALF_CLSCBTN_FLAG_DRAW_RADIO) { return (LRESULT)DLGC_RADIOBUTTON; @@ -1331,6 +1344,20 @@ ALF_ClassicButton_WndProc(ALFClassicButtonPriv *priv, HWND hwnd, UINT uMsg, WPAR } else if (uMsg == WM_SETFONT) { ALF_InvalidateLayout(GetParent(hwnd)); InvalidateRect(hwnd, NULL, TRUE); + } else if (uMsg == WM_CHAR) { + if (priv->flags & ALF_CLSCBTN_FLAG_DRAW_CHECKBOX) { + if (wParam == '+' || wParam == '=') { + // check + if (!(priv->flags & ALF_CLSCBTN_FLAG_IS_CHECKED)) { + ALF_ClassicButton_HandleClick(priv, hwnd); + } + } else if (wParam == '-') { + // uncheck + if (priv->flags & ALF_CLSCBTN_FLAG_IS_CHECKED) { + ALF_ClassicButton_HandleClick(priv, hwnd); + } + } + } } else if (uMsg == WM_DESTROY) { WNDPROC o = priv->origWndProc; SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)o); |
