m_count = n;
m_hwnds = (HWND *)calloc(n, sizeof(HWND));
+ m_ids = new wxWindowIDRef[n];
}
// non-virtual dtor, this class is not supposed to be used polymorphically
}
free(m_hwnds);
+ delete [] m_ids;
}
// get the number of subwindows
return m_hwnds[n];
}
- HWND& operator[](size_t n) { return Get(n); }
HWND operator[](size_t n) const
{
return wx_const_cast(wxSubwindows *, this)->Get(n);
}
+ // initialize the given window: id will be stored in wxWindowIDRef ensuring
+ // that it is not reused while this object exists
+ void Set(size_t n, HWND hwnd, wxWindowID id)
+ {
+ wxASSERT_MSG( n < m_count, _T("subwindow index out of range") );
+
+ m_hwnds[n] = hwnd;
+ m_ids[n] = id;
+ }
+
// check if we have this window
bool HasWindow(HWND hwnd)
{
// the HWNDs we contain
HWND *m_hwnds;
+ // the IDs of the windows
+ wxWindowIDRef *m_ids;
+
DECLARE_NO_COPY_CLASS(wxSubwindows)
};
{
m_selectedButton = wxNOT_FOUND;
m_radioButtons = NULL;
- m_radioButtonIds = NULL;
+ m_dummyButton = NULL;
m_radioWidth = NULL;
m_radioHeight = NULL;
}
wxUnusedVar(val);
#endif // wxUSE_VALIDATORS/!wxUSE_VALIDATORS
+ // We need an extra one to keep track of the 'dummy' item we
+ // create to end the radio group, so it will be destroyed and
+ // it's id will be released. But we want it separate from the
+ // other buttons since the wxSubwindows will operate on it as
+ // well and we just want to ignore it until destroying it.
+ // For instance, we don't want the bounding box of the radio
+ // buttons to include the dummy button
m_radioButtons = new wxSubwindows(n);
- m_radioButtonIds = new wxWindowIDRef[n + 1];
+ m_dummyButton = new wxSubwindows(1);
+
+
m_radioWidth = new int[n];
m_radioHeight = new int[n];
if ( i == 0 )
styleBtn |= WS_GROUP;
- m_radioButtonIds[i] = NewControlId();
+ wxWindowIDRef subid = NewControlId();
HWND hwndBtn = ::CreateWindow(_T("BUTTON"),
choices[i].wx_str(),
styleBtn,
0, 0, 0, 0, // will be set in SetSize()
GetHwndOf(parent),
- (HMENU)(wxWindowID)m_radioButtonIds[i],
+ (HMENU)subid.GetValue(),
wxGetInstance(),
NULL);
return false;
}
- (*m_radioButtons)[i] = hwndBtn;
+ // Keep track of the subwindow
+ m_radioButtons->Set(i, hwndBtn, subid);
SubclassRadioButton((WXHWND)hwndBtn);
- m_subControls.Add(m_radioButtonIds[i]);
+ // Also, make it a subcontrol of this control
+ m_subControls.Add(subid);
}
// Create a dummy radio control to end the group.
- m_radioButtonIds[n] = NewControlId();
+ wxWindowIDRef subid = NewControlId();
- (void)::CreateWindow(_T("BUTTON"),
+ HWND dummy = ::CreateWindow(_T("BUTTON"),
wxEmptyString,
WS_GROUP | BS_AUTORADIOBUTTON | WS_CHILD,
0, 0, 0, 0, GetHwndOf(parent),
- (HMENU)(wxWindowID)m_radioButtonIds[n], wxGetInstance(), NULL);
+ (HMENU)subid.GetValue(), wxGetInstance(), NULL);
+
+ // Keep track of the subwindow so it will be destroyed when the radio
+ // box is and it's id will be freed.
+ // Also, do we need to consider this dummy item a subcontrol and add it
+ // to m_subControls
+ m_dummyButton->Set(0, dummy, subid);
m_radioButtons->SetFont(GetFont());
m_isBeingDeleted = true;
delete m_radioButtons;
- delete[] m_radioButtonIds;
+ delete m_dummyButton;
delete[] m_radioWidth;
delete[] m_radioHeight;
}
void wxSlider::Init()
{
m_labels = NULL;
- m_labelIds = NULL;
m_pageSize = 1;
m_lineSize = 1;
if ( m_windowStyle & wxSL_LABELS )
{
m_labels = new wxSubwindows(SliderLabel_Last);
- m_labelIds = new wxWindowIDRef[SliderLabel_Last];
HWND hwndParent = GetHwndOf(parent);
for ( size_t n = 0; n < SliderLabel_Last; n++ )
{
- m_labelIds[n] = NewControlId();
-
- (*m_labels)[n] = ::CreateWindow
- (
- wxT("STATIC"),
- NULL,
- WS_CHILD | WS_VISIBLE | SS_CENTER,
- 0, 0, 0, 0,
- hwndParent,
- (HMENU)(wxWindowID)m_labelIds[n],
- wxGetInstance(),
- NULL
- );
+ wxWindowIDRef lblid = NewControlId();
+
+ HWND wnd = ::CreateWindow
+ (
+ wxT("STATIC"),
+ NULL,
+ WS_CHILD | WS_VISIBLE | SS_CENTER,
+ 0, 0, 0, 0,
+ hwndParent,
+ (HMENU)lblid.GetValue(),
+ wxGetInstance(),
+ NULL
+ );
+
+ m_labels->Set(n, wnd, lblid);
}
m_labels->SetFont(GetFont());
wxSlider::~wxSlider()
{
delete m_labels;
- delete[] m_labelIds;
}
// ----------------------------------------------------------------------------