+ m_maximizeOnShow = false;
+
+ // Data to save/restore when calling ShowFullScreen
+ m_fsStyle = 0;
+ m_fsOldWindowStyle = 0;
+ m_fsIsMaximized = false;
+ m_fsIsShowing = false;
+
+ m_winLastFocused = (wxWindow *)NULL;
+
+#if defined(__SMARTPHONE__) && defined(__WXWINCE__)
+ m_MenuBarHWND = 0;
+#endif
+
+#if defined(__SMARTPHONE__) || defined(__POCKETPC__)
+ SHACTIVATEINFO* info = new SHACTIVATEINFO;
+ wxZeroMemory(*info);
+ info->cbSize = sizeof(SHACTIVATEINFO);
+
+ m_activateInfo = (void*) info;
+#endif
+}
+
+WXDWORD wxTopLevelWindowMSW::MSWGetStyle(long style, WXDWORD *exflags) const
+{
+ // let the base class deal with the common styles but fix the ones which
+ // don't make sense for us (we also deal with the borders ourselves)
+ WXDWORD msflags = wxWindow::MSWGetStyle
+ (
+ (style & ~wxBORDER_MASK) | wxBORDER_NONE, exflags
+ ) & ~WS_CHILD & ~WS_VISIBLE;
+
+ // For some reason, WS_VISIBLE needs to be defined on creation for
+ // SmartPhone 2003. The title can fail to be displayed otherwise.
+#if defined(__SMARTPHONE__) || (defined(__WXWINCE__) && _WIN32_WCE < 400)
+ msflags |= WS_VISIBLE;
+ ((wxTopLevelWindowMSW*)this)->wxWindowBase::Show(true);
+#endif
+
+ // first select the kind of window being created
+ //
+ // note that if we don't set WS_POPUP, Windows assumes WS_OVERLAPPED and
+ // creates a window with both caption and border, hence we need to use
+ // WS_POPUP in a few cases just to avoid having caption/border which we
+ // don't want
+
+ // border and caption styles
+ if ( ( style & wxRESIZE_BORDER ) && !IsAlwaysMaximized())
+ msflags |= WS_THICKFRAME;
+ else if ( exflags && ((style & wxBORDER_DOUBLE) || (style & wxBORDER_RAISED)) )
+ *exflags |= WS_EX_DLGMODALFRAME;
+ else if ( !(style & wxBORDER_NONE) )
+ msflags |= WS_BORDER;
+#ifndef __POCKETPC__
+ else
+ msflags |= WS_POPUP;
+#endif
+
+ // normally we consider that all windows without a caption must be popups,
+ // but CE is an exception: there windows normally do not have the caption
+ // but shouldn't be made popups as popups can't have menus and don't look
+ // like normal windows anyhow
+
+ // TODO: Smartphone appears to like wxCAPTION, but we should check that
+ // we need it.
+#if defined(__SMARTPHONE__) || !defined(__WXWINCE__)
+ if ( style & wxCAPTION )
+ msflags |= WS_CAPTION;
+#ifndef __WXWINCE__
+ else
+ msflags |= WS_POPUP;
+#endif // !__WXWINCE__
+#endif
+
+ // next translate the individual flags
+
+ // WS_EX_CONTEXTHELP is incompatible with WS_MINIMIZEBOX and WS_MAXIMIZEBOX
+ // and is ignored if we specify both of them, but chances are that if we
+ // use wxWS_EX_CONTEXTHELP, we really do want to have the context help
+ // button while wxMINIMIZE/wxMAXIMIZE are included by default, so the help
+ // takes precedence
+ if ( !(GetExtraStyle() & wxWS_EX_CONTEXTHELP) )
+ {
+ if ( style & wxMINIMIZE_BOX )
+ msflags |= WS_MINIMIZEBOX;
+ if ( style & wxMAXIMIZE_BOX )
+ msflags |= WS_MAXIMIZEBOX;
+ }
+
+#ifndef __WXWINCE__
+ if ( style & wxSYSTEM_MENU )
+ msflags |= WS_SYSMENU;
+#endif
+
+ // NB: under CE these 2 styles are not supported currently, we should
+ // call Minimize()/Maximize() "manually" if we want to support them
+ if ( style & wxMINIMIZE )
+ msflags |= WS_MINIMIZE;
+
+ if ( style & wxMAXIMIZE )
+ msflags |= WS_MAXIMIZE;
+
+ // Keep this here because it saves recoding this function in wxTinyFrame
+ if ( style & (wxTINY_CAPTION_VERT | wxTINY_CAPTION_HORIZ) )
+ msflags |= WS_CAPTION;
+
+ if ( exflags )
+ {
+ // there is no taskbar under CE, so omit all this
+#if !defined(__WXWINCE__)
+ if ( !(GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) )
+ {
+ if ( style & wxFRAME_TOOL_WINDOW )
+ {
+ // create the palette-like window
+ *exflags |= WS_EX_TOOLWINDOW;
+
+ // tool windows shouldn't appear on the taskbar (as documented)
+ style |= wxFRAME_NO_TASKBAR;
+ }
+
+ // We have to solve 2 different problems here:
+ //
+ // 1. frames with wxFRAME_NO_TASKBAR flag shouldn't appear in the
+ // taskbar even if they don't have a parent
+ //
+ // 2. frames without this style should appear in the taskbar even
+ // if they're owned (Windows only puts non owned windows into
+ // the taskbar normally)
+ //
+ // The second one is solved here by using WS_EX_APPWINDOW flag, the
+ // first one is dealt with in our MSWGetParent() method
+ // implementation
+ if ( !(style & wxFRAME_NO_TASKBAR) && GetParent() )
+ {
+ // need to force the frame to appear in the taskbar
+ *exflags |= WS_EX_APPWINDOW;
+ }
+ //else: nothing to do [here]
+ }
+
+ if ( GetExtraStyle() & wxWS_EX_CONTEXTHELP )
+ *exflags |= WS_EX_CONTEXTHELP;
+#endif // !__WXWINCE__
+
+ if ( style & wxSTAY_ON_TOP )
+ *exflags |= WS_EX_TOPMOST;
+ }
+
+ return msflags;
+}
+
+WXHWND wxTopLevelWindowMSW::MSWGetParent() const
+{
+ // for the frames without wxFRAME_FLOAT_ON_PARENT style we should use NULL
+ // parent HWND or it would be always on top of its parent which is not what
+ // we usually want (in fact, we only want it for frames with the
+ // wxFRAME_FLOAT_ON_PARENT flag)
+ HWND hwndParent = NULL;
+ if ( HasFlag(wxFRAME_FLOAT_ON_PARENT) )
+ {
+ const wxWindow *parent = GetParent();
+
+ if ( !parent )
+ {
+ // this flag doesn't make sense then and will be ignored
+ wxFAIL_MSG( _T("wxFRAME_FLOAT_ON_PARENT but no parent?") );
+ }
+ else
+ {
+ hwndParent = GetHwndOf(parent);
+ }
+ }
+ //else: don't float on parent, must not be owned
+
+ // now deal with the 2nd taskbar-related problem (see comments above in
+ // MSWGetStyle())
+ if ( HasFlag(wxFRAME_NO_TASKBAR) && !hwndParent )
+ {
+ // use hidden parent
+ hwndParent = wxTLWHiddenParentModule::GetHWND();
+ }
+
+ return (WXHWND)hwndParent;
+}
+
+#if defined(__SMARTPHONE__) || defined(__POCKETPC__)
+bool wxTopLevelWindowMSW::HandleSettingChange(WXWPARAM wParam, WXLPARAM lParam)
+{
+ SHACTIVATEINFO *info = (SHACTIVATEINFO*) m_activateInfo;
+ if ( info )
+ {
+ SHHandleWMSettingChange(GetHwnd(), wParam, lParam, info);
+ }
+
+ return wxWindowMSW::HandleSettingChange(wParam, lParam);
+}
+#endif
+
+WXLRESULT wxTopLevelWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
+{
+ WXLRESULT rc = 0;
+ bool processed = false;
+
+#if defined(__SMARTPHONE__) || defined(__POCKETPC__)
+ switch ( message )
+ {
+ case WM_ACTIVATE:
+ {
+ SHACTIVATEINFO* info = (SHACTIVATEINFO*) m_activateInfo;
+ if (info)
+ {
+ DWORD flags = 0;
+ if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) flags = SHA_INPUTDIALOG;
+ SHHandleWMActivate(GetHwnd(), wParam, lParam, info, flags);
+ }
+
+ // This implicitly sends a wxEVT_ACTIVATE_APP event
+ if (wxTheApp)
+ wxTheApp->SetActive(wParam != 0, FindFocus());
+
+ break;
+ }
+ case WM_HIBERNATE:
+ {
+ if (wxTheApp)
+ {
+ wxActivateEvent event(wxEVT_HIBERNATE, true, wxID_ANY);
+ event.SetEventObject(wxTheApp);
+ processed = wxTheApp->ProcessEvent(event);
+ }
+ break;
+ }
+ }
+#endif
+
+ if ( !processed )
+ rc = wxTopLevelWindowBase::MSWWindowProc(message, wParam, lParam);
+
+ return rc;
+}
+
+bool wxTopLevelWindowMSW::CreateDialog(const void *dlgTemplate,
+ const wxString& title,
+ const wxPoint& pos,
+ const wxSize& size)
+{
+#ifdef __WXMICROWIN__
+ // 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;
+ }
+ }
+ }
+
+ m_hWnd = (WXHWND)::CreateDialogIndirect
+ (
+ wxGetInstance(),
+ (DLGTEMPLATE*)dlgTemplate,
+ parent ? GetHwndOf(parent) : NULL,
+ (DLGPROC)wxDlgProc
+ );
+
+ if ( !m_hWnd )
+ {
+ wxFAIL_MSG(wxT("Failed to create dialog. Incorrect DLGTEMPLATE?"));
+
+ wxLogSysError(wxT("Can't create dialog using memory template"));
+
+ return false;
+ }
+
+ WXDWORD exflags;
+ (void)MSWGetCreateWindowFlags(&exflags);
+
+ if ( exflags )
+ {
+ ::SetWindowLong(GetHwnd(), GWL_EXSTYLE, exflags);
+ ::SetWindowPos(GetHwnd(),
+ exflags & WS_EX_TOPMOST ? HWND_TOPMOST : 0,
+ 0, 0, 0, 0,
+ SWP_NOSIZE |
+ SWP_NOMOVE |
+ (exflags & WS_EX_TOPMOST ? 0 : SWP_NOZORDER) |
+ SWP_NOACTIVATE);
+ }
+
+#if !defined(__WXWINCE__)
+ // For some reason, the system menu is activated when we use the
+ // WS_EX_CONTEXTHELP style, so let's set a reasonable icon
+ if ( exflags & WS_EX_CONTEXTHELP )
+ {
+ wxFrame *winTop = wxDynamicCast(wxTheApp->GetTopWindow(), wxFrame);
+ if ( winTop )
+ {
+ wxIcon icon = winTop->GetIcon();
+ if ( icon.Ok() )
+ {
+ ::SendMessage(GetHwnd(), WM_SETICON,
+ (WPARAM)TRUE,
+ (LPARAM)GetHiconOf(icon));
+ }
+ }
+ }
+#endif
+
+ // move the dialog to its initial position without forcing repainting
+ int x, y, w, h;
+ (void)MSWGetCreateWindowCoords(pos, size, x, y, w, h);
+
+ 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 !defined(__WXWINCE__) || defined(__WINCE_STANDARDSDK__)
+ if ( !::MoveWindow(GetHwnd(), x, y, w, h, FALSE) )
+ {
+ wxLogLastError(wxT("MoveWindow"));
+ }
+#endif
+
+ if ( !title.empty() )
+ {
+ ::SetWindowText(GetHwnd(), title.wx_str());
+ }
+
+ SubclassWin(m_hWnd);
+
+#ifdef __SMARTPHONE__
+ // Work around title non-display glitch
+ Show(false);
+#endif
+
+ return true;
+#endif // __WXMICROWIN__/!__WXMICROWIN__
+}
+
+bool wxTopLevelWindowMSW::CreateFrame(const wxString& title,
+ const wxPoint& pos,
+ const wxSize& size)
+{
+ WXDWORD exflags;
+ WXDWORD flags = MSWGetCreateWindowFlags(&exflags);
+
+ const wxSize sz = IsAlwaysMaximized() ? wxDefaultSize : size;
+
+#ifndef __WXWINCE__
+ if ( wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft )
+ exflags |= WS_EX_LAYOUTRTL;
+#endif
+
+ return MSWCreate(wxCanvasClassName, title.wx_str(), pos, sz, flags, exflags);