summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--alf/alfbutton.cpp67
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);