+ m_maximizeOnShow = false;
+
+ // Data to save/restore when calling ShowFullScreen
+ m_fsStyle = 0;
+ m_fsOldWindowStyle = 0;
+ m_fsIsMaximized = false;
+ m_fsIsShowing = false;
+
+ m_winLastFocused = 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
+
+ m_menuSystem = NULL;
+}
+
+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__
+ // 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 // !__WXWINCE__
+
+ // 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 )
+ 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( wxT("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;
+
+ switch ( message )
+ {
+#if defined(__SMARTPHONE__) || defined(__POCKETPC__)
+ 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 // __SMARTPHONE__ || __POCKETPC__
+
+ case WM_SYSCOMMAND:
+ {
+ // From MSDN:
+ //
+ // ... the four low-order bits of the wParam parameter are
+ // used internally by the system. To obtain the correct
+ // result when testing the value of wParam, an application
+ // must combine the value 0xFFF0 with the wParam value by
+ // using the bitwise AND operator.
+ unsigned id = wParam & 0xfff0;
+
+ // Preserve the focus when minimizing/restoring the window: we
+ // need to do it manually as DefWindowProc() doesn't appear to
+ // do this for us for some reason (perhaps because we don't use
+ // WM_NEXTDLGCTL for setting focus?). Moreover, our code in
+ // OnActivate() doesn't work in this case as we receive the
+ // deactivation event too late when the window is being
+ // minimized and the focus is already NULL by then. Similarly,
+ // we receive the activation event too early and restoring
+ // focus in it fails because the window is still minimized. So
+ // we need to do it here.
+ if ( id == SC_MINIMIZE )
+ {
+ // For minimization, it's simple enough: just save the
+ // focus as usual. The important thing is that we're not
+ // minimized yet, so this works correctly.
+ DoSaveLastFocus();
+ }
+ else if ( id == SC_RESTORE )
+ {
+ // For restoring, it's trickier as DefWindowProc() sets
+ // focus to the window itself. So run it first and restore
+ // our saved focus only afterwards.
+ processed = true;
+ rc = wxTopLevelWindowBase::MSWWindowProc(message,
+ wParam, lParam);
+
+ DoRestoreLastFocus();
+ }
+
+#ifndef __WXUNIVERSAL__
+ // We need to generate events for the custom items added to the
+ // system menu if it had been created (and presumably modified).
+ // As SC_SIZE is the first of the system-defined commands, we
+ // only do this for the custom commands before it and leave
+ // SC_SIZE and everything after it to DefWindowProc().
+ if ( m_menuSystem && id < SC_SIZE )
+ {
+ if ( m_menuSystem->MSWCommand(0 /* unused anyhow */, id) )
+ processed = true;
+ }
+#endif // #ifndef __WXUNIVERSAL__
+ }
+ break;
+
+#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
+#if wxUSE_MENUS
+ case WM_INITMENUPOPUP:
+ processed = HandleMenuPopup(wxEVT_MENU_OPEN, (WXHMENU)wParam);
+ break;
+
+ case WM_MENUSELECT:
+ {
+ WXWORD item, flags;
+ WXHMENU hmenu;
+ UnpackMenuSelect(wParam, lParam, &item, &flags, &hmenu);
+
+ processed = HandleMenuSelect(item, flags, hmenu);
+ }
+ break;
+
+ case WM_EXITMENULOOP:
+ // Under Windows 98 and 2000 and later we're going to get
+ // WM_UNINITMENUPOPUP which will be used to generate this event
+ // with more information (notably the menu that was closed) so we
+ // only need this one under old Windows systems where the newer
+ // event is never sent.
+ if ( wxGetWinVersion() < wxWinVersion_98 )
+ processed = HandleExitMenuLoop(wParam);
+ break;
+
+ case WM_UNINITMENUPOPUP:
+ processed = HandleMenuPopup(wxEVT_MENU_CLOSE, (WXHMENU)wParam);
+ break;
+#endif // wxUSE_MENUS
+#endif // !__WXMICROWIN__
+ }
+
+ 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__
+ // static cast is valid as we're only ever called for dialogs
+ wxWindow * const
+ parent = static_cast<wxDialog *>(this)->GetParentForModalDialog();
+
+ 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;
+ }
+
+#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 ( HasExtraStyle(wxWS_EX_CONTEXTHELP) )
+ {
+ wxFrame *winTop = wxDynamicCast(wxTheApp->GetTopWindow(), wxFrame);
+ if ( winTop )
+ {
+ wxIcon icon = winTop->GetIcon();
+ if ( icon.IsOk() )
+ {
+ ::SendMessage(GetHwnd(), WM_SETICON,
+ (WPARAM)TRUE,
+ (LPARAM)GetHiconOf(icon));
+ }
+ }
+ }
+#endif // !__WXWINCE__
+
+ if ( !title.empty() )
+ {
+ ::SetWindowText(GetHwnd(), title.t_str());
+ }
+
+ SubclassWin(m_hWnd);
+
+#if !defined(__WXWINCE__) || defined(__WINCE_STANDARDSDK__)
+ // 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 )
+ {
+ // Let the system position the window, just set its size.
+ ::SetWindowPos(GetHwnd(), 0,
+ 0, 0, w, h,
+ SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
+ }
+ else // Move the window to the desired location and set its size too.
+ {
+ if ( !::MoveWindow(GetHwnd(), x, y, w, h, FALSE) )
+ {
+ wxLogLastError(wxT("MoveWindow"));
+ }
+ }
+#endif // !__WXWINCE__
+
+#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(MSWGetRegisteredClassName(),
+ title.t_str(), pos, sz, flags, exflags);