]>
git.saurik.com Git - wxWidgets.git/blob - include/wx/msw/subwin.h
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: wx/msw/subwin.h
3 // Purpose: helper for implementing the controls with subwindows
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 2004 Vadim Zeitlin <vadim@wxwindows.org>
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 #ifndef _WX_MSW_SUBWIN_H_
13 #define _WX_MSW_SUBWIN_H_
15 #include "wx/msw/private.h"
17 // ----------------------------------------------------------------------------
18 // wxSubwindows contains all HWNDs making part of a single wx control
19 // ----------------------------------------------------------------------------
21 class WXDLLEXPORT wxSubwindows
24 // the number of subwindows can be specified either as parameter to ctor or
26 wxSubwindows(size_t n
= 0) { Init(); if ( n
) Create(n
); }
28 // allocate enough space for the given number of windows
31 wxASSERT_MSG( !m_hwnds
, _T("Create() called twice?") );
34 m_hwnds
= (HWND
*)calloc(n
, sizeof(HWND
));
37 // non-virtual dtor, this class is not supposed to be used polymorphically
40 for ( size_t n
= 0; n
< m_count
; n
++ )
42 ::DestroyWindow(m_hwnds
[n
]);
48 // get the number of subwindows
49 size_t GetCount() const { return m_count
; }
51 // access a given window
54 wxASSERT_MSG( n
< m_count
, _T("subwindow index out of range") );
59 HWND
& operator[](size_t n
) { return Get(n
); }
60 HWND
operator[](size_t n
) const
62 return wx_const_cast(wxSubwindows
*, this)->Get(n
);
65 // check if we have this window
66 bool HasWindow(HWND hwnd
)
68 for ( size_t n
= 0; n
< m_count
; n
++ )
70 if ( m_hwnds
[n
] == hwnd
)
78 // methods which are forwarded to all subwindows
79 // ---------------------------------------------
81 // show/hide everything
84 int sw
= show
? SW_SHOW
: SW_HIDE
;
85 for ( size_t n
= 0; n
< m_count
; n
++ )
87 ::ShowWindow(m_hwnds
[n
], sw
);
91 // enable/disable everything
92 void Enable(bool enable
)
94 for ( size_t n
= 0; n
< m_count
; n
++ )
96 ::EnableWindow(m_hwnds
[n
], enable
);
100 // set font for all windows
101 void SetFont(const wxFont
& font
)
103 HFONT hfont
= GetHfontOf(font
);
104 wxCHECK_RET( hfont
, _T("invalid font") );
106 for ( size_t n
= 0; n
< m_count
; n
++ )
108 ::SendMessage(m_hwnds
[n
], WM_SETFONT
, (WPARAM
)hfont
, 0);
110 // otherwise the window might not be redrawn correctly
111 ::InvalidateRect(m_hwnds
[n
], NULL
, FALSE
/* don't erase bg */);
115 // find the bounding box for all windows
116 wxRect
GetBoundingBox() const
119 for ( size_t n
= 0; n
< m_count
; n
++ )
122 ::GetWindowRect(m_hwnds
[n
], &rc
);
124 r
.Union(wxRectFromRECT(rc
));
137 // number of elements in m_hwnds array
140 // the HWNDs we contain
144 DECLARE_NO_COPY_CLASS(wxSubwindows
)
147 // convenient macro to forward a few methods which are usually propagated to
148 // subwindows to a wxSubwindows object
150 // parameters should be:
151 // - cname the name of the class implementing these methods
152 // - base the name of its base class
153 // - subwins the name of the member variable of type wxSubwindows *
154 #define WX_FORWARD_STD_METHODS_TO_SUBWINDOWS(cname, base, subwins) \
155 bool cname::ContainsHWND(WXHWND hWnd) const \
157 return subwins && subwins->HasWindow((HWND)hWnd); \
160 bool cname::Show(bool show) \
162 if ( !base::Show(show) ) \
166 subwins->Show(show); \
171 bool cname::Enable(bool enable) \
173 if ( !base::Enable(enable) ) \
177 subwins->Enable(enable); \
182 bool cname::SetFont(const wxFont& font) \
184 if ( !base::SetFont(font) ) \
188 subwins->SetFont(font); \
194 #endif // _WX_MSW_SUBWIN_H_