Improve code finding native spin control in wxNotebook

Simply use Win32 FindWindowEx() instead of enumerating child windows
with a loop.

Also extract this code into a reusable function.

No real changes yet.

See #26685.
This commit is contained in:
Steve Cornett
2026-07-21 00:13:20 +02:00
committed by Vadim Zeitlin
parent 589b622899
commit 5ea5e65a59
2 changed files with 22 additions and 25 deletions
+3
View File
@@ -202,6 +202,9 @@ private:
// It has the same semantics as HitTest(). // It has the same semantics as HitTest().
int MSWHitTestLeftRight(const wxPoint& pt, long *flags) const; int MSWHitTestLeftRight(const wxPoint& pt, long *flags) const;
// Subclass the spin button if it exists.
void MSWSubclassSpin();
wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxNotebook); wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxNotebook);
wxDECLARE_EVENT_TABLE(); wxDECLARE_EVENT_TABLE();
}; };
+19 -25
View File
@@ -980,6 +980,24 @@ wxNotebookSpinBtnWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
hwnd, message, wParam, lParam); hwnd, message, wParam, lParam);
} }
void wxNotebook::MSWSubclassSpin()
{
if ( !m_hasSubclassedUpdown )
{
// Find the spin button.
HWND hwndSpin = FindWindowExA(m_hWnd, nullptr, UPDOWN_CLASSA, nullptr);
if ( hwndSpin )
{
// Subclass the spin button.
if ( !gs_wndprocNotebookSpinBtn )
gs_wndprocNotebookSpinBtn = wxGetWindowProc(hwndSpin);
wxSetWindowProc(hwndSpin, wxNotebookSpinBtnWndProc);
m_hasSubclassedUpdown = true;
}
}
}
LRESULT APIENTRY LRESULT APIENTRY
wxNotebookWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) wxNotebookWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{ {
@@ -1528,31 +1546,7 @@ void wxNotebook::OnSize(wxSizeEvent& event)
false); false);
} }
// subclass the spin control used by the notebook to scroll pages to MSWSubclassSpin();
// prevent it from flickering on resize
if ( !m_hasSubclassedUpdown )
{
// iterate over all child windows to find spin button
for ( HWND child = ::GetWindow(GetHwnd(), GW_CHILD);
child;
child = ::GetWindow(child, GW_HWNDNEXT) )
{
wxWindow *childWindow = wxFindWinFromHandle((WXHWND)child);
// see if it exists, if no wxWindow found then assume it's the spin
// btn
if ( !childWindow )
{
// subclass the spin button to override WM_ERASEBKGND
if ( !gs_wndprocNotebookSpinBtn )
gs_wndprocNotebookSpinBtn = wxGetWindowProc(child);
wxSetWindowProc(child, wxNotebookSpinBtnWndProc);
m_hasSubclassedUpdown = true;
break;
}
}
}
event.Skip(); event.Skip();
} }