[PATCH 1/2] comctl32: Add tests for split buttons.

Shu Yokoyama yokoyama at graco.c.u-tokyo.ac.jp
Sun Feb 5 18:54:20 CST 2017


On Windows, comctl32.dll version 6 is needed for these button styles.

Signed-off-by: Shu Yokoyama <yokoyama at graco.c.u-tokyo.ac.jp>
---
 dlls/comctl32/tests/button.c | 14 ++++++++++++--
 include/commctrl.h           | 46 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 58 insertions(+), 2 deletions(-)

diff --git a/dlls/comctl32/tests/button.c b/dlls/comctl32/tests/button.c
index 9977ce1..7f03273 100644
--- a/dlls/comctl32/tests/button.c
+++ b/dlls/comctl32/tests/button.c
@@ -528,6 +528,12 @@ static void test_button_messages(void)
         { BS_OWNERDRAW, DLGC_BUTTON,
           setfocus_ownerdraw_seq, killfocus_ownerdraw_seq, setstyle_ownerdraw_seq,
           setstate_ownerdraw_seq, clearstate_ownerdraw_seq, setcheck_ignored_seq },
+        { BS_SPLITBUTTON, DLGC_WANTARROWS | DLGC_BUTTON | DLGC_UNDEFPUSHBUTTON,
+          setfocus_seq, killfocus_seq, setstyle_seq,
+          setstate_seq, setstate_seq, setcheck_ignored_seq },
+        { BS_DEFSPLITBUTTON, DLGC_WANTARROWS | DLGC_BUTTON | DLGC_DEFPUSHBUTTON,
+          setfocus_seq, killfocus_seq, setstyle_seq,
+          setstate_seq, setstate_seq, setcheck_ignored_seq },
     };
     const struct message *seq;
     unsigned int i;
@@ -567,7 +573,9 @@ static void test_button_messages(void)
             ok(style == button[i].style, "expected style %x got %x\n", button[i].style, style);
 
         dlg_code = SendMessageA(hwnd, WM_GETDLGCODE, 0, 0);
-        ok(dlg_code == button[i].dlg_code, "%u: wrong dlg_code %08x\n", i, dlg_code);
+        ok(dlg_code == button[i].dlg_code
+          || broken(button[i].style>=BS_SPLITBUTTON && dlg_code == 0x2000) /* XP */ ,
+            "%u: wrong dlg_code %08x\n", i, dlg_code);
 
         ShowWindow(hwnd, SW_SHOW);
         UpdateWindow(hwnd);
@@ -669,7 +677,9 @@ static void test_button_messages(void)
             button[i].style == BS_DEFPUSHBUTTON ||
             button[i].style == BS_GROUPBOX ||
             button[i].style == BS_USERBUTTON ||
-            button[i].style == BS_OWNERDRAW)
+            button[i].style == BS_OWNERDRAW ||
+            button[i].style == BS_SPLITBUTTON ||
+            button[i].style == BS_DEFSPLITBUTTON )
         {
             ok_sequence(sequences, COMBINED_SEQ_INDEX, button[i].setcheck, "BM_SETCHECK on a button", FALSE);
             state = SendMessageA(hwnd, BM_GETCHECK, 0, 0);
diff --git a/include/commctrl.h b/include/commctrl.h
index d176b4f..5d30556 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -1042,12 +1042,58 @@ typedef struct tagNMBCHOTITEM
 
 #define BST_HOT                 0x0200
 
+#define BST_DROPDOWNPUSHED      0x0400
+
 /* Button control styles for _WIN32_WINNT >= 0x600 */
 #define BS_SPLITBUTTON          0x0000000C
 #define BS_DEFSPLITBUTTON       0x0000000D
 #define BS_COMMANDLINK          0x0000000E
 #define BS_DEFCOMMANDLINK       0x0000000F
 
+typedef struct tagBUTTON_SPLITINFO
+{
+  UINT mask;
+  HIMAGELIST himlGlyph;
+  UINT uSplitStyle;
+  SIZE size;
+} BUTTON_SPLITINFO, *PBUTTON_SPLITINFO;
+
+/* BUTTON_SPLITINFO mask */
+#define BCSIF_GLYPH             0x1
+#define BCSIF_IMAGE             0x2
+#define BCSIF_STYLE             0x4
+#define BCSIF_SIZE              0x8
+
+/* BUTTON_SPLITINFO uSplitStyle */
+#define BCSS_NOSPLIT            0x1
+#define BCSS_STRETCH            0x2
+#define BCSS_ALIGNLEFT          0x4
+#define BCSS_IMAGE              0x8
+
+/* Button control messages */
+#define BCM_FIRST               0x1600
+
+#define BCM_SETDROPDOWNSTATE    (BCM_FIRST+6)
+#define BCM_SETSPLITINFO        (BCM_FIRST+7)
+#define BCM_GETSPLITINFO        (BCM_FIRST+8)
+#define BCM_SETNOTE             (BCM_FIRST+9)
+#define BCM_GETNOTE             (BCM_FIRST+10)
+#define BCM_GETNOTELENGTH       (BCM_FIRST+11)
+
+#define Button_SetDropDownState(hwnd, fDropDown) \
+  (BOOL)SNDMSG((hwnd), BCM_SETDROPDOWNSTATE, (WPARAM)(fDropDown), 0)
+
+
+typedef struct tagNMBCDROPDOWN
+{
+  NMHDR hdr;
+  RECT  rcButton;
+} NMBCDROPDOWN, *LPNMBCDROPDOWN;
+
+#define BCN_DROPDOWN  (BCN_FIRST+2)
+
+
+
 /* Toolbar */
 
 #define TOOLBARCLASSNAMEA       "ToolbarWindow32"
-- 
2.9.3




More information about the wine-patches mailing list