X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9a5ccab4315dc06b4b56a57c39fbc35b21f5a9d5..75d684d9f772126b02aaea7eedadc79cd24aaf32:/src/msw/radiobox.cpp diff --git a/src/msw/radiobox.cpp b/src/msw/radiobox.cpp index 5d237df03d..bd865c7542 100644 --- a/src/msw/radiobox.cpp +++ b/src/msw/radiobox.cpp @@ -46,29 +46,22 @@ // 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, LPARAM lParam); -#endif // --------------------------------------------------------------------------- // global vars // --------------------------------------------------------------------------- // the pointer to standard radio button wnd proc -// static WNDPROC s_wndprocRadioBtn = (WNDPROC)NULL; static WXFARPROC s_wndprocRadioBtn = (WXFARPROC)NULL; +#endif // __WIN32__ + // =========================================================================== // implementation // =========================================================================== @@ -101,15 +94,15 @@ 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 ) { 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]) ) { selectedButton = i; @@ -117,7 +110,7 @@ bool wxRadioBox::MSWCommand(WXUINT param, WXWORD id) } } - wxASSERT_MSG( selectedButton != -1, "click from alien button?" ); + wxASSERT_MSG( selectedButton != -1, _T("click from alien button?") ); if ( selectedButton != m_selectedButton ) { @@ -199,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(); @@ -256,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(); @@ -265,11 +253,11 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, (WPARAM)font.GetResourceHandle(), 0L); } - m_subControls.Append((wxObject *)newId); + m_subControls.Append((wxObject *)(WXDWORD)(WXWORD)newId); } // Create a dummy radio control to end the group. - (void)CreateWindowEx(0, RADIO_CLASS, "", WS_GROUP | RADIO_FLAGS, + (void)CreateWindowEx(0, RADIO_CLASS, _T(""), WS_GROUP | RADIO_FLAGS, 0, 0, 0, 0, hwndParent, (HMENU)NewControlId(), wxGetInstance(), NULL); @@ -288,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, _T(""), _T("invalid radiobox index") ); + + return wxGetWindowText(m_radioButtons[item]); } void wxRadioBox::SetLabel(int item, const wxString& label) { + wxCHECK_RET( item >= 0 && item < m_noItems, _T("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) @@ -319,23 +308,23 @@ void wxRadioBox::SetLabel(int item, wxBitmap *bitmap) m_radioWidth[item] = bitmap->GetWidth() + FB_MARGIN; m_radioHeight[item] = bitmap->GetHeight() + FB_MARGIN; */ + wxFAIL_MSG(_T("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) { - wxCHECK_RET( (N >= 0) && (N < m_noItems), "invalid radiobox index" ); + wxCHECK_RET( (N >= 0) && (N < m_noItems), _T("invalid radiobox index") ); // Following necessary for Win32s, because Win32s translate BM_SETCHECK if (m_selectedButton >= 0 && m_selectedButton < m_noItems) @@ -362,135 +351,164 @@ wxString wxRadioBox::GetString(int N) const // Restored old code. void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) { - int currentX, currentY; - GetPosition(¤tX, ¤tY); - int xx = x; - int yy = y; - - if (x == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - xx = currentX; - if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - yy = currentY; - - char buf[400]; - - int y_offset = yy; - int x_offset = xx; - int current_width, cyf; - - int cx1,cy1; - wxGetCharSize(m_hWnd, &cx1, &cy1, & GetFont()); - // Attempt to have a look coherent with other platforms: - // We compute the biggest toggle dim, then we align all - // items according this value. - int maxWidth = -1; - int maxHeight = -1; - - int i; - for (i = 0 ; i < m_noItems; i++) - { - int eachWidth; - int eachHeight; - if (m_radioWidth[i]<0) - { - // It's a labelled toggle - GetWindowText((HWND) m_radioButtons[i], buf, 300); - GetTextExtent(buf, ¤t_width, &cyf,NULL,NULL, & GetFont()); - eachWidth = (int)(current_width + RADIO_SIZE); - eachHeight = (int)((3*cyf)/2); - } - else + int currentX, currentY; + GetPosition(¤tX, ¤tY); + int widthOld, heightOld; + GetSize(&widthOld, &heightOld); + + int xx = x; + int yy = y; + + if (x == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) + xx = currentX; + if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) + yy = currentY; + + wxString buf; + + int y_offset = yy; + int x_offset = xx; + int current_width, cyf; + + int cx1,cy1; + wxGetCharSize(m_hWnd, &cx1, &cy1, & GetFont()); + + // Attempt to have a look coherent with other platforms: We compute the + // biggest toggle dim, then we align all items according this value. + int maxWidth = -1; + int maxHeight = -1; + + int i; + for (i = 0 ; i < m_noItems; i++) { - eachWidth = m_radioWidth[i]; - eachHeight = m_radioHeight[i]; + int eachWidth; + int eachHeight; + if (m_radioWidth[i]<0) + { + // It's a labelled toggle + buf = wxGetWindowText(m_radioButtons[i]); + GetTextExtent(buf, ¤t_width, &cyf); + eachWidth = (int)(current_width + RADIO_SIZE); + eachHeight = (int)((3*cyf)/2); + } + else + { + eachWidth = m_radioWidth[i]; + eachHeight = m_radioHeight[i]; + } + + if (maxWidth0) - y_offset += cy1/2; - } - } - int eachWidth; - int eachHeight; - if (m_radioWidth[i]<0) - { - // It's a labeled item - GetWindowText((HWND) m_radioButtons[i], buf, 300); - GetTextExtent(buf, ¤t_width, &cyf,NULL,NULL, & GetFont()); - - // How do we find out radio button bitmap size!! - // By adjusting them carefully, manually :-) - eachWidth = (int)(current_width + RADIO_SIZE); - eachHeight = (int)((3*cyf)/2); - } - else - { - eachWidth = m_radioWidth[i]; - eachHeight = m_radioHeight[i]; + // only change our width/height if asked for + if ( width == -1 ) + { + if ( sizeFlags & wxSIZE_AUTO_WIDTH ) + width = totWidth + cx1; + else + width = widthOld; + } + + if ( height == -1 ) + { + if ( sizeFlags & wxSIZE_AUTO_HEIGHT ) + height = totHeight + extraHeight; + else + height = heightOld; + } + + MoveWindow(GetHwnd(), x_offset, y_offset, width, height, TRUE); + + x_offset += cx1; + y_offset += cy1; } - MoveWindow((HWND) m_radioButtons[i],x_offset,y_offset,eachWidth,eachHeight,TRUE); - if (m_windowStyle & wxRA_SPECIFY_ROWS) +#if defined(CTL3D) && (!CTL3D) + y_offset += (int)(cy1/2); // Fudge factor since buttons overlapped label + // JACS 2/12/93. CTL3D draws group label quite high. +#endif + int startX = x_offset; + int startY = y_offset; + + for ( i = 0 ; i < m_noItems; i++) { - y_offset += maxHeight; - if (m_radioWidth[0]>0) - y_offset += cy1/2; + // Bidimensional radio adjustment + if (i&&((i%m_majorDim)==0)) // Why is this omitted for i = 0? + { + if (m_windowStyle & wxRA_VERTICAL) + { + y_offset = startY; + x_offset += maxWidth + cx1; + } + else + { + x_offset = startX; + y_offset += maxHeight; + if (m_radioWidth[0]>0) + y_offset += cy1/2; + } + } + int eachWidth; + int eachHeight; + if (m_radioWidth[i]<0) + { + // It's a labeled item + buf = wxGetWindowText(m_radioButtons[i]); + GetTextExtent(buf, ¤t_width, &cyf); + + // How do we find out radio button bitmap size!! + // By adjusting them carefully, manually :-) + eachWidth = (int)(current_width + RADIO_SIZE); + eachHeight = (int)((3*cyf)/2); + } + else + { + eachWidth = m_radioWidth[i]; + eachHeight = m_radioHeight[i]; + } + + MoveWindow((HWND)m_radioButtons[i], x_offset, y_offset, + eachWidth, eachHeight, + TRUE); + + if (m_windowStyle & wxRA_SPECIFY_ROWS) + { + y_offset += maxHeight; + if (m_radioWidth[0]>0) + y_offset += cy1/2; + } + else + x_offset += maxWidth + cx1; } - else - x_offset += maxWidth + cx1; - } } - void wxRadioBox::GetSize(int *width, int *height) const { RECT rect; @@ -543,22 +561,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) @@ -573,53 +575,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, @@ -643,9 +638,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(); } @@ -676,8 +668,11 @@ bool wxRadioBox::ContainsHWND(WXHWND hWnd) const { int i; for (i = 0; i < Number(); i++) + { if (GetRadioButtons()[i] == hWnd) return TRUE; + } + return FALSE; } @@ -687,42 +682,25 @@ void wxRadioBox::Command (wxCommandEvent & event) ProcessCommand (event); } -long wxRadioBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) -{ - if (nMsg == WM_NCHITTEST) - { - int xPos = LOWORD(lParam); // horizontal position of cursor - int yPos = HIWORD(lParam); // vertical position of cursor - - 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; - } - - return wxControl::MSWWindowProc(nMsg, wParam, lParam); -} - void wxRadioBox::SubclassRadioButton(WXHWND hWndBtn) { +#ifdef __WIN32__ HWND hwndBtn = (HWND)hWndBtn; if ( !s_wndprocRadioBtn ) s_wndprocRadioBtn = (WXFARPROC)::GetWindowLong(hwndBtn, GWL_WNDPROC); // No GWL_USERDATA in Win16, so omit this subclassing. -#ifdef __WIN32__ ::SetWindowLong(hwndBtn, GWL_WNDPROC, (long)wxRadioBtnWndProc); ::SetWindowLong(hwndBtn, GWL_USERDATA, (long)this); -#endif +#endif // __WIN32__ } void wxRadioBox::SendNotificationEvent() { wxCommandEvent event(wxEVT_COMMAND_RADIOBOX_SELECTED, m_windowId); event.SetInt( m_selectedButton ); + event.SetString( GetString(m_selectedButton) ); event.SetEventObject( this ); ProcessCommand(event); } @@ -746,7 +724,7 @@ LRESULT APIENTRY _EXPORT wxRadioBtnWndProc(HWND hwnd, { wxRadioBox *radiobox = (wxRadioBox *)::GetWindowLong(hwnd, GWL_USERDATA); - wxCHECK_MSG( radiobox, 0, "radio button without radio box?" ); + wxCHECK_MSG( radiobox, 0, _T("radio button without radio box?") ); int sel = radiobox->GetSelection(); @@ -801,5 +779,6 @@ LRESULT APIENTRY _EXPORT wxRadioBtnWndProc(HWND hwnd, else return 0; } -#endif + +#endif // __WIN32__