fixed several problems due to use of GetEditHWND() when the edit control is not available

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49072 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2007-10-07 11:19:09 +00:00
parent bdb7278a27
commit e9717bd5d8
2 changed files with 51 additions and 11 deletions

View File

@@ -73,6 +73,7 @@ public:
// resolve ambiguities among virtual functions inherited from both base // resolve ambiguities among virtual functions inherited from both base
// classes // classes
virtual void Clear(); virtual void Clear();
virtual wxString GetValue() const;
virtual void SetValue(const wxString& value); virtual void SetValue(const wxString& value);
virtual wxString GetStringSelection() const virtual wxString GetStringSelection() const
{ return wxChoice::GetStringSelection(); } { return wxChoice::GetStringSelection(); }
@@ -81,8 +82,7 @@ public:
virtual void SetSelection(long from, long to) virtual void SetSelection(long from, long to)
{ wxTextEntry::SetSelection(from, to); } { wxTextEntry::SetSelection(from, to); }
virtual int GetSelection() const { return wxChoice::GetSelection(); } virtual int GetSelection() const { return wxChoice::GetSelection(); }
virtual void GetSelection(long *from, long *to) const virtual void GetSelection(long *from, long *to) const;
{ wxTextEntry::GetSelection(from, to); }
virtual bool IsEditable() const; virtual bool IsEditable() const;
@@ -116,8 +116,19 @@ protected:
virtual void DoSetToolTip(wxToolTip *tip); virtual void DoSetToolTip(wxToolTip *tip);
#endif #endif
// this is the overridden wxTextEntry method which should only be called
// when we do have an edit control so it asserts if this is not the case
virtual WXHWND GetEditHWND() const; virtual WXHWND GetEditHWND() const;
// this is the implementation of GetEditHWND() which can also be used when
// we don't have the edit control, it simply returns NULL then
//
// try not to use this function unless absolutely necessary (as in the
// message handling code where the edit control might not be created yet
// for the messages we receive during the control creation) as normally
// just testing for IsEditable() and using GetEditHWND() should be enough
WXHWND GetEditHWNDIfAvailable() const;
private: private:
DECLARE_DYNAMIC_CLASS_NO_COPY(wxComboBox) DECLARE_DYNAMIC_CLASS_NO_COPY(wxComboBox)
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()

View File

@@ -235,6 +235,9 @@ WXLRESULT wxComboBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lPara
{ {
// combobox selection sometimes spontaneously changes when its // combobox selection sometimes spontaneously changes when its
// size changes, restore it to the old value if necessary // size changes, restore it to the old value if necessary
if ( !GetEditHWNDIfAvailable() )
break;
long fromOld, toOld; long fromOld, toOld;
GetSelection(&fromOld, &toOld); GetSelection(&fromOld, &toOld);
WXLRESULT result = wxChoice::MSWWindowProc(nMsg, wParam, lParam); WXLRESULT result = wxChoice::MSWWindowProc(nMsg, wParam, lParam);
@@ -391,22 +394,27 @@ bool wxComboBox::MSWShouldPreProcessMessage(WXMSG *pMsg)
return wxChoice::MSWShouldPreProcessMessage(pMsg); return wxChoice::MSWShouldPreProcessMessage(pMsg);
} }
WXHWND wxComboBox::GetEditHWNDIfAvailable() const
{
POINT pt = { 4, 4 };
WXHWND hWndEdit = (WXHWND)::ChildWindowFromPoint(GetHwnd(), pt);
if ( hWndEdit == GetHWND() )
hWndEdit = NULL;
return hWndEdit;
}
WXHWND wxComboBox::GetEditHWND() const WXHWND wxComboBox::GetEditHWND() const
{ {
// this function should not be called for wxCB_READONLY controls, it is // this function should not be called for wxCB_READONLY controls, it is
// the callers responsability to check this // the callers responsibility to check this
wxASSERT_MSG( !HasFlag(wxCB_READONLY), wxASSERT_MSG( !HasFlag(wxCB_READONLY),
_T("read-only combobox doesn't have any edit control") ); _T("read-only combobox doesn't have any edit control") );
POINT pt; WXHWND hWndEdit = GetEditHWNDIfAvailable();
pt.x = pt.y = 4; wxASSERT_MSG( hWndEdit, _T("combobox without edit control?") );
HWND hwndEdit = ::ChildWindowFromPoint(GetHwnd(), pt);
if ( !hwndEdit || hwndEdit == GetHwnd() )
{
wxFAIL_MSG(_T("combobox without edit control?"));
}
return (WXHWND)hwndEdit; return hWndEdit;
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -502,6 +510,12 @@ WXDWORD wxComboBox::MSWGetStyle(long style, WXDWORD *exstyle) const
// wxComboBox text control-like methods // wxComboBox text control-like methods
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
wxString wxComboBox::GetValue() const
{
return HasFlag(wxCB_READONLY) ? GetStringSelection()
: wxTextEntry::GetValue();
}
void wxComboBox::SetValue(const wxString& value) void wxComboBox::SetValue(const wxString& value)
{ {
if ( HasFlag(wxCB_READONLY) ) if ( HasFlag(wxCB_READONLY) )
@@ -517,6 +531,21 @@ void wxComboBox::Clear()
wxTextEntry::Clear(); wxTextEntry::Clear();
} }
void wxComboBox::GetSelection(long *from, long *to) const
{
if ( !HasFlag(wxCB_READONLY) )
{
wxTextEntry::GetSelection(from, to);
}
else // text selection doesn't make sense for read only comboboxes
{
if ( from )
*from = -1;
if ( to )
*to = -1;
}
}
bool wxComboBox::IsEditable() const bool wxComboBox::IsEditable() const
{ {
return !HasFlag(wxCB_READONLY) && wxTextEntry::IsEditable(); return !HasFlag(wxCB_READONLY) && wxTextEntry::IsEditable();