}
#ifndef __WXWINCE__
- if ( style & wxSYSTEM_MENU )
+ // notice that if wxCLOSE_BOX is specified we need to use WS_SYSMENU too as
+ // otherwise the close box doesn't appear
+ if ( style & (wxSYSTEM_MENU | wxCLOSE_BOX) )
msflags |= WS_SYSMENU;
-#endif
+#endif // !__WXWINCE__
// NB: under CE these 2 styles are not supported currently, we should
// call Minimize()/Maximize() "manually" if we want to support them
{
bool ret wxDUMMY_INITIALIZE(false);
- // init our fields
- Init();
-
wxSize sizeReal = size;
if ( !sizeReal.IsFullySpecified() )
{
// reuse the code in MSWGetStyle() but correct the results slightly for
// the dialog
- dlgTemplate->style = MSWGetStyle(style, &dlgTemplate->dwExtendedStyle);
+ //
+ // NB: we need a temporary variable as we can't pass pointer to
+ // dwExtendedStyle directly, it's not aligned correctly for 64 bit
+ // architectures
+ WXDWORD dwExtendedStyle;
+ dlgTemplate->style = MSWGetStyle(style, &dwExtendedStyle);
+ dlgTemplate->dwExtendedStyle = dwExtendedStyle;
// all dialogs are popups
dlgTemplate->style |= WS_POPUP;
}
else // just show
{
- if ( GetWindowStyle() & wxFRAME_TOOL_WINDOW )
- nShowCmd = SW_SHOWNA;
- else
- nShowCmd = SW_SHOW;
+ // we shouldn't use SW_SHOW which also activates the window for
+ // tool frames (as they shouldn't steal focus from the main window)
+ // nor for the currently disabled windows as they would be enabled
+ // as a side effect
+ if ( HasFlag(wxFRAME_TOOL_WINDOW) || !IsEnabled() )
+ nShowCmd = SW_SHOWNA;
+ else
+ nShowCmd = SW_SHOW;
}
}
else // hide
// finally send an event allowing the window to relayout itself &c
wxSizeEvent event(rect.GetSize(), GetId());
- GetEventHandler()->ProcessEvent(event);
+ HandleWindowEvent(event);
}
else // stop showing full screen
{
return GetLabel();
}
-void wxTopLevelWindowMSW::SetIcons(const wxIconBundle& icons)
+void wxTopLevelWindowMSW::DoSelectAndSetIcon(const wxIconBundle& icons,
+ int smX,
+ int smY,
+ int i)
{
- wxTopLevelWindowBase::SetIcons(icons);
+ const wxSize size(::GetSystemMetrics(smX), ::GetSystemMetrics(smY));
-#if !defined(__WXMICROWIN__)
- const wxIcon& sml = icons.GetIconOfExactSize(16);
- if( sml.Ok() )
+ const wxIcon icon = icons.GetIconOfExactSize(size);
+ if ( icon.Ok() )
{
- ::SendMessage( GetHwndOf( this ), WM_SETICON, ICON_SMALL,
- (LPARAM)GetHiconOf(sml) );
+ ::SendMessage(GetHwnd(), WM_SETICON, i, (LPARAM)GetHiconOf(icon));
}
+}
- const wxIcon& big = icons.GetIconOfExactSize(32);
- if( big.Ok() )
- {
- ::SendMessage( GetHwndOf( this ), WM_SETICON, ICON_BIG,
- (LPARAM)GetHiconOf(big) );
- }
-#endif // !__WXMICROWIN__
+void wxTopLevelWindowMSW::SetIcons(const wxIconBundle& icons)
+{
+ wxTopLevelWindowBase::SetIcons(icons);
+
+ DoSelectAndSetIcon(icons, SM_CXSMICON, SM_CYSMICON, ICON_SMALL);
+ DoSelectAndSetIcon(icons, SM_CXICON, SM_CYICON, ICON_BIG);
}
bool wxTopLevelWindowMSW::EnableCloseButton(bool enable)
#if defined(FLASHW_STOP) && defined(VK_XBUTTON1) && wxUSE_DYNLIB_CLASS
// available in the headers, check if it is supported by the system
typedef BOOL (WINAPI *FlashWindowEx_t)(FLASHWINFO *pfwi);
- FlashWindowEx_t s_pfnFlashWindowEx = NULL;
+ static FlashWindowEx_t s_pfnFlashWindowEx = NULL;
if ( !s_pfnFlashWindowEx )
{
wxDynamicLibrary dllUser32(_T("user32.dll"));
return (os_type == wxOS_WINDOWS_NT && ver_major >= 5);
}
+
+void wxTopLevelWindowMSW::DoFreeze()
+{
+ // do nothing: freezing toplevel window causes paint and mouse events
+ // to go through it any TLWs under it, so the best we can do is to freeze
+ // all children -- and wxWindowBase::Freeze() does that
+}
+
+void wxTopLevelWindowMSW::DoThaw()
+{
+ // intentionally empty -- see DoFreeze()
+}
+
+
// ----------------------------------------------------------------------------
// wxTopLevelWindow event handling
// ----------------------------------------------------------------------------
{
// restore focus to the child which was last focused unless we already
// have it
- wxLogTrace(_T("focus"), _T("wxTLW %08x activated."), (int) m_hWnd);
+ wxLogTrace(_T("focus"), _T("wxTLW %p activated."), m_hWnd);
wxWindow *winFocus = FindFocus();
if ( !winFocus || wxGetTopLevelParent(winFocus) != this )
if ( m_winLastFocused )
{
// let it know that it doesn't have focus any more
- m_winLastFocused->HandleKillFocus((WXHWND)NULL);
+ // But this will already be done via WM_KILLFOCUS, so we'll get two kill
+ // focus events if we call it explicitly.
+ // m_winLastFocused->HandleKillFocus((WXHWND)NULL);
// and don't remember it if it's a child from some other frame
if ( wxGetTopLevelParent(m_winLastFocused) != this )
}
wxLogTrace(_T("focus"),
- _T("wxTLW %08x deactivated, last focused: %08x."),
- (int) m_hWnd,
- (int) (m_winLastFocused ? GetHwndOf(m_winLastFocused)
- : NULL));
+ _T("wxTLW %p deactivated, last focused: %p."),
+ m_hWnd,
+ m_winLastFocused ? GetHwndOf(m_winLastFocused) : NULL);
event.Skip();
}