X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2a47cb1ba2461eb90e0cd4c23dab9bfab065c915..04633c190f5a6eafe607a5712647aaa131522b1f:/src/msw/toplevel.cpp?ds=inline diff --git a/src/msw/toplevel.cpp b/src/msw/toplevel.cpp index e3dccf8050..6d87965ef7 100644 --- a/src/msw/toplevel.cpp +++ b/src/msw/toplevel.cpp @@ -31,6 +31,7 @@ #ifndef WX_PRECOMP #include "wx/app.h" #include "wx/toplevel.h" + #include "wx/dialog.h" #include "wx/string.h" #include "wx/log.h" #include "wx/intl.h" @@ -44,7 +45,8 @@ #if defined(__WXWINCE__) #include #include - #if _WIN32_WCE < 400 + // Standard SDK doesn't have aygshell.dll: see include/wx/msw/wince/libraries.h + #if _WIN32_WCE < 400 || !defined(WCE_PLATFORM_STANDARDSDK) #include #endif #include "wx/msw/wince/missing.h" @@ -83,11 +85,12 @@ wxDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); // globals // ---------------------------------------------------------------------------- -// list of all frames and modeless dialogs -wxWindowList wxModelessWindows; - // the name of the default wxWindows class +#ifdef __WXWINCE__ +extern wxChar *wxCanvasClassName; +#else extern const wxChar *wxCanvasClassName; +#endif // ---------------------------------------------------------------------------- // wxTLWHiddenParentModule: used to manage the hidden parent window (we need a @@ -151,19 +154,22 @@ WXDWORD wxTopLevelWindowMSW::MSWGetStyle(long style, WXDWORD *exflags) const (style & ~wxBORDER_MASK) | wxBORDER_NONE, exflags ) & ~WS_CHILD & ~WS_VISIBLE; +#if defined(__WXWINCE__) && _WIN32_WCE < 400 + msflags |= WS_VISIBLE; +#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 also test it // below in some other cases if ( style & wxFRAME_TOOL_WINDOW ) - msflags |= WS_POPUP; - else { - if (msflags & WS_BORDER) - msflags |= WS_OVERLAPPED; + msflags |= WS_POPUP; } + //else: WS_OVERLAPPED is 0 anyhow, so it is on by default +#ifndef __SMARTPHONE__ // border and caption styles if ( style & wxRESIZE_BORDER ) msflags |= WS_THICKFRAME; @@ -173,11 +179,18 @@ WXDWORD wxTopLevelWindowMSW::MSWGetStyle(long style, WXDWORD *exflags) const msflags |= WS_BORDER; else msflags |= WS_POPUP; +#endif + // normally we consider that all windows without 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 if ( style & wxCAPTION ) msflags |= WS_CAPTION; +#ifndef __WXWINCE__ else msflags |= WS_POPUP; +#endif // !__WXWINCE__ // next translate the individual flags if ( style & wxMINIMIZE_BOX ) @@ -187,15 +200,12 @@ WXDWORD wxTopLevelWindowMSW::MSWGetStyle(long style, WXDWORD *exflags) const if ( style & wxSYSTEM_MENU ) msflags |= WS_SYSMENU; - // under CE these 2 styles are not defined currently -#ifdef WS_MINIMIZE + // 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; -#endif // WS_MINIMIZE -#ifdef WS_MAXIMIZE if ( style & wxMAXIMIZE ) msflags |= WS_MAXIMIZE; -#endif // WS_MAXIMIZE // Keep this here because it saves recoding this function in wxTinyFrame if ( style & (wxTINY_CAPTION_VERT | wxTINY_CAPTION_HORIZ) ) @@ -203,6 +213,8 @@ WXDWORD wxTopLevelWindowMSW::MSWGetStyle(long style, WXDWORD *exflags) const if ( exflags ) { + // there is no taskbar under CE, so omit all this +#ifndef __WXWINCE__ if ( !(GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) ) { if ( style & wxFRAME_TOOL_WINDOW ) @@ -214,8 +226,6 @@ WXDWORD wxTopLevelWindowMSW::MSWGetStyle(long style, WXDWORD *exflags) const style |= wxFRAME_NO_TASKBAR; } - // again, support for this is missing under CE -#ifdef WS_EX_APPWINDOW // We have to solve 2 different problems here: // // 1. frames with wxFRAME_NO_TASKBAR flag shouldn't appear in the @@ -234,8 +244,8 @@ WXDWORD wxTopLevelWindowMSW::MSWGetStyle(long style, WXDWORD *exflags) const *exflags |= WS_EX_APPWINDOW; } //else: nothing to do [here] -#endif // WS_EX_APPWINDOW } +#endif // !__WXWINCE__ if ( style & wxSTAY_ON_TOP ) *exflags |= WS_EX_TOPMOST; @@ -378,10 +388,12 @@ bool wxTopLevelWindowMSW::CreateDialog(const void *dlgTemplate, y = (sizeDpy.y - h) / 2; } +#ifndef __WXWINCE__ if ( !::MoveWindow(GetHwnd(), x, y, w, h, FALSE) ) { wxLogLastError(wxT("MoveWindow")); } +#endif if ( !title.empty() ) { @@ -401,7 +413,16 @@ bool wxTopLevelWindowMSW::CreateFrame(const wxString& title, WXDWORD exflags; WXDWORD flags = MSWGetCreateWindowFlags(&exflags); - return MSWCreate(wxCanvasClassName, title, pos, size, flags, exflags); +#if (defined(_WIN32_WCE) && _WIN32_WCE < 400) || \ + defined(WIN32_PLATFORM_PSPC) || \ + defined(__SMARTPHONE__) + // Always expand to fit the screen in PocketPC or SmartPhone + wxSize sz(wxDefaultSize); +#else // other (including normal desktop) Windows + wxSize sz(size); +#endif + + return MSWCreate(wxCanvasClassName, title, pos, sz, flags, exflags); } bool wxTopLevelWindowMSW::Create(wxWindow *parent, @@ -494,14 +515,17 @@ bool wxTopLevelWindowMSW::Create(wxWindow *parent, ); } + // Native look is full screen window on Smartphones +#ifdef __SMARTPHONE__ + if ( style & wxMAXIMIZE ) + Maximize(); +#endif + return ret; } wxTopLevelWindowMSW::~wxTopLevelWindowMSW() { - if ( wxModelessWindows.Find(this) ) - wxModelessWindows.DeleteObject(this); - // after destroying an owned window, Windows activates the next top level // window in Z order but it may be different from our owner (to reproduce // this simply Alt-TAB to another application and back before closing the @@ -794,12 +818,13 @@ bool wxTopLevelWindowMSW::EnableCloseButton(bool enable) return FALSE; } - +#ifndef __WXWINCE__ // update appearance immediately if ( !::DrawMenuBar(GetHwnd()) ) { wxLogLastError(_T("DrawMenuBar")); } +#endif #endif // !__WXMICROWIN__ return TRUE; @@ -909,23 +934,41 @@ void wxTopLevelWindowMSW::OnActivate(wxActivateEvent& event) // the DialogProc for all wxWindows dialogs LONG APIENTRY _EXPORT -wxDlgProc(HWND WXUNUSED(hDlg), +wxDlgProc(HWND hDlg, UINT message, WPARAM WXUNUSED(wParam), LPARAM WXUNUSED(lParam)) { - switch ( message ) + if ( message == WM_INITDIALOG ) { - case WM_INITDIALOG: - // for this message, returning TRUE tells system to set focus to - // the first control in the dialog box, but as we set the focus - // ourselves, we return FALSE from here as well, so fall through - - default: - // for all the other ones, FALSE means that we didn't process the - // message - return FALSE; + // under CE, add a "Ok" button in the dialog title bar and make it full + // screen + // + // VZ: we should probably allow for overriding this, e.g. by including + // MAXIMIZED flag in the dialog style by default and doing this + // only if it is present... + + // Standard SDK doesn't have aygshell.dll: see + // include/wx/msw/wince/libraries.h +#if defined(__WXWINCE__) && !defined(WCE_PLATFORM_STANDARDSDK) + SHINITDLGINFO shidi; + shidi.dwMask = SHIDIM_FLAGS; + shidi.dwFlags = SHIDIF_DONEBUTTON | + SHIDIF_SIZEDLGFULLSCREEN; + shidi.hDlg = hDlg; + SHInitDialog( &shidi ); +#else // no SHInitDialog() + wxUnusedVar(hDlg); +#endif } + + // for almost all messages, returning FALSE means that we didn't process + // the message + // + // for WM_INITDIALOG, returning TRUE tells system to set focus to + // the first control in the dialog box, but as we set the focus + // ourselves, we return FALSE for it as well + return FALSE; } // ============================================================================