comctl32: When created with TCS_VERTICAL, TCS_MULTILINE is set automatically

Nikolay Sivov nsivov at codeweavers.com
Thu May 17 01:56:10 CDT 2012


Spotted here http://bugs.winehq.org/show_bug.cgi?id=30553
-------------- next part --------------
>From 179a6e1024b10b8e8eff990cb5cb14495a4e8d9b Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Thu, 17 May 2012 10:53:45 +0400
Subject: [PATCH 2/2] When created with TCS_VERTICAL, TCS_MULTILINE is set automatically

---
 dlls/comctl32/tab.c       |   12 +++++++-----
 dlls/comctl32/tests/tab.c |   31 +++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/dlls/comctl32/tab.c b/dlls/comctl32/tab.c
index f00ecd3..43d8cdf 100644
--- a/dlls/comctl32/tab.c
+++ b/dlls/comctl32/tab.c
@@ -3020,7 +3020,7 @@ static LRESULT TAB_Create (HWND hwnd, LPARAM lParam)
   TEXTMETRICW fontMetrics;
   HDC hdc;
   HFONT hOldFont;
-  DWORD dwStyle;
+  DWORD style;
 
   infoPtr = Alloc (sizeof(TAB_INFO));
 
@@ -3054,11 +3054,13 @@ static LRESULT TAB_Create (HWND hwnd, LPARAM lParam)
   /* The tab control always has the WS_CLIPSIBLINGS style. Even
      if you don't specify it in CreateWindow. This is necessary in
      order for paint to work correctly. This follows windows behaviour. */
-  dwStyle = GetWindowLongW(hwnd, GWL_STYLE);
-  SetWindowLongW(hwnd, GWL_STYLE, dwStyle|WS_CLIPSIBLINGS);
+  style = GetWindowLongW(hwnd, GWL_STYLE);
+  if (style & TCS_VERTICAL) style |= TCS_MULTILINE;
+  style |= WS_CLIPSIBLINGS;
+  SetWindowLongW(hwnd, GWL_STYLE, style);
 
-  infoPtr->dwStyle = dwStyle | WS_CLIPSIBLINGS;
-  infoPtr->exStyle = (dwStyle & TCS_FLATBUTTONS) ? TCS_EX_FLATSEPARATORS : 0;
+  infoPtr->dwStyle = style;
+  infoPtr->exStyle = (style & TCS_FLATBUTTONS) ? TCS_EX_FLATSEPARATORS : 0;
 
   if (infoPtr->dwStyle & TCS_TOOLTIPS) {
     /* Create tooltip control */
diff --git a/dlls/comctl32/tests/tab.c b/dlls/comctl32/tests/tab.c
index 36179dc..0166778 100644
--- a/dlls/comctl32/tests/tab.c
+++ b/dlls/comctl32/tests/tab.c
@@ -1428,6 +1428,36 @@ static void test_WM_CONTEXTMENU(void)
     DestroyWindow(hTab);
 }
 
+struct tabcreate_style {
+    DWORD style;
+    DWORD act_style;
+};
+
+static const struct tabcreate_style create_styles[] =
+{
+    { WS_CHILD|TCS_BOTTOM|TCS_VERTICAL, WS_CHILD|WS_CLIPSIBLINGS|TCS_BOTTOM|TCS_VERTICAL|TCS_MULTILINE },
+    { WS_CHILD|TCS_VERTICAL,            WS_CHILD|WS_CLIPSIBLINGS|TCS_VERTICAL|TCS_MULTILINE },
+    { 0 }
+};
+
+static void test_create(void)
+{
+    const struct tabcreate_style *ptr = create_styles;
+    DWORD style;
+    HWND hTab;
+
+    while (ptr->style)
+    {
+        hTab = CreateWindowA(WC_TABCONTROLA, "TestTab", ptr->style,
+            10, 10, 300, 100, parent_wnd, NULL, NULL, 0);
+        style = GetWindowLongA(hTab, GWL_STYLE);
+        ok(style == ptr->act_style, "expected style 0x%08x, got style 0x%08x\n", ptr->act_style, style);
+
+        DestroyWindow(hTab);
+        ptr++;
+    }
+}
+
 START_TEST(tab)
 {
     LOGFONTA logfont;
@@ -1465,6 +1495,7 @@ START_TEST(tab)
     test_TCM_SETITEMEXTRA();
     test_TCS_OWNERDRAWFIXED();
     test_WM_CONTEXTMENU();
+    test_create();
 
     DestroyWindow(parent_wnd);
 }
-- 
1.5.6.5



More information about the wine-patches mailing list