X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e373f51b6c2a9a43436e24b690c18f334e0605e6..de5ae7c6e6bd3ac764d3552a9e6fd4a287f01299:/src/msw/radiobox.cpp diff --git a/src/msw/radiobox.cpp b/src/msw/radiobox.cpp index 6ce66a88ea..4038a36348 100644 --- a/src/msw/radiobox.cpp +++ b/src/msw/radiobox.cpp @@ -46,14 +46,8 @@ // private functions // --------------------------------------------------------------------------- -// get the id of the window -#ifdef __WIN32__ - #define GET_WIN_ID(hwnd) ::GetWindowLong((HWND)hwnd, GWL_ID) -#else // Win16 - #define GET_WIN_ID(hwnd) ::GetWindowWord((HWND)hwnd, GWW_ID) -#endif // Win32/16 - // wnd proc for radio buttons +#ifdef __WIN32__ LRESULT APIENTRY _EXPORT wxRadioBtnWndProc(HWND hWnd, UINT message, WPARAM wParam, @@ -64,7 +58,9 @@ LRESULT APIENTRY _EXPORT wxRadioBtnWndProc(HWND hWnd, // --------------------------------------------------------------------------- // the pointer to standard radio button wnd proc -static WNDPROC s_wndprocRadioBtn = (WNDPROC)NULL; +static WXFARPROC s_wndprocRadioBtn = (WXFARPROC)NULL; + +#endif // __WIN32__ // =========================================================================== // implementation @@ -98,28 +94,31 @@ int wxRadioBox::GetNumHor() const } } -bool wxRadioBox::MSWCommand(WXUINT param, WXWORD id) +bool wxRadioBox::MSWCommand(WXUINT cmd, WXWORD id) { - if ( param == BN_CLICKED ) + if ( cmd == BN_CLICKED ) { - m_selectedButton = -1; + int selectedButton = -1; for ( int i = 0; i < m_noItems; i++ ) { - if ( id == GET_WIN_ID(m_radioButtons[i]) ) + if ( id == wxGetWindowId(m_radioButtons[i]) ) { - m_selectedButton = i; + selectedButton = i; break; } } - wxASSERT_MSG( m_selectedButton != -1, "click from alien button?" ); + wxASSERT_MSG( selectedButton != -1, "click from alien button?" ); - wxCommandEvent event(wxEVT_COMMAND_RADIOBOX_SELECTED, m_windowId); - event.SetInt( m_selectedButton ); - event.SetEventObject( this ); - ProcessCommand(event); + if ( selectedButton != m_selectedButton ) + { + m_selectedButton = selectedButton; + + SendNotificationEvent(); + } + //else: don't generate events when the selection doesn't change return TRUE; } @@ -193,12 +192,6 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, bool want3D; WXDWORD exStyle = Determine3DEffects(0, &want3D); - // Even with extended styles, need to combine with WS_BORDER - // for them to look right. - /* - if ( want3D || wxStyleHasBorder(m_windowStyle) ) - msStyle |= WS_BORDER; - */ HWND hwndParent = (HWND)parent->GetHWND(); @@ -250,6 +243,7 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, NULL); m_radioButtons[i] = (WXHWND)hwndBtn; + SubclassRadioButton((WXHWND)hwndBtn); wxFont& font = GetFont(); @@ -259,7 +253,7 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, (WPARAM)font.GetResourceHandle(), 0L); } - m_subControls.Append((wxObject *)newId); + m_subControls.Append((wxObject *)(WXWORD)newId); } // Create a dummy radio control to end the group. @@ -282,29 +276,30 @@ wxRadioBox::~wxRadioBox() { int i; for (i = 0; i < m_noItems; i++) - DestroyWindow((HWND) m_radioButtons[i]); + ::DestroyWindow((HWND)m_radioButtons[i]); delete[] m_radioButtons; } + if (m_radioWidth) delete[] m_radioWidth; if (m_radioHeight) delete[] m_radioHeight; - if (m_hWnd) - ::DestroyWindow((HWND) m_hWnd); - m_hWnd = 0; } wxString wxRadioBox::GetLabel(int item) const { - GetWindowText((HWND)m_radioButtons[item], wxBuffer, 300); - return wxString(wxBuffer); + wxCHECK_MSG( item >= 0 && item < m_noItems, "", "invalid radiobox index" ); + + return wxGetWindowText(m_radioButtons[item]); } void wxRadioBox::SetLabel(int item, const wxString& label) { + wxCHECK_RET( item >= 0 && item < m_noItems, "invalid radiobox index" ); + m_radioWidth[item] = m_radioHeight[item] = -1; - SetWindowText((HWND)m_radioButtons[item], (const char *)label); + SetWindowText((HWND)m_radioButtons[item], label.c_str()); } void wxRadioBox::SetLabel(int item, wxBitmap *bitmap) @@ -313,18 +308,18 @@ void wxRadioBox::SetLabel(int item, wxBitmap *bitmap) m_radioWidth[item] = bitmap->GetWidth() + FB_MARGIN; m_radioHeight[item] = bitmap->GetHeight() + FB_MARGIN; */ + wxFAIL_MSG("not implemented"); } int wxRadioBox::FindString(const wxString& s) const { - int i; - for (i = 0; i < m_noItems; i++) + for (int i = 0; i < m_noItems; i++) { - GetWindowText((HWND) m_radioButtons[i], wxBuffer, 1000); - if (s == wxBuffer) + if ( s == wxGetWindowText(m_radioButtons[i]) ) return i; } - return -1; + + return wxNOT_FOUND; } void wxRadioBox::SetSelection(int N) @@ -537,22 +532,6 @@ void wxRadioBox::GetPosition(int *x, int *y) const *y = point.y; } -wxString wxRadioBox::GetLabel() const -{ - if (m_hWnd) - { - GetWindowText((HWND) m_hWnd, wxBuffer, 300); - return wxString(wxBuffer); - } - else return wxString(""); -} - -void wxRadioBox::SetLabel(const wxString& label) -{ - if (m_hWnd) - SetWindowText((HWND) m_hWnd, label); -} - void wxRadioBox::SetFocus() { if (m_noItems > 0) @@ -567,53 +546,46 @@ void wxRadioBox::SetFocus() bool wxRadioBox::Show(bool show) { - m_isShown = show; - int cshow; - if (show) - cshow = SW_SHOW; - else - cshow = SW_HIDE; - if (m_hWnd) - ShowWindow((HWND) m_hWnd, cshow); - int i; - for (i = 0; i < m_noItems; i++) - ShowWindow((HWND) m_radioButtons[i], cshow); + if ( !wxControl::Show(show) ) + return FALSE; + + int nCmdShow = show ? SW_SHOW : SW_HIDE; + for ( int i = 0; i < m_noItems; i++ ) + { + ::ShowWindow((HWND)m_radioButtons[i], nCmdShow); + } + return TRUE; } // Enable a specific button void wxRadioBox::Enable(int item, bool enable) { - if (item<0) - wxWindow::Enable(enable); - else if (item < m_noItems) - ::EnableWindow((HWND) m_radioButtons[item], enable); + wxCHECK_RET( item >= 0 && item < m_noItems, + _T("invalid item in wxRadioBox::Enable()") ); + + ::EnableWindow((HWND) m_radioButtons[item], enable); } // Enable all controls -void wxRadioBox::Enable(bool enable) +bool wxRadioBox::Enable(bool enable) { - wxControl::Enable(enable); + if ( !wxControl::Enable(enable) ) + return FALSE; - int i; - for (i = 0; i < m_noItems; i++) + for (int i = 0; i < m_noItems; i++) ::EnableWindow((HWND) m_radioButtons[i], enable); + + return TRUE; } // Show a specific button void wxRadioBox::Show(int item, bool show) { - if (item<0) - wxRadioBox::Show(show); - else if (item < m_noItems) - { - int cshow; - if (show) - cshow = SW_SHOW; - else - cshow = SW_HIDE; - ShowWindow((HWND) m_radioButtons[item], cshow); - } + wxCHECK_RET( item >= 0 && item < m_noItems, + _T("invalid item in wxRadioBox::Show()") ); + + ::ShowWindow((HWND)m_radioButtons[item], show ? SW_SHOW : SW_HIDE); } WXHBRUSH wxRadioBox::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, @@ -637,9 +609,6 @@ WXHBRUSH wxRadioBox::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID); - // Note that this will be cleaned up in wxApp::OnIdle, if backgroundBrush - // has a zero usage count. - // backgroundBrush->RealizeResource(); return (WXHBRUSH) backgroundBrush->GetResourceHandle(); } @@ -670,8 +639,11 @@ bool wxRadioBox::ContainsHWND(WXHWND hWnd) const { int i; for (i = 0; i < Number(); i++) + { if (GetRadioButtons()[i] == hWnd) return TRUE; + } + return FALSE; } @@ -681,39 +653,65 @@ void wxRadioBox::Command (wxCommandEvent & event) ProcessCommand (event); } -long wxRadioBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) +long wxRadioBox::MSWWindowProc(WXUINT msg, WXWPARAM wParam, WXLPARAM lParam) { - if (nMsg == WM_NCHITTEST) + long rc = 0; + bool processed = FALSE; + + switch ( msg ) { - int xPos = LOWORD(lParam); // horizontal position of cursor - int yPos = HIWORD(lParam); // vertical position of cursor + case WM_NCHITTEST: + { + int xPos = LOWORD(lParam); // horizontal position of cursor + int yPos = HIWORD(lParam); // vertical position of cursor - ScreenToClient(&xPos, &yPos); + ScreenToClient(&xPos, &yPos); - // Make sure you can drag by the top of the groupbox, but let - // other (enclosed) controls get mouse events also - if (yPos < 10) - return (long)HTCLIENT; + // Make sure you can drag by the top of the groupbox, but let + // other (enclosed) controls get mouse events also + if ( yPos < 10 ) + { + rc = HTCLIENT; + processed = TRUE; + } + } + break; } - return wxControl::MSWWindowProc(nMsg, wParam, lParam); + if ( !processed ) + rc = wxControl::MSWWindowProc(msg, wParam, lParam); + + return rc; } void wxRadioBox::SubclassRadioButton(WXHWND hWndBtn) { +#ifdef __WIN32__ HWND hwndBtn = (HWND)hWndBtn; if ( !s_wndprocRadioBtn ) - s_wndprocRadioBtn = (WNDPROC)::GetWindowLong(hwndBtn, GWL_WNDPROC); + s_wndprocRadioBtn = (WXFARPROC)::GetWindowLong(hwndBtn, GWL_WNDPROC); + // No GWL_USERDATA in Win16, so omit this subclassing. ::SetWindowLong(hwndBtn, GWL_WNDPROC, (long)wxRadioBtnWndProc); ::SetWindowLong(hwndBtn, GWL_USERDATA, (long)this); +#endif // __WIN32__ +} + +void wxRadioBox::SendNotificationEvent() +{ + wxCommandEvent event(wxEVT_COMMAND_RADIOBOX_SELECTED, m_windowId); + event.SetInt( m_selectedButton ); + event.SetEventObject( this ); + ProcessCommand(event); } // --------------------------------------------------------------------------- // window proc for radio buttons // --------------------------------------------------------------------------- +#ifdef __WIN32__ + LRESULT APIENTRY _EXPORT wxRadioBtnWndProc(HWND hwnd, UINT msg, WPARAM wParam, @@ -768,13 +766,20 @@ LRESULT APIENTRY _EXPORT wxRadioBtnWndProc(HWND hwnd, if ( processed ) { if ( sel >= 0 && sel < radiobox->Number() ) + { radiobox->SetSelection(sel); + + // emulate the button click + radiobox->SendNotificationEvent(); + } } } if ( !processed ) - return ::CallWindowProc(s_wndprocRadioBtn, hwnd, msg, wParam, lParam); + return ::CallWindowProc(CASTWNDPROC s_wndprocRadioBtn, hwnd, msg, wParam, lParam); else return 0; } +#endif // __WIN32__ +