Integrated fixes for sizing/positioning; cleanup; removal of handle/window
association in dtor. (All according to patch #1396667). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@36745 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
179db36df4
commit
a4ebf7ba61
@ -126,22 +126,12 @@ public:
|
||||
|
||||
|
||||
virtual int GetCount(void) const;
|
||||
inline int GetNumberOfRowsOrCols(void) const { return m_nNoRowsOrCols; }
|
||||
void GetPosition( int* pnX
|
||||
,int* pnY
|
||||
) const;
|
||||
inline WXHWND* GetRadioButtons(void) const { return m_ahRadioButtons; }
|
||||
int GetSelection(void) const;
|
||||
void GetSize( int* pnX
|
||||
,int* pnY
|
||||
) const;
|
||||
inline int GetSizeFlags(void) const { return m_nSizeFlags; }
|
||||
void AdjustButtons( int nX
|
||||
,int nY
|
||||
,int nWidth
|
||||
,int nHeight
|
||||
,int nSizeFlags
|
||||
);
|
||||
wxString GetString(int nIndex) const;
|
||||
virtual wxString GetStringSelection(void) const;
|
||||
|
||||
@ -149,7 +139,6 @@ public:
|
||||
void SetFocus(void);
|
||||
virtual bool SetFont(const wxFont& rFont);
|
||||
inline void SetLabelFont(const wxFont& WXUNUSED(font)) {};
|
||||
inline void SetNumberOfRowsOrCols(int nNum) { m_nNoRowsOrCols = nNum; }
|
||||
void SetSelection(int nIndex);
|
||||
virtual void SetString( int nNum
|
||||
,const wxString& rsLabel
|
||||
@ -182,7 +171,6 @@ protected:
|
||||
int* m_pnRadioWidth; // for bitmaps
|
||||
int* m_pnRadioHeight;
|
||||
int m_nNoItems;
|
||||
int m_nNoRowsOrCols;
|
||||
int m_nSelectedButton;
|
||||
int m_nSizeFlags;
|
||||
|
||||
|
@ -46,10 +46,11 @@ MRESULT EXPENTRY wxRadioBoxWndProc( HWND hWnd
|
||||
// global vars
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
// the pointer to standard radio button wnd proc
|
||||
extern void wxAssociateWinWithHandle( HWND hWnd
|
||||
,wxWindowOS2* pWin
|
||||
);
|
||||
extern void wxRemoveHandleAssociation( wxWindowOS2 *pWin );
|
||||
// the pointer to standard radio button & box wnd procs
|
||||
static WXFARPROC fnWndProcRadioBtn = NULL;
|
||||
static WXFARPROC fnWndProcRadioBox = NULL;
|
||||
|
||||
@ -66,7 +67,6 @@ wxRadioBox::wxRadioBox()
|
||||
{
|
||||
m_nSelectedButton = -1;
|
||||
m_nNoItems = 0;
|
||||
m_nNoRowsOrCols = 0;
|
||||
m_ahRadioButtons = NULL;
|
||||
m_pnRadioWidth = NULL;
|
||||
m_pnRadioHeight = NULL;
|
||||
@ -76,11 +76,17 @@ wxRadioBox::~wxRadioBox()
|
||||
{
|
||||
m_isBeingDeleted = true;
|
||||
|
||||
if (m_hWnd)
|
||||
wxRemoveHandleAssociation(this);
|
||||
if (m_ahRadioButtons)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < m_nNoItems; i++)
|
||||
for (int i = 0; i < m_nNoItems; i++)
|
||||
{
|
||||
wxWindow* pWin = wxFindWinFromHandle((WXHWND)m_ahRadioButtons[i]);
|
||||
wxRemoveHandleAssociation(pWin);
|
||||
|
||||
::WinDestroyWindow((HWND)m_ahRadioButtons[i]);
|
||||
}
|
||||
delete[] m_ahRadioButtons;
|
||||
}
|
||||
if (m_pnRadioWidth)
|
||||
@ -89,143 +95,6 @@ wxRadioBox::~wxRadioBox()
|
||||
delete[] m_pnRadioHeight;
|
||||
} // end of wxRadioBox::~wxRadioBox
|
||||
|
||||
void wxRadioBox::AdjustButtons( int nX,
|
||||
int nY,
|
||||
int nWidth,
|
||||
int nHeight,
|
||||
int WXUNUSED(nSizeFlags) )
|
||||
{
|
||||
wxSize vMaxSize;
|
||||
int nXOffset = nX;
|
||||
int nYOffset = nY + nHeight;
|
||||
int nCx1;
|
||||
int nCy1;
|
||||
int nStartX;
|
||||
int nStartY;
|
||||
int nMaxWidth;
|
||||
int nMaxHeight;
|
||||
wxFont vFont = GetFont();
|
||||
|
||||
wxGetCharSize( m_hWnd
|
||||
,&nCx1
|
||||
,&nCy1
|
||||
,&vFont
|
||||
);
|
||||
vMaxSize = GetMaxButtonSize();
|
||||
nMaxWidth = vMaxSize.x;
|
||||
nMaxHeight = vMaxSize.y;
|
||||
|
||||
nXOffset += nCx1;
|
||||
nYOffset -= (nMaxHeight + ((3*nCy1)/2));
|
||||
|
||||
nStartX = nXOffset;
|
||||
nStartY = nYOffset;
|
||||
|
||||
for (int i = 0; i < m_nNoItems; i++)
|
||||
{
|
||||
//
|
||||
// The last button in the row may be wider than the other ones as the
|
||||
// radiobox may be wider than the sum of the button widths (as it
|
||||
// happens, for example, when the radiobox label is very long)
|
||||
//
|
||||
bool bIsLastInTheRow;
|
||||
|
||||
if (m_windowStyle & wxRA_SPECIFY_COLS)
|
||||
{
|
||||
//
|
||||
// Item is the last in its row if it is a multiple of the number of
|
||||
// columns or if it is just the last item
|
||||
//
|
||||
int n = i + 1;
|
||||
|
||||
bIsLastInTheRow = ((n % GetMajorDim()) == 0) || (n == m_nNoItems);
|
||||
}
|
||||
else // winRA_SPECIFY_ROWS
|
||||
{
|
||||
//
|
||||
// Item is the last in the row if it is in the last columns
|
||||
//
|
||||
bIsLastInTheRow = i >= (m_nNoItems/GetMajorDim()) * GetMajorDim();
|
||||
}
|
||||
|
||||
//
|
||||
// Is this the start of new row/column?
|
||||
//
|
||||
if (i && (i % GetMajorDim() == 0))
|
||||
{
|
||||
if (m_windowStyle & wxRA_SPECIFY_ROWS)
|
||||
{
|
||||
|
||||
//
|
||||
// Start of new column
|
||||
//
|
||||
nYOffset = nStartY;
|
||||
nXOffset += nMaxWidth + nCx1;
|
||||
}
|
||||
else // start of new row
|
||||
{
|
||||
nXOffset = nStartX;
|
||||
nYOffset -= nMaxHeight;
|
||||
if (m_pnRadioWidth[0] > 0L)
|
||||
nYOffset -= nCy1/2;
|
||||
}
|
||||
}
|
||||
|
||||
int nWidthBtn;
|
||||
|
||||
if (bIsLastInTheRow)
|
||||
{
|
||||
//
|
||||
// Make the button go to the end of radio box
|
||||
//
|
||||
nWidthBtn = nStartX + nWidth - nXOffset - (2 * nCx1);
|
||||
if (nWidthBtn < nMaxWidth)
|
||||
nWidthBtn = nMaxWidth;
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
// Normal button, always of the same size
|
||||
//
|
||||
nWidthBtn = nMaxWidth;
|
||||
}
|
||||
|
||||
//
|
||||
// Make all buttons of the same, maximal size - like this they
|
||||
// cover the radiobox entirely and the radiobox tooltips are always
|
||||
// shown (otherwise they are not when the mouse pointer is in the
|
||||
// radiobox part not belonging to any radiobutton)
|
||||
//
|
||||
::WinSetWindowPos( (HWND)m_ahRadioButtons[i]
|
||||
,HWND_BOTTOM
|
||||
,(LONG)nXOffset
|
||||
,(LONG)nYOffset
|
||||
,(LONG)nWidthBtn
|
||||
,(LONG)nMaxHeight
|
||||
,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
|
||||
);
|
||||
//
|
||||
// Where do we put the next button?
|
||||
//
|
||||
if (m_windowStyle & wxRA_SPECIFY_ROWS)
|
||||
{
|
||||
//
|
||||
// Below this one
|
||||
//
|
||||
nYOffset -= nMaxHeight;
|
||||
if (m_pnRadioWidth[0] > 0)
|
||||
nYOffset -= nCy1/2;
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
// To the right of this one
|
||||
//
|
||||
nXOffset += nWidthBtn + nCx1;
|
||||
}
|
||||
}
|
||||
} // end of wxRadioBox::AdjustButtons
|
||||
|
||||
void wxRadioBox::Command (
|
||||
wxCommandEvent& rEvent
|
||||
)
|
||||
@ -284,6 +153,7 @@ bool wxRadioBox::Create(
|
||||
{
|
||||
wxColour vColour;
|
||||
LONG lColor;
|
||||
HWND hWndParent = GetHwndOf(pParent);
|
||||
|
||||
vColour.Set(wxString(wxT("BLACK")));
|
||||
m_backgroundColour = pParent->GetBackgroundColour();
|
||||
@ -317,12 +187,7 @@ bool wxRadioBox::Create(
|
||||
//
|
||||
m_nNoItems = nNum;
|
||||
SetMajorDim(nMajorDim == 0 ? nNum : nMajorDim, lStyle);
|
||||
m_nNoRowsOrCols = nMajorDim;
|
||||
|
||||
//
|
||||
// Some radio boxes test consecutive id.
|
||||
//
|
||||
(void)NewControlId();
|
||||
m_ahRadioButtons = new WXHWND[nNum];
|
||||
m_pnRadioWidth = new int[nNum];
|
||||
m_pnRadioHeight = new int[nNum];
|
||||
@ -330,41 +195,42 @@ bool wxRadioBox::Create(
|
||||
for (int i = 0; i < nNum; i++)
|
||||
{
|
||||
m_pnRadioWidth[i] = m_pnRadioHeight[i] = -1;
|
||||
|
||||
long lStyleBtn = BS_AUTORADIOBUTTON | WS_TABSTOP | WS_VISIBLE;
|
||||
long lStyleBtn = BS_AUTORADIOBUTTON | WS_VISIBLE;
|
||||
int nNewId = NewControlId();
|
||||
|
||||
if (i == 0)
|
||||
lStyleBtn |= WS_GROUP;
|
||||
lStyleBtn |= WS_GROUP | WS_TABSTOP;
|
||||
|
||||
HWND hWndBtn = (WXHWND)::WinCreateWindow ( GetHwndOf(pParent)
|
||||
,WC_BUTTON
|
||||
,::wxPMTextToLabel(asChoices[i])
|
||||
,lStyleBtn
|
||||
,0, 0, 0, 0
|
||||
,GetWinHwnd(pParent)
|
||||
,HWND_BOTTOM
|
||||
,(HMENU)nNewId
|
||||
,NULL
|
||||
,NULL
|
||||
wxString sLabel = ::wxPMTextToLabel(asChoices[i]);
|
||||
|
||||
HWND hWndBtn = (WXHWND)::WinCreateWindow ( hWndParent,
|
||||
WC_BUTTON,
|
||||
sLabel.c_str(),
|
||||
lStyleBtn,
|
||||
0, 0, 0, 0,
|
||||
hWndParent,
|
||||
HWND_BOTTOM,
|
||||
(HMENU)nNewId,
|
||||
NULL,
|
||||
NULL
|
||||
);
|
||||
if (!hWndBtn)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
lColor = (LONG)vColour.GetPixel();
|
||||
::WinSetPresParam( hWndBtn
|
||||
,PP_FOREGROUNDCOLOR
|
||||
,sizeof(LONG)
|
||||
,(PVOID)&lColor
|
||||
);
|
||||
lColor = (LONG)m_backgroundColour.GetPixel();
|
||||
|
||||
lColor = (LONG)m_backgroundColour.GetPixel();
|
||||
::WinSetPresParam( hWndBtn
|
||||
,PP_BACKGROUNDCOLOR
|
||||
,sizeof(LONG)
|
||||
,(PVOID)&lColor
|
||||
);
|
||||
if (!hWndBtn)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
m_ahRadioButtons[i] = (WXHWND)hWndBtn;
|
||||
SubclassRadioButton((WXHWND)hWndBtn);
|
||||
wxAssociateWinWithHandle(hWndBtn, this);
|
||||
@ -378,18 +244,17 @@ bool wxRadioBox::Create(
|
||||
//
|
||||
// Create a dummy control to end the group.
|
||||
//
|
||||
(void)::WinCreateWindow ( GetHwndOf(pParent),
|
||||
(void)::WinCreateWindow ( hWndParent,
|
||||
WC_BUTTON,
|
||||
"",
|
||||
WS_GROUP,
|
||||
0, 0, 0, 0,
|
||||
GetWinHwnd(pParent),
|
||||
hWndParent,
|
||||
HWND_TOP,
|
||||
(HMENU)NewControlId(),
|
||||
NULL,
|
||||
NULL
|
||||
);
|
||||
SetFont(*wxSMALL_FONT);
|
||||
fnWndProcRadioBox = (WXFARPROC)::WinSubclassWindow( GetHwnd()
|
||||
,(PFNWP)wxRadioBoxWndProc
|
||||
);
|
||||
@ -421,7 +286,7 @@ bool wxRadioBox::Create(
|
||||
wxSize wxRadioBox::DoGetBestSize() const
|
||||
{
|
||||
return (GetTotalButtonSize(GetMaxButtonSize()));
|
||||
} // end of WinGuiBase_CRadioBox::DoGetBestSize
|
||||
} // end of wxRadioBox::DoGetBestSize
|
||||
|
||||
void wxRadioBox::DoSetSize(
|
||||
int nX
|
||||
@ -431,6 +296,9 @@ void wxRadioBox::DoSetSize(
|
||||
, int nSizeFlags
|
||||
)
|
||||
{
|
||||
//
|
||||
// Input parameters assume wxWidgets coordinate system
|
||||
//
|
||||
int nCurrentX;
|
||||
int nCurrentY;
|
||||
int nWidthOld;
|
||||
@ -505,22 +373,19 @@ void wxRadioBox::DoSetSize(
|
||||
nHeight = nHeightOld;
|
||||
}
|
||||
|
||||
//
|
||||
// Now convert to OS/2 coordinate system
|
||||
//
|
||||
wxWindowOS2* pParent = (wxWindowOS2*)GetParent();
|
||||
|
||||
if (pParent)
|
||||
{
|
||||
int nOS2Height = GetOS2ParentHeight(pParent);
|
||||
|
||||
nYy = nOS2Height - (nYy + nHeight);
|
||||
nYOffset = nYy + nHeight;
|
||||
}
|
||||
nYy = GetOS2ParentHeight(pParent) - nYy - nHeight;
|
||||
else
|
||||
{
|
||||
RECTL vRect;
|
||||
|
||||
::WinQueryWindowRect(HWND_DESKTOP, &vRect);
|
||||
nYy = vRect.yTop - (nYy + nHeight);
|
||||
nYy = vRect.yTop - nYy - nHeight;
|
||||
}
|
||||
nYOffset = nYy + nHeight;
|
||||
::WinSetWindowPos( GetHwnd()
|
||||
,HWND_TOP
|
||||
,(LONG)nXx
|
||||
@ -582,7 +447,6 @@ void wxRadioBox::DoSetSize(
|
||||
{
|
||||
if (m_windowStyle & wxRA_SPECIFY_ROWS)
|
||||
{
|
||||
|
||||
//
|
||||
// Start of new column
|
||||
//
|
||||
@ -724,53 +588,6 @@ wxSize wxRadioBox::GetMaxButtonSize() const
|
||||
return maxsize;
|
||||
} // end of wxRadioBox::GetMaxButtonSize
|
||||
|
||||
void wxRadioBox::GetPosition( int* pnX,
|
||||
int* WXUNUSED(pnY) ) const
|
||||
{
|
||||
wxWindowOS2* pParent = GetParent();
|
||||
RECT vRect = { -1, -1, -1, -1 };
|
||||
POINTL vPoint;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < m_nNoItems; i++)
|
||||
wxFindMaxSize( m_ahRadioButtons[i]
|
||||
,&vRect
|
||||
);
|
||||
if (m_hWnd)
|
||||
wxFindMaxSize( m_hWnd
|
||||
,&vRect
|
||||
);
|
||||
|
||||
//
|
||||
// Since we now have the absolute screen coords, if there's a parent we
|
||||
// must subtract its top left corner
|
||||
//
|
||||
vPoint.x = vRect.xLeft;
|
||||
vPoint.y = vRect.yTop;
|
||||
if (pParent)
|
||||
{
|
||||
SWP vSwp;
|
||||
|
||||
::WinQueryWindowPos((HWND)pParent->GetHWND(), &vSwp);
|
||||
vPoint.x = vSwp.x;
|
||||
vPoint.y = vSwp.y;
|
||||
}
|
||||
|
||||
//
|
||||
// We may be faking the client origin. So a window that's really at (0, 30)
|
||||
// may appear (to wxWin apps) to be at (0, 0).
|
||||
//
|
||||
if (GetParent())
|
||||
{
|
||||
wxPoint vPt(GetParent()->GetClientAreaOrigin());
|
||||
|
||||
vPoint.x = vPt.x;
|
||||
vPoint.y = vPt.y;
|
||||
}
|
||||
if (pnX)
|
||||
*pnX = vPoint.y;
|
||||
} // end of wxRadioBox::GetPosition
|
||||
|
||||
// Get single selection, for single choice list items
|
||||
int wxRadioBox::GetSelection() const
|
||||
{
|
||||
@ -780,7 +597,6 @@ int wxRadioBox::GetSelection() const
|
||||
void wxRadioBox::GetSize( int* pnWidth, int* pnHeight ) const
|
||||
{
|
||||
RECT vRect;
|
||||
int i;
|
||||
|
||||
vRect.xLeft = -1;
|
||||
vRect.xRight = -1;
|
||||
@ -792,7 +608,7 @@ void wxRadioBox::GetSize( int* pnWidth, int* pnHeight ) const
|
||||
,&vRect
|
||||
);
|
||||
|
||||
for (i = 0; i < m_nNoItems; i++)
|
||||
for (int i = 0; i < m_nNoItems; i++)
|
||||
wxFindMaxSize( m_ahRadioButtons[i]
|
||||
,&vRect
|
||||
);
|
||||
@ -808,6 +624,7 @@ wxString wxRadioBox::GetString(
|
||||
int nNum
|
||||
) const
|
||||
{
|
||||
wxCHECK_MSG( IsValid(nNum), wxString(""), wxT("invalid radiobox index") );
|
||||
return wxGetWindowText(m_ahRadioButtons[nNum]);
|
||||
} // end of wxRadioBox::GetString
|
||||
|
||||
@ -887,7 +704,6 @@ bool wxRadioBox::OS2Command( WXUINT uCmd,
|
||||
if (wId == GetId())
|
||||
return true;
|
||||
|
||||
|
||||
for (int i = 0; i < m_nNoItems; i++)
|
||||
{
|
||||
if (wId == wxGetWindowId(m_ahRadioButtons[i]))
|
||||
|
Loading…
Reference in New Issue
Block a user