Fix changing wxWindow ID in wxMSW.

This must be done both at wxWidgets and MSW level, otherwise changing the ID
results in window not recognizing itself as the recipient of the messages sent
to it by Windows.

Closes #3697.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@76672 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2014-06-09 00:54:12 +00:00
parent be35fb7a15
commit 82112b5de2
3 changed files with 17 additions and 1 deletions

View File

@ -115,6 +115,8 @@ public:
wxCoord width,
wxCoord widthTotal) const;
virtual void SetId(wxWindowID winid);
#if wxUSE_DRAG_AND_DROP
virtual void SetDropTarget( wxDropTarget *dropTarget );
#endif // wxUSE_DRAG_AND_DROP

View File

@ -236,7 +236,7 @@ public:
// window id uniquely identifies the window among its siblings unless
// it is wxID_ANY which means "don't care"
void SetId( wxWindowID winid ) { m_windowId = winid; }
virtual void SetId( wxWindowID winid ) { m_windowId = winid; }
wxWindowID GetId() const { return m_windowId; }
// generate a unique id (or count of them consecutively), returns a

View File

@ -552,6 +552,20 @@ bool wxWindowMSW::Create(wxWindow *parent,
return true;
}
void wxWindowMSW::SetId(wxWindowID winid)
{
wxWindowBase::SetId(winid);
// Also update the ID used at the Windows level to avoid nasty surprises
// when we can't find the control when handling messages for it after
// changing its ID because Windows still uses the old one.
if ( GetHwnd() )
{
if ( !::SetWindowLong(GetHwnd(), GWL_ID, winid) )
wxLogLastError(wxT("SetWindowLong(GWL_ID)"));
}
}
// ---------------------------------------------------------------------------
// basic operations
// ---------------------------------------------------------------------------