#ifdef __WXMICROWIN__
-static inline bool IsIconic(HWND WXUNUSED(hwnd)) { return FALSE; }
+// static inline bool IsIconic(HWND WXUNUSED(hwnd)) { return FALSE; }
static inline bool IsZoomed(HWND WXUNUSED(hwnd)) { return FALSE; }
#endif // __WXMICROWIN__
{
parent = wxTheApp->GetTopWindow();
- // but don't use the window which is currently hidden as then the
- // dialog would be hidden as well
- if ( parent && !parent->IsShown() )
+ if ( parent )
{
- parent = NULL;
+ // don't use transient windows as parents, this is dangerous as it
+ // can lead to a crash if the parent is destroyed before the child
+ //
+ // also don't use the window which is currently hidden as then the
+ // dialog would be hidden as well
+ if ( (parent->GetExtraStyle() & wxWS_EX_TRANSIENT) ||
+ !parent->IsShown() )
+ {
+ parent = NULL;
+ }
}
}
// move the dialog to its initial position without forcing repainting
int x, y, w, h;
- if ( MSWGetCreateWindowCoords(pos, size, x, y, w, h) )
+ if ( !MSWGetCreateWindowCoords(pos, size, x, y, w, h) )
{
- // we can't use CW_USEDEFAULT here as we're not calling CreateWindow()
- // and passing CW_USEDEFAULT to MoveWindow() results in resizing the
- // window to (0, 0) size which breaks quite a lot of things, e.g. the
- // sizer calculation in wxSizer::Fit()
- if ( w == CW_USEDEFAULT )
- {
- // the exact number doesn't matter, the dialog will be resized
- // again soon anyhow but it should be big enough to allow
- // calculation relying on "totalSize - clientSize > 0" work, i.e.
- // at least greater than the title bar height
- w =
- h = 100;
- }
+ x =
+ w = (int)CW_USEDEFAULT;
+ }
- if ( x == CW_USEDEFAULT )
- {
- // well, where should we put it? maybe centre it on screen?
- x =
- y = 0;
- }
+ // we can't use CW_USEDEFAULT here as we're not calling CreateWindow()
+ // and passing CW_USEDEFAULT to MoveWindow() results in resizing the
+ // window to (0, 0) size which breaks quite a lot of things, e.g. the
+ // sizer calculation in wxSizer::Fit()
+ if ( w == (int)CW_USEDEFAULT )
+ {
+ // the exact number doesn't matter, the dialog will be resized
+ // again soon anyhow but it should be big enough to allow
+ // calculation relying on "totalSize - clientSize > 0" work, i.e.
+ // at least greater than the title bar height
+ w =
+ h = 100;
+ }
- if ( !::MoveWindow(GetHwnd(), x, y, w, h, FALSE) )
- {
- wxLogLastError(wxT("MoveWindow"));
- }
+ if ( x == (int)CW_USEDEFAULT )
+ {
+ // centre it on the screen - what else can we do?
+ wxSize sizeDpy = wxGetDisplaySize();
+
+ x = (sizeDpy.x - w) / 2;
+ y = (sizeDpy.y - h) / 2;
+ }
+
+ if ( !::MoveWindow(GetHwnd(), x, y, w, h, FALSE) )
+ {
+ wxLogLastError(wxT("MoveWindow"));
}
- //else: leave it at default position
if ( !title.empty() )
{
}
// ----------------------------------------------------------------------------
-// wxTopLevelWindowMSW geometry
+// wxTopLevelWindowMSW client size
// ----------------------------------------------------------------------------
void wxTopLevelWindowMSW::DoSetClientSize(int width, int height)
{
- HWND hWnd = GetHwnd();
-
- RECT rectClient;
- ::GetClientRect(hWnd, &rectClient);
+ // call GetClientAreaOrigin() to take the toolbar into account
+ wxPoint pt = GetClientAreaOrigin();
+ width += pt.x;
+ height += pt.y;
- RECT rectTotal;
- ::GetWindowRect(hWnd, &rectTotal);
+ wxWindow::DoSetClientSize(width, height);
+}
- // Find the difference between the entire window (title bar and all)
- // and the client area; add this to the new client size to move the
- // window
- width += rectTotal.right - rectTotal.left - rectClient.right;
- height += rectTotal.bottom - rectTotal.top - rectClient.bottom;
+void wxTopLevelWindowMSW::DoGetClientSize(int *x, int *y) const
+{
+ wxWindow::DoGetClientSize(x, y);
- // note that calling GetClientAreaOrigin() takes the toolbar into account
wxPoint pt = GetClientAreaOrigin();
- width += pt.x;
- height += pt.y;
- if ( !::MoveWindow(hWnd, rectTotal.left, rectTotal.top,
- width, height, TRUE /* redraw */) )
- {
- wxLogLastError(_T("MoveWindow"));
- }
+ if ( x )
+ *x -= pt.x;
- wxSizeEvent event(wxSize(width, height), m_windowId);
- event.SetEventObject(this);
- (void)GetEventHandler()->ProcessEvent(event);
+ if ( y )
+ *y -= pt.y;
}
// ----------------------------------------------------------------------------
}
#endif // __WIN95__
}
+
+bool wxTopLevelWindowMSW::EnableCloseButton(bool enable)
+{
+#ifndef __WXMICROWIN__
+ // get system (a.k.a. window) menu
+ HMENU hmenu = ::GetSystemMenu(GetHwnd(), FALSE /* get it */);
+ if ( !hmenu )
+ {
+ wxLogLastError(_T("GetSystemMenu"));
+
+ return FALSE;
+ }
+
+ // enabling/disabling the close item from it also automatically
+ // disables/enables the close title bar button
+ if ( ::EnableMenuItem(hmenu, SC_CLOSE,
+ MF_BYCOMMAND |
+ (enable ? MF_ENABLED : MF_GRAYED)) == -1 )
+ {
+ wxLogLastError(_T("EnableMenuItem(SC_CLOSE)"));
+
+ return FALSE;
+ }
+
+ // update appearance immediately
+ if ( !::DrawMenuBar(GetHwnd()) )
+ {
+ wxLogLastError(_T("DrawMenuBar"));
+ }
+#endif // !__WXMICROWIN__
+
+ return TRUE;
+}
+