// wxSubwindows contains all HWNDs making part of a single wx control
// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxSubwindows
+class WXDLLIMPEXP_CORE wxSubwindows
{
public:
// the number of subwindows can be specified either as parameter to ctor or
// allocate enough space for the given number of windows
void Create(size_t n)
{
- wxASSERT_MSG( !m_hwnds, _T("Create() called twice?") );
+ wxASSERT_MSG( !m_hwnds, wxT("Create() called twice?") );
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
{
for ( size_t n = 0; n < m_count; n++ )
{
- ::DestroyWindow(m_hwnds[n]);
+ if ( m_hwnds[n] )
+ ::DestroyWindow(m_hwnds[n]);
}
free(m_hwnds);
+ delete [] m_ids;
}
// get the number of subwindows
// access a given window
HWND& Get(size_t n)
{
- wxASSERT_MSG( n < m_count, _T("subwindow index out of range") );
+ wxASSERT_MSG( n < m_count, wxT("subwindow index out of range") );
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);
+ return 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, wxT("subwindow index out of range") );
+
+ m_hwnds[n] = hwnd;
+ m_ids[n] = id;
}
// check if we have this window
int sw = show ? SW_SHOW : SW_HIDE;
for ( size_t n = 0; n < m_count; n++ )
{
- ::ShowWindow(m_hwnds[n], sw);
+ if ( m_hwnds[n] )
+ ::ShowWindow(m_hwnds[n], sw);
+ }
+ }
+
+ // enable/disable everything
+ void Enable(bool enable)
+ {
+ for ( size_t n = 0; n < m_count; n++ )
+ {
+ if ( m_hwnds[n] )
+ ::EnableWindow(m_hwnds[n], enable);
}
}
void SetFont(const wxFont& font)
{
HFONT hfont = GetHfontOf(font);
- wxCHECK_RET( hfont, _T("invalid font") );
+ wxCHECK_RET( hfont, wxT("invalid font") );
for ( size_t n = 0; n < m_count; n++ )
{
- ::SendMessage(m_hwnds[n], WM_SETFONT, (WPARAM)hfont, 0);
+ if ( m_hwnds[n] )
+ {
+ ::SendMessage(m_hwnds[n], WM_SETFONT, (WPARAM)hfont, 0);
+
+ // otherwise the window might not be redrawn correctly
+ ::InvalidateRect(m_hwnds[n], NULL, FALSE /* don't erase bg */);
+ }
}
}
wxRect r;
for ( size_t n = 0; n < m_count; n++ )
{
- RECT rc;
- ::GetWindowRect(m_hwnds[n], &rc);
+ if ( m_hwnds[n] )
+ {
+ RECT rc;
+
+ ::GetWindowRect(m_hwnds[n], &rc);
- r.Union(wxRectFromRECT(rc));
+ r.Union(wxRectFromRECT(rc));
+ }
}
return r;
// the HWNDs we contain
HWND *m_hwnds;
+ // the IDs of the windows
+ wxWindowIDRef *m_ids;
- DECLARE_NO_COPY_CLASS(wxSubwindows)
+
+ wxDECLARE_NO_COPY_CLASS(wxSubwindows);
};
+// convenient macro to forward a few methods which are usually propagated to
+// subwindows to a wxSubwindows object
+//
+// parameters should be:
+// - cname the name of the class implementing these methods
+// - base the name of its base class
+// - subwins the name of the member variable of type wxSubwindows *
+#define WX_FORWARD_STD_METHODS_TO_SUBWINDOWS(cname, base, subwins) \
+ bool cname::ContainsHWND(WXHWND hWnd) const \
+ { \
+ return subwins && subwins->HasWindow((HWND)hWnd); \
+ } \
+ \
+ bool cname::Show(bool show) \
+ { \
+ if ( !base::Show(show) ) \
+ return false; \
+ \
+ if ( subwins ) \
+ subwins->Show(show); \
+ \
+ return true; \
+ } \
+ \
+ bool cname::Enable(bool enable) \
+ { \
+ if ( !base::Enable(enable) ) \
+ return false; \
+ \
+ if ( subwins ) \
+ subwins->Enable(enable); \
+ \
+ return true; \
+ } \
+ \
+ bool cname::SetFont(const wxFont& font) \
+ { \
+ if ( !base::SetFont(font) ) \
+ return false; \
+ \
+ if ( subwins ) \
+ subwins->SetFont(font); \
+ \
+ return true; \
+ }
+
+
#endif // _WX_MSW_SUBWIN_H_