workaround for not appearing vertical scrollbar in wxTE_RICH2 controls
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@18613 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -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
|
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
|
||||||
|
|
||||||
|
@@ -277,8 +277,6 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
|
|||||||
// have we managed to load any richedit version?
|
// have we managed to load any richedit version?
|
||||||
if ( !s_errorGiven )
|
if ( !s_errorGiven )
|
||||||
{
|
{
|
||||||
msStyle |= ES_AUTOVSCROLL;
|
|
||||||
|
|
||||||
m_verRichEdit = verRichEdit;
|
m_verRichEdit = verRichEdit;
|
||||||
if ( m_verRichEdit == 1 )
|
if ( m_verRichEdit == 1 )
|
||||||
{
|
{
|
||||||
@@ -397,9 +395,7 @@ WXDWORD wxTextCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const
|
|||||||
|
|
||||||
long msStyle = wxControl::MSWGetStyle(style, exstyle);
|
long msStyle = wxControl::MSWGetStyle(style, exstyle);
|
||||||
|
|
||||||
// default styles
|
// styles which we alaways add by default
|
||||||
msStyle |= ES_LEFT;
|
|
||||||
|
|
||||||
if ( style & wxTE_MULTILINE )
|
if ( style & wxTE_MULTILINE )
|
||||||
{
|
{
|
||||||
wxASSERT_MSG( !(style & wxTE_PROCESS_ENTER),
|
wxASSERT_MSG( !(style & wxTE_PROCESS_ENTER),
|
||||||
@@ -407,7 +403,18 @@ WXDWORD wxTextCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const
|
|||||||
|
|
||||||
msStyle |= ES_MULTILINE | ES_WANTRETURN;
|
msStyle |= ES_MULTILINE | ES_WANTRETURN;
|
||||||
if ( !(style & wxTE_NO_VSCROLL) )
|
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;
|
style |= wxTE_PROCESS_ENTER;
|
||||||
}
|
}
|
||||||
@@ -418,8 +425,12 @@ WXDWORD wxTextCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const
|
|||||||
msStyle |= ES_AUTOHSCROLL;
|
msStyle |= ES_AUTOHSCROLL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// styles which we add depending on the specified wxWindows styles
|
||||||
if ( style & wxHSCROLL )
|
if ( style & wxHSCROLL )
|
||||||
msStyle |= WS_HSCROLL | ES_AUTOHSCROLL;
|
{
|
||||||
|
// automatically scroll the control horizontally as necessary
|
||||||
|
msStyle |= WS_HSCROLL;// | ES_AUTOHSCROLL;
|
||||||
|
}
|
||||||
|
|
||||||
if ( style & wxTE_READONLY )
|
if ( style & wxTE_READONLY )
|
||||||
msStyle |= ES_READONLY;
|
msStyle |= ES_READONLY;
|
||||||
@@ -427,17 +438,16 @@ WXDWORD wxTextCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const
|
|||||||
if ( style & wxTE_PASSWORD )
|
if ( style & wxTE_PASSWORD )
|
||||||
msStyle |= ES_PASSWORD;
|
msStyle |= ES_PASSWORD;
|
||||||
|
|
||||||
if ( style & wxTE_AUTO_SCROLL )
|
|
||||||
msStyle |= ES_AUTOHSCROLL;
|
|
||||||
|
|
||||||
if ( style & wxTE_NOHIDESEL )
|
if ( style & wxTE_NOHIDESEL )
|
||||||
msStyle |= ES_NOHIDESEL;
|
msStyle |= ES_NOHIDESEL;
|
||||||
|
|
||||||
|
// note that we can't do do "& wxTE_LEFT" as wxTE_LEFT == 0
|
||||||
if ( style & wxTE_CENTRE )
|
if ( style & wxTE_CENTRE )
|
||||||
msStyle |= ES_CENTER;
|
msStyle |= ES_CENTER;
|
||||||
|
else if ( style & wxTE_RIGHT )
|
||||||
if ( style & wxTE_RIGHT )
|
|
||||||
msStyle |= ES_RIGHT;
|
msStyle |= ES_RIGHT;
|
||||||
|
else
|
||||||
|
msStyle |= ES_LEFT; // ES_LEFT if 0 as well but for consistency...
|
||||||
|
|
||||||
return msStyle;
|
return msStyle;
|
||||||
}
|
}
|
||||||
@@ -1013,26 +1023,6 @@ void wxTextCtrl::DoSetSelection(long from, long to, bool scrollCaret)
|
|||||||
#if wxUSE_RICHEDIT
|
#if wxUSE_RICHEDIT
|
||||||
if ( IsRich() )
|
if ( IsRich() )
|
||||||
{
|
{
|
||||||
// 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
|
|
||||||
// option is set (but it does work ok in richedit 1.0 mode...)
|
|
||||||
//
|
|
||||||
// so to make it work we either need to give focus to it here which
|
|
||||||
// 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
|
|
||||||
if ( GetRichVersion() > 1 )
|
|
||||||
{
|
|
||||||
if ( !HasFlag(wxTE_NOHIDESEL) )
|
|
||||||
{
|
|
||||||
::SendMessage(GetHwnd(), EM_SETOPTIONS,
|
|
||||||
ECOOP_OR, ECO_NOHIDESEL);
|
|
||||||
}
|
|
||||||
//else: everything is already ok
|
|
||||||
}
|
|
||||||
|
|
||||||
CHARRANGE range;
|
CHARRANGE range;
|
||||||
range.cpMin = from;
|
range.cpMin = from;
|
||||||
range.cpMax = to;
|
range.cpMax = to;
|
||||||
@@ -1046,18 +1036,45 @@ void wxTextCtrl::DoSetSelection(long from, long to, bool scrollCaret)
|
|||||||
|
|
||||||
if ( scrollCaret )
|
if ( scrollCaret )
|
||||||
{
|
{
|
||||||
SendMessage(hWnd, EM_SCROLLCARET, (WPARAM)0, (LPARAM)0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if wxUSE_RICHEDIT
|
#if wxUSE_RICHEDIT
|
||||||
// restore ECO_NOHIDESEL if we changed it
|
// richedit 3.0 (i.e. the version living in riched20.dll distributed
|
||||||
if ( GetRichVersion() > 1 && !HasFlag(wxTE_NOHIDESEL) )
|
// with Windows 2000 and beyond) doesn't honour EM_SCROLLCARET when
|
||||||
{
|
// emulating richedit 2.0 unless the control has focus or ECO_NOHIDESEL
|
||||||
::SendMessage(GetHwnd(), EM_SETOPTIONS,
|
// option is set (but it does work ok in richedit 1.0 mode...)
|
||||||
ECOOP_AND, ~ECO_NOHIDESEL);
|
//
|
||||||
}
|
// so to make it work we either need to give focus to it here which
|
||||||
|
// 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 -- 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) )
|
||||||
|
{
|
||||||
|
::SendMessage(GetHwnd(), EM_SETOPTIONS,
|
||||||
|
ECOOP_OR, ECO_NOHIDESEL);
|
||||||
|
}
|
||||||
|
//else: everything is already ok
|
||||||
|
}
|
||||||
#endif // wxUSE_RICHEDIT
|
#endif // wxUSE_RICHEDIT
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
#endif // wxUSE_RICHEDIT
|
||||||
|
}
|
||||||
#else // Win16
|
#else // Win16
|
||||||
// WPARAM is 0: selection is scrolled into view
|
// WPARAM is 0: selection is scrolled into view
|
||||||
SendMessage(hWnd, EM_SETSEL, (WPARAM)0, (LPARAM)MAKELONG(from, to));
|
SendMessage(hWnd, EM_SETSEL, (WPARAM)0, (LPARAM)MAKELONG(from, to));
|
||||||
|
Reference in New Issue
Block a user