LONG APIENTRY _EXPORT
wxDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
-// ----------------------------------------------------------------------------
-// globals
-// ----------------------------------------------------------------------------
-
-// the name of the default wxWidgets class
-#ifdef __WXWINCE__
-extern wxChar *wxCanvasClassName;
-#else
-extern const wxChar *wxCanvasClassName;
-#endif
-
// ----------------------------------------------------------------------------
// wxTLWHiddenParentModule: used to manage the hidden parent window (we need a
// module to ensure that the window is always deleted)
m_fsIsMaximized = false;
m_fsIsShowing = false;
- m_winLastFocused = (wxWindow *)NULL;
+ m_winLastFocused = NULL;
#if defined(__SMARTPHONE__) && defined(__WXWINCE__)
m_MenuBarHWND = 0;
// no dialogs support under MicroWin yet
return CreateFrame(title, pos, size);
#else // !__WXMICROWIN__
- wxWindow *parent = GetParent();
-
- // for the dialogs without wxDIALOG_NO_PARENT style, use the top level
- // app window as parent - this avoids creating modal dialogs without
- // parent
- if ( !parent && !(GetWindowStyleFlag() & wxDIALOG_NO_PARENT) )
- {
- parent = wxTheApp->GetTopWindow();
-
- if ( parent )
- {
- // 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;
- }
- }
- }
+ // static cast is valid as we're only ever called for dialogs
+ wxWindow * const
+ parent = static_cast<wxDialog *>(this)->
+ GetParentForModalDialog(GetParent());
m_hWnd = (WXHWND)::CreateDialogIndirect
(
exflags |= WS_EX_LAYOUTRTL;
#endif
- return MSWCreate(wxCanvasClassName, title.wx_str(), pos, sz, flags, exflags);
+ return MSWCreate(MSWGetRegisteredClassName(),
+ title.wx_str(), pos, sz, flags, exflags);
}
bool wxTopLevelWindowMSW::Create(wxWindow *parent,
// 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;
wxTopLevelWindowMSW::~wxTopLevelWindowMSW()
{
+ SendDestroyEvent();
+
#if defined(__SMARTPHONE__) || defined(__POCKETPC__)
SHACTIVATEINFO* info = (SHACTIVATEINFO*) m_activateInfo;
delete info;
m_maximizeOnShow = false;
}
+ else if ( m_iconized )
+ {
+ // iconize and show
+ nShowCmd = SW_MINIMIZE;
+ }
else // just show
{
// we shouldn't use SW_SHOW which also activates the window for
void wxTopLevelWindowMSW::Iconize(bool iconize)
{
- DoShowWindow(iconize ? SW_MINIMIZE : SW_RESTORE);
+ if ( IsShown() )
+ {
+ // change the window state immediately
+ DoShowWindow(iconize ? SW_MINIMIZE : SW_RESTORE);
+ }
+ else // hidden
+ {
+ // iconizing the window shouldn't show it so just remember that we need
+ // to become iconized when shown later
+ m_iconized = true;
+ }
}
bool wxTopLevelWindowMSW::IsIconized() const
#ifdef __WXWINCE__
return false;
#else
+ if ( !IsShown() )
+ return m_iconized;
+
// don't use m_iconized, it may be briefly out of sync with the real state
// as it's only modified when we receive a WM_SIZE and we could be called
// from an event handler from one of the messages we receive before it,
return GetLabel();
}
-void wxTopLevelWindowMSW::DoSelectAndSetIcon(const wxIconBundle& icons,
+bool wxTopLevelWindowMSW::DoSelectAndSetIcon(const wxIconBundle& icons,
int smX,
int smY,
int i)
if ( icon.Ok() )
{
::SendMessage(GetHwnd(), WM_SETICON, i, (LPARAM)GetHiconOf(icon));
+ return true;
}
+
+ return false;
}
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);
+ if ( icons.IsEmpty() )
+ {
+ // FIXME: SetIcons(wxNullIconBundle) should unset existing icons,
+ // but we currently don't do that
+ wxASSERT_MSG( m_icons.IsEmpty(), "unsetting icons doesn't work" );
+ return;
+ }
+
+ bool anySet =
+ DoSelectAndSetIcon(icons, SM_CXSMICON, SM_CYSMICON, ICON_SMALL);
+ if ( DoSelectAndSetIcon(icons, SM_CXICON, SM_CYICON, ICON_BIG) )
+ anySet = true;
+
+ if ( !anySet )
+ {
+ wxFAIL_MSG( "icon bundle doesn't contain any suitable icon" );
+ }
}
bool wxTopLevelWindowMSW::EnableCloseButton(bool enable)
DWORD dwStyle = ::GetWindowLong(GetHwnd(), GWL_STYLE);
DWORD dwExStyle = ::GetWindowLong(GetHwnd(), GWL_EXSTYLE);
::GetClientRect(GetHwnd(), &rect);
- ::AdjustWindowRectEx(&rect, dwStyle, FALSE, dwExStyle);
+ ::AdjustWindowRectEx(&rect, dwStyle, ::GetMenu(GetHwnd()) != NULL, dwExStyle);
::OffsetRgn(hrgn, -rect.left, -rect.top);
// Now call the shape API with the new region.
{
#if wxUSE_DYNLIB_CLASS
typedef DWORD (WINAPI *PSETLAYEREDWINDOWATTR)(HWND, DWORD, BYTE, DWORD);
- static PSETLAYEREDWINDOWATTR pSetLayeredWindowAttributes = NULL;
+ static PSETLAYEREDWINDOWATTR
+ pSetLayeredWindowAttributes = (PSETLAYEREDWINDOWATTR)-1;
- if ( pSetLayeredWindowAttributes == NULL )
+ if ( pSetLayeredWindowAttributes == (PSETLAYEREDWINDOWATTR)-1 )
{
wxDynamicLibrary dllUser32(_T("user32.dll"));
+
+ // use RawGetSymbol() and not GetSymbol() to avoid error messages under
+ // Windows 95: there is nothing the user can do about this anyhow
pSetLayeredWindowAttributes = (PSETLAYEREDWINDOWATTR)
- dllUser32.GetSymbol(wxT("SetLayeredWindowAttributes"));
+ dllUser32.RawGetSymbol(wxT("SetLayeredWindowAttributes"));
+
+ // it's ok to destroy dllUser32 here, we link statically to user32.dll
+ // anyhow so it won't be unloaded
}
- if ( pSetLayeredWindowAttributes == NULL )
+
+ if ( !pSetLayeredWindowAttributes )
return false;
#endif // wxUSE_DYNLIB_CLASS