]>
Commit | Line | Data |
---|---|---|
82c9f85c VZ |
1 | /////////////////////////////////////////////////////////////////////////////// |
2 | // Name: msw/toplevel.cpp | |
3 | // Purpose: implements wxTopLevelWindow for MSW | |
4 | // Author: Vadim Zeitlin | |
5 | // Modified by: | |
6 | // Created: 24.09.01 | |
7 | // RCS-ID: $Id$ | |
8 | // Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) | |
9 | // License: wxWindows license | |
10 | /////////////////////////////////////////////////////////////////////////////// | |
11 | ||
12 | // ============================================================================ | |
13 | // declarations | |
14 | // ============================================================================ | |
15 | ||
16 | // ---------------------------------------------------------------------------- | |
17 | // headers | |
18 | // ---------------------------------------------------------------------------- | |
19 | ||
20 | #ifdef __GNUG__ | |
21 | #pragma implementation "toplevel.h" | |
22 | #endif | |
23 | ||
24 | // For compilers that support precompilation, includes "wx.h". | |
25 | #include "wx/wxprec.h" | |
26 | ||
27 | #ifdef __BORLANDC__ | |
28 | #pragma hdrstop | |
29 | #endif | |
30 | ||
31 | #ifndef WX_PRECOMP | |
3a922bb4 RL |
32 | #include "wx/app.h" |
33 | #include "wx/toplevel.h" | |
82c9f85c VZ |
34 | #include "wx/string.h" |
35 | #include "wx/log.h" | |
36 | #include "wx/intl.h" | |
37 | #endif //WX_PRECOMP | |
38 | ||
39 | #include "wx/msw/private.h" | |
40 | ||
41 | // ---------------------------------------------------------------------------- | |
42 | // stubs for missing functions under MicroWindows | |
43 | // ---------------------------------------------------------------------------- | |
44 | ||
45 | #ifdef __WXMICROWIN__ | |
46 | ||
47 | static inline bool IsIconic(HWND WXUNUSED(hwnd)) { return FALSE; } | |
48 | static inline bool IsZoomed(HWND WXUNUSED(hwnd)) { return FALSE; } | |
49 | ||
50 | #endif // __WXMICROWIN__ | |
51 | ||
52 | // ---------------------------------------------------------------------------- | |
53 | // globals | |
54 | // ---------------------------------------------------------------------------- | |
55 | ||
56 | // list of all frames and modeless dialogs | |
57 | wxWindowList wxModelessWindows; | |
58 | ||
59 | // ============================================================================ | |
60 | // wxTopLevelWindowMSW implementation | |
61 | // ============================================================================ | |
62 | ||
63 | // ---------------------------------------------------------------------------- | |
64 | // wxTopLevelWindowMSW creation | |
65 | // ---------------------------------------------------------------------------- | |
66 | ||
67 | void wxTopLevelWindowMSW::Init() | |
68 | { | |
69 | m_iconized = | |
70 | m_maximizeOnShow = FALSE; | |
71 | } | |
72 | ||
73 | bool wxTopLevelWindowMSW::Create(wxWindow *parent, | |
74 | wxWindowID id, | |
75 | const wxString& title, | |
76 | const wxPoint& pos, | |
77 | const wxSize& size, | |
78 | long style, | |
79 | const wxString& name) | |
80 | { | |
81 | // init our fields | |
82 | Init(); | |
83 | ||
84 | m_windowStyle = style; | |
85 | ||
86 | SetName(name); | |
87 | ||
88 | m_windowId = id == -1 ? NewControlId() : id; | |
89 | ||
90 | wxTopLevelWindows.Append(this); | |
91 | ||
92 | if ( parent ) | |
93 | parent->AddChild(this); | |
94 | ||
95 | return TRUE; | |
96 | } | |
97 | ||
98 | wxTopLevelWindowMSW::~wxTopLevelWindowMSW() | |
99 | { | |
100 | wxTopLevelWindows.DeleteObject(this); | |
101 | ||
102 | if ( wxModelessWindows.Find(this) ) | |
103 | wxModelessWindows.DeleteObject(this); | |
104 | ||
105 | // If this is the last top-level window, exit. | |
106 | if ( wxTheApp && (wxTopLevelWindows.Number() == 0) ) | |
107 | { | |
108 | wxTheApp->SetTopWindow(NULL); | |
109 | ||
110 | if ( wxTheApp->GetExitOnFrameDelete() ) | |
111 | { | |
112 | ::PostQuitMessage(0); | |
113 | } | |
114 | } | |
115 | } | |
116 | ||
117 | // ---------------------------------------------------------------------------- | |
118 | // wxTopLevelWindowMSW geometry | |
119 | // ---------------------------------------------------------------------------- | |
120 | ||
121 | void wxTopLevelWindowMSW::DoSetClientSize(int width, int height) | |
122 | { | |
123 | HWND hWnd = GetHwnd(); | |
124 | ||
125 | RECT rectClient; | |
126 | ::GetClientRect(hWnd, &rectClient); | |
127 | ||
128 | RECT rectTotal; | |
129 | ::GetWindowRect(hWnd, &rectTotal); | |
130 | ||
131 | // Find the difference between the entire window (title bar and all) | |
132 | // and the client area; add this to the new client size to move the | |
133 | // window | |
134 | width += rectTotal.right - rectTotal.left - rectClient.right; | |
135 | height += rectTotal.bottom - rectTotal.top - rectClient.bottom; | |
136 | ||
137 | // note that calling GetClientAreaOrigin() takes the toolbar into account | |
138 | wxPoint pt = GetClientAreaOrigin(); | |
139 | width += pt.x; | |
140 | height += pt.y; | |
141 | ||
142 | if ( !::MoveWindow(hWnd, rectTotal.left, rectTotal.top, | |
143 | width, height, TRUE /* redraw */) ) | |
144 | { | |
145 | wxLogLastError(_T("MoveWindow")); | |
146 | } | |
147 | ||
148 | wxSizeEvent event(wxSize(width, height), m_windowId); | |
149 | event.SetEventObject(this); | |
150 | (void)GetEventHandler()->ProcessEvent(event); | |
151 | } | |
152 | ||
153 | // ---------------------------------------------------------------------------- | |
154 | // wxTopLevelWindowMSW showing | |
155 | // ---------------------------------------------------------------------------- | |
156 | ||
157 | void wxTopLevelWindowMSW::DoShowWindow(int nShowCmd) | |
158 | { | |
159 | ::ShowWindow(GetHwnd(), nShowCmd); | |
160 | ||
161 | m_iconized = nShowCmd == SW_MINIMIZE; | |
162 | } | |
163 | ||
164 | bool wxTopLevelWindowMSW::Show(bool show) | |
165 | { | |
166 | // don't use wxWindow version as we want to call DoShowWindow() ourselves | |
167 | if ( !wxWindowBase::Show(show) ) | |
168 | return FALSE; | |
169 | ||
170 | int nShowCmd; | |
171 | if ( show ) | |
172 | { | |
173 | if ( m_maximizeOnShow ) | |
174 | { | |
175 | // show and maximize | |
176 | nShowCmd = SW_MAXIMIZE; | |
177 | ||
178 | m_maximizeOnShow = FALSE; | |
179 | } | |
180 | else // just show | |
181 | { | |
182 | nShowCmd = SW_SHOW; | |
183 | } | |
184 | } | |
185 | else // hide | |
186 | { | |
187 | nShowCmd = SW_HIDE; | |
188 | } | |
189 | ||
190 | DoShowWindow(nShowCmd); | |
191 | ||
192 | if ( show ) | |
193 | { | |
194 | ::BringWindowToTop(GetHwnd()); | |
195 | ||
196 | wxActivateEvent event(wxEVT_ACTIVATE, TRUE, m_windowId); | |
197 | event.SetEventObject( this ); | |
198 | GetEventHandler()->ProcessEvent(event); | |
199 | } | |
200 | else // hide | |
201 | { | |
202 | // Try to highlight the correct window (the parent) | |
203 | if ( GetParent() ) | |
204 | { | |
205 | HWND hWndParent = GetHwndOf(GetParent()); | |
206 | if (hWndParent) | |
207 | ::BringWindowToTop(hWndParent); | |
208 | } | |
209 | } | |
210 | ||
211 | return TRUE; | |
212 | } | |
213 | ||
214 | // ---------------------------------------------------------------------------- | |
215 | // wxTopLevelWindowMSW maximize/minimize | |
216 | // ---------------------------------------------------------------------------- | |
217 | ||
218 | void wxTopLevelWindowMSW::Maximize(bool maximize) | |
219 | { | |
220 | if ( IsShown() ) | |
221 | { | |
222 | // just maximize it directly | |
223 | DoShowWindow(maximize ? SW_MAXIMIZE : SW_RESTORE); | |
224 | } | |
225 | else // hidden | |
226 | { | |
227 | // we can't maximize the hidden frame because it shows it as well, so | |
228 | // just remember that we should do it later in this case | |
229 | m_maximizeOnShow = TRUE; | |
230 | } | |
231 | } | |
232 | ||
233 | bool wxTopLevelWindowMSW::IsMaximized() const | |
234 | { | |
235 | return ::IsZoomed(GetHwnd()) != 0; | |
236 | } | |
237 | ||
238 | void wxTopLevelWindowMSW::Iconize(bool iconize) | |
239 | { | |
240 | DoShowWindow(iconize ? SW_MINIMIZE : SW_RESTORE); | |
241 | } | |
242 | ||
243 | bool wxTopLevelWindowMSW::IsIconized() const | |
244 | { | |
245 | // also update the current state | |
246 | ((wxTopLevelWindowMSW *)this)->m_iconized = ::IsIconic(GetHwnd()) != 0; | |
247 | ||
248 | return m_iconized; | |
249 | } | |
250 | ||
251 | void wxTopLevelWindowMSW::Restore() | |
252 | { | |
253 | DoShowWindow(SW_RESTORE); | |
254 | } | |
255 | ||
256 | // ---------------------------------------------------------------------------- | |
257 | // wxTopLevelWindowMSW misc | |
258 | // ---------------------------------------------------------------------------- | |
259 | ||
260 | void wxTopLevelWindowMSW::SetIcon(const wxIcon& icon) | |
261 | { | |
262 | // this sets m_icon | |
263 | wxTopLevelWindowBase::SetIcon(icon); | |
264 | ||
265 | #if defined(__WIN95__) && !defined(__WXMICROWIN__) | |
266 | if ( m_icon.Ok() ) | |
267 | { | |
268 | ::SendMessage(GetHwnd(), WM_SETICON, | |
269 | (WPARAM)TRUE, (LPARAM)GetHiconOf(m_icon)); | |
270 | } | |
271 | #endif // __WIN95__ | |
272 | } |