]> git.saurik.com Git - wxWidgets.git/commitdiff
workaround for not appearing vertical scrollbar in wxTE_RICH2 controls
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 7 Jan 2003 01:10:03 +0000 (01:10 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 7 Jan 2003 01:10:03 +0000 (01:10 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@18613 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/toback24.txt
src/msw/textctrl.cpp

index 595ddf3cdc73c33ebbc83e364fb2d3a1e9d0b325..a657e6f7dce064e62be74b9c1c7ab8e666260cde 100644 (file)
@@ -98,3 +98,11 @@ Log: 1) fixed compilation of wxBitmap, wxIcon toplevel nodes
 
 http://sourceforge.net/tracker/index.php?func=detail&aid=648659&group_id=9863&atid=309863
 
+
+9 Use ES_DISABLENOSCROLL to work around the vertical scrollbar bug
+
+Checking in src/msw/textctrl.cpp;
+/pack/cvsroots/wxwindows/wxWindows/src/msw/textctrl.cpp,v  <--  textctrl.cpp
+new revision: 1.157; previous revision: 1.156
+done
+
index f21acdc2cc8380e98205039c8937330517656a00..e0e20bb683ddad49fb43943c26c22760460f1ec0 100644 (file)
@@ -277,8 +277,6 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
         // have we managed to load any richedit version?
         if ( !s_errorGiven )
         {
-            msStyle |= ES_AUTOVSCROLL;
-
             m_verRichEdit = verRichEdit;
             if ( m_verRichEdit == 1 )
             {
@@ -397,9 +395,7 @@ WXDWORD wxTextCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const
 
     long msStyle = wxControl::MSWGetStyle(style, exstyle);
 
-    // default styles
-    msStyle |= ES_LEFT;
-
+    // styles which we alaways add by default
     if ( style & wxTE_MULTILINE )
     {
         wxASSERT_MSG( !(style & wxTE_PROCESS_ENTER),
@@ -407,7 +403,18 @@ WXDWORD wxTextCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const
 
         msStyle |= ES_MULTILINE | ES_WANTRETURN;
         if ( !(style & wxTE_NO_VSCROLL) )
-            msStyle |= WS_VSCROLL;
+        {
+            // always adjust the vertical scrollbar automatically if we have it
+            msStyle |= WS_VSCROLL | ES_AUTOVSCROLL;
+
+            // we have to use this style for the rich edit controls because
+            // without it the vertical scrollbar never appears at all in
+            // richedit 3.0 because of our ECO_NOHIDESEL hack (search for it)
+            if ( style & wxTE_RICH2 )
+            {
+                msStyle |= ES_DISABLENOSCROLL;
+            }
+        }
 
         style |= wxTE_PROCESS_ENTER;
     }
@@ -418,8 +425,12 @@ WXDWORD wxTextCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const
         msStyle |= ES_AUTOHSCROLL;
     }
 
+    // styles which we add depending on the specified wxWindows styles
     if ( style & wxHSCROLL )
-        msStyle |= WS_HSCROLL | ES_AUTOHSCROLL;
+    {
+        // automatically scroll the control horizontally as necessary
+        msStyle |= WS_HSCROLL;// | ES_AUTOHSCROLL;
+    }
 
     if ( style & wxTE_READONLY )
         msStyle |= ES_READONLY;
@@ -427,17 +438,16 @@ WXDWORD wxTextCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const
     if ( style & wxTE_PASSWORD )
         msStyle |= ES_PASSWORD;
 
-    if ( style & wxTE_AUTO_SCROLL )
-        msStyle |= ES_AUTOHSCROLL;
-
     if ( style & wxTE_NOHIDESEL )
         msStyle |= ES_NOHIDESEL;
 
+    // note that we can't do do "& wxTE_LEFT" as wxTE_LEFT == 0
     if ( style & wxTE_CENTRE )
         msStyle |= ES_CENTER;
-
-    if ( style & wxTE_RIGHT )
+    else if ( style & wxTE_RIGHT )
         msStyle |= ES_RIGHT;
+    else
+        msStyle |= ES_LEFT; // ES_LEFT if 0 as well but for consistency...
 
     return msStyle;
 }
@@ -1013,6 +1023,20 @@ void wxTextCtrl::DoSetSelection(long from, long to, bool scrollCaret)
 #if wxUSE_RICHEDIT
     if ( IsRich() )
     {
+        CHARRANGE range;
+        range.cpMin = from;
+        range.cpMax = to;
+        SendMessage(hWnd, EM_EXSETSEL, 0, (LPARAM) &range);
+    }
+    else
+#endif // wxUSE_RICHEDIT
+    {
+        SendMessage(hWnd, EM_SETSEL, (WPARAM)from, (LPARAM)to);
+    }
+
+    if ( scrollCaret )
+    {
+#if wxUSE_RICHEDIT
         // richedit 3.0 (i.e. the version living in riched20.dll distributed
         // with Windows 2000 and beyond) doesn't honour EM_SCROLLCARET when
         // emulating richedit 2.0 unless the control has focus or ECO_NOHIDESEL
@@ -1022,7 +1046,13 @@ void wxTextCtrl::DoSetSelection(long from, long to, bool scrollCaret)
         // will probably create many problems (dummy focus events; window
         // containing the text control being brought to foreground
         // unexpectedly; ...) or to temporarily set ECO_NOHIDESEL which may
-        // create other problems too -- or it might not, so let's try to do it
+        // create other problems too -- and in fact it does because if we turn
+        // on/off this style while appending the text to the control, the
+        // vertical scrollbar never appears in it even if we append tons of
+        // text and to work around this the only solution I found was to use
+        // ES_DISABLENOSCROLL
+        //
+        // this is very ugly but I don't see any other way to make this work
         if ( GetRichVersion() > 1 )
         {
             if ( !HasFlag(wxTE_NOHIDESEL) )
@@ -1032,32 +1062,19 @@ void wxTextCtrl::DoSetSelection(long from, long to, bool scrollCaret)
             }
             //else: everything is already ok
         }
-
-        CHARRANGE range;
-        range.cpMin = from;
-        range.cpMax = to;
-        SendMessage(hWnd, EM_EXSETSEL, 0, (LPARAM) &range);
-    }
-    else
 #endif // wxUSE_RICHEDIT
-    {
-        SendMessage(hWnd, EM_SETSEL, (WPARAM)from, (LPARAM)to);
-    }
 
-    if ( scrollCaret )
-    {
         SendMessage(hWnd, EM_SCROLLCARET, (WPARAM)0, (LPARAM)0);
-    }
 
 #if wxUSE_RICHEDIT
-    // restore ECO_NOHIDESEL if we changed it
-    if ( GetRichVersion() > 1 && !HasFlag(wxTE_NOHIDESEL) )
-    {
-        ::SendMessage(GetHwnd(), EM_SETOPTIONS,
-                      ECOOP_AND, ~ECO_NOHIDESEL);
-    }
+        // restore ECO_NOHIDESEL if we changed it
+        if ( GetRichVersion() > 1 && !HasFlag(wxTE_NOHIDESEL) )
+        {
+            ::SendMessage(GetHwnd(), EM_SETOPTIONS,
+                          ECOOP_AND, ~ECO_NOHIDESEL);
+        }
 #endif // wxUSE_RICHEDIT
-
+    }
 #else // Win16
     // WPARAM is 0: selection is scrolled into view
     SendMessage(hWnd, EM_SETSEL, (WPARAM)0, (LPARAM)MAKELONG(from, to));