X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5d44b24ee63543390aa28e1eb4ff162da4264838..6e36105bda4d8cded94715c0e5da5ffd04cce360:/src/os2/radiobox.cpp diff --git a/src/os2/radiobox.cpp b/src/os2/radiobox.cpp index 70a9a050e4..283fd9cdbf 100644 --- a/src/os2/radiobox.cpp +++ b/src/os2/radiobox.cpp @@ -36,13 +36,22 @@ MRESULT EXPENTRY wxRadioBtnWndProc( HWND hWnd ,MPARAM wParam ,MPARAM lParam ); +MRESULT EXPENTRY wxRadioBoxWndProc( HWND hWnd + ,UINT uMessage + ,MPARAM wParam + ,MPARAM lParam + ); // --------------------------------------------------------------------------- // global vars // --------------------------------------------------------------------------- // the pointer to standard radio button wnd proc +extern void wxAssociateWinWithHandle( HWND hWnd + ,wxWindowOS2* pWin + ); static WXFARPROC fnWndProcRadioBtn = NULL; +static WXFARPROC fnWndProcRadioBox = NULL; // =========================================================================== // implementation @@ -98,13 +107,12 @@ void wxRadioBox::AdjustButtons( int nStartY; int nMaxWidth; int nMaxHeight; - int nTotWidth; - int nTotHeight; + wxFont vFont = GetFont(); wxGetCharSize( m_hWnd ,&nCx1 ,&nCy1 - ,&GetFont() + ,&vFont ); vMaxSize = GetMaxButtonSize(); nMaxWidth = vMaxSize.x; @@ -244,6 +252,25 @@ bool wxRadioBox::ContainsHWND( return FALSE; } // end of wxRadioBox::ContainsHWND +bool wxRadioBox::Create( + wxWindow* pParent +, wxWindowID vId +, const wxString& rsTitle +, const wxPoint& rPos +, const wxSize& rSize +, const wxArrayString& asChoices +, int nMajorDim +, long lStyle +, const wxValidator& rVal +, const wxString& rsName +) +{ + wxCArrayString chs(asChoices); + + return Create(pParent, vId, rsTitle, rPos, rSize, chs.GetCount(), + chs.GetStrings(), nMajorDim, lStyle, rVal, rsName); +} + bool wxRadioBox::Create( wxWindow* pParent , wxWindowID vId @@ -254,24 +281,17 @@ bool wxRadioBox::Create( , const wxString asChoices[] , int nMajorDim , long lStyle -#if wxUSE_VALIDATORS , const wxValidator& rVal -#endif , const wxString& rsName ) { - // - // System fonts are too big in OS/2 and they are blue - // We want smaller fonts and black by default. - // - wxFont& rFont = *wxSMALL_FONT; wxColour vColour; LONG lColor; vColour.Set(wxString("BLACK")); - lColor = (LONG)vColour.GetPixel(); + m_backgroundColour = pParent->GetBackgroundColour(); m_nSelectedButton = -1; - m_nNoItems = nNum; + m_nNoItems = 0; m_nMajorDim = nMajorDim == 0 ? nNum : nMajorDim; m_nNoRowsOrCols = nMajorDim; @@ -279,51 +299,34 @@ bool wxRadioBox::Create( // // Common initialization // - if (!OS2CreateControl( pParent - ,vId - ,rPos - ,rSize - ,lStyle -#if wxUSE_VALIDATORS - ,rVal -#endif - ,rsName - )) - - - - + if (!CreateControl( pParent + ,vId + ,rPos + ,rSize + ,lStyle + ,rVal + ,rsName + )) + return FALSE; if (!OS2CreateControl( "STATIC" -#if RADIOBTN_PARENT_IS_RADIOBOX - ,SS_GROUPBOX | WS_GROUP | WS_CLIPCHILDREN -#else - ,SS_GROUPBOX | WS_GROUP | WS_CLIPSIBLINGS -#endif + ,SS_GROUPBOX ,rPos ,rSize ,rsTitle )) + return FALSE; -#if RADIOBTN_PARENT_IS_RADIOBOX - HWND hWndParent = GetHwnd(); -#else - HWND hWndParent = GetHwndOf(pParent); -#endif - HFONT hFont; + wxAssociateWinWithHandle(m_hWnd, this); // // Some radio boxes test consecutive id. // + m_nNoItems = nNum; (void)NewControlId(); m_ahRadioButtons = new WXHWND[nNum]; m_pnRadioWidth = new int[nNum]; m_pnRadioHeight = new int[nNum]; - if (rFont.Ok()) - { - hFont = rFont.GetResourceHandle(); - } - for (int i = 0; i < nNum; i++) { m_pnRadioWidth[i] = m_pnRadioHeight[i] = -1; @@ -364,8 +367,9 @@ bool wxRadioBox::Create( } m_ahRadioButtons[i] = (WXHWND)hWndBtn; SubclassRadioButton((WXHWND)hWndBtn); + wxAssociateWinWithHandle(hWndBtn, this); wxOS2SetFont( hWndBtn - ,rFont + ,*wxSMALL_FONT ); ::WinSetWindowULong(hWndBtn, QWL_USER, (ULONG)this); m_aSubControls.Add(nNewId); @@ -385,13 +389,22 @@ bool wxRadioBox::Create( ,NULL ,NULL ); - SetFont(*wxSMALL_FONT); + SetFont(*wxSMALL_FONT); + fnWndProcRadioBox = (WXFARPROC)::WinSubclassWindow( GetHwnd() + ,(PFNWP)wxRadioBoxWndProc + ); + ::WinSetWindowULong(GetHwnd(), QWL_USER, (ULONG)this); lColor = (LONG)vColour.GetPixel(); ::WinSetPresParam( m_hWnd ,PP_FOREGROUNDCOLOR ,sizeof(LONG) ,(PVOID)&lColor ); + ::WinSetPresParam( m_hWnd + ,PP_BORDERDARKCOLOR + ,sizeof(LONG) + ,(PVOID)&lColor + ); lColor = (LONG)m_backgroundColour.GetPixel(); ::WinSetPresParam( m_hWnd @@ -399,6 +412,13 @@ bool wxRadioBox::Create( ,sizeof(LONG) ,(PVOID)&lColor ); + ::WinSetPresParam( m_hWnd + ,PP_BORDERLIGHTCOLOR + ,sizeof(LONG) + ,(PVOID)&lColor + ); + SetXComp(0); + SetYComp(0); SetSelection(0); SetSize( rPos.x ,rPos.y @@ -444,6 +464,7 @@ void wxRadioBox::DoSetSize( int nTotHeight; int nStartX; int nStartY; + wxFont vFont = GetFont(); m_nSizeFlags = nSizeFlags; GetPosition( &nCurrentX @@ -457,12 +478,15 @@ void wxRadioBox::DoSetSize( nXx = nCurrentX; if (nY == -1 && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE)) nYy = nCurrentY; - + if (nYy < 0) + nYy = 0; + if (nXx < 0) + nXx = 0; wxGetCharSize( m_hWnd ,&nCx1 ,&nCy1 - ,&GetFont() + ,&vFont ); // @@ -622,6 +646,7 @@ void wxRadioBox::DoSetSize( ,(LONG)nMaxHeight ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW ); + GetParent()->Refresh(); // // Where do we put the next button? // @@ -845,8 +870,10 @@ void wxRadioBox::GetSize( ,&vRect ); - *pnWidth = vRect.xRight - vRect.xLeft; - *pnHeight = vRect.yBottom - vRect.yTop; + if (pnWidth) + *pnWidth = vRect.xRight - vRect.xLeft; + if (pnHeight) + *pnHeight = vRect.yTop - vRect.yBottom; } // end of wxRadioBox::GetSize // Find string for position @@ -878,11 +905,12 @@ wxSize wxRadioBox::GetTotalButtonSize( int nHeight; int nWidth; int nWidthLabel; + wxFont vFont = GetFont(); wxGetCharSize( m_hWnd ,&nCx1 ,&nCy1 - ,(wxFont*)&GetFont() + ,&vFont ); nExtraHeight = nCy1; @@ -958,10 +986,8 @@ bool wxRadioBox::OS2Command( if (nSelectedButton == -1) { // - // Just ignore it - due to a hack with WM_NCHITTEST handling in our - // wnd proc, we can receive dummy click messages when we click near - // the radiobox edge (this is ugly but Julian wouldn't let me get - // rid of this...) + // Just ignore it + // return FALSE; } if (nSelectedButton != m_nSelectedButton) @@ -1012,8 +1038,6 @@ bool wxRadioBox::SetFont( // // Also set the font of our radio buttons // - WXHFONT hFont = wxFont(rFont).GetResourceHandle(); - for (int n = 0; n < (int)m_nNoItems; n++) { HWND hWndBtn = (HWND)m_ahRadioButtons[n]; @@ -1070,8 +1094,6 @@ bool wxRadioBox::Show( bool bShow ) { - int nCmdShow = 0; - if (!wxControl::Show(bShow)) return FALSE; @@ -1098,8 +1120,6 @@ void wxRadioBox::SubclassRadioButton( WXHWND hWndBtn ) { - HWND hwndBtn = (HWND)hWndBtn; - fnWndProcRadioBtn = (WXFARPROC)::WinSubclassWindow(hWndBtn, (PFNWP)wxRadioBtnWndProc); } // end of wxRadioBox::SubclassRadioButton @@ -1202,3 +1222,18 @@ MRESULT wxRadioBtnWndProc( ); } // end of wxRadioBtnWndProc +MRESULT EXPENTRY wxRadioBoxWndProc( + HWND hWnd +, UINT uMessage +, MPARAM wParam +, MPARAM lParam +) +{ + return (fnWndProcRadioBox( hWnd + ,(ULONG)uMessage + ,(MPARAM)wParam + ,(MPARAM)lParam + ) + ); +} // end of wxRadioBoxWndProc +