X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fda7962d029672a5f4c718a3c6b2559856f4cd95..2d1715aa46b210e69ddf2dd1cd1c7d2f23c4298a:/src/msw/toplevel.cpp?ds=sidebyside diff --git a/src/msw/toplevel.cpp b/src/msw/toplevel.cpp index d0ae7e02c3..47bc5ff54a 100644 --- a/src/msw/toplevel.cpp +++ b/src/msw/toplevel.cpp @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "toplevel.h" #endif @@ -41,6 +41,24 @@ #include "wx/module.h" #include "wx/msw/private.h" +#include "wx/msw/missing.h" + +#if defined(__WXWINCE__) + #include + #include + #if _WIN32_WCE < 400 + #include + #endif +#include "wx/msw/wince/missing.h" +#endif + +#include "wx/msw/winundef.h" + +// This can't be undefed in winundef.h or +// there are further errors +#if defined(__WXWINCE__) && defined(CreateDialog) +#undef CreateDialog +#endif #include "wx/display.h" @@ -151,20 +169,35 @@ WXDWORD wxTopLevelWindowMSW::MSWGetStyle(long style, WXDWORD *exflags) const if ( style & wxFRAME_TOOL_WINDOW ) msflags |= WS_POPUP; else - msflags |= WS_OVERLAPPED; + { +#ifdef __WXWINCE__ + if (msflags & WS_BORDER) +#endif + msflags |= WS_OVERLAPPED; + } // border and caption styles if ( style & wxRESIZE_BORDER ) + { +#ifndef __WXWINCE__ msflags |= WS_THICKFRAME; +#endif + } + else if ( exflags && ((style & wxBORDER_DOUBLE) || (style & wxBORDER_RAISED)) ) + *exflags |= WS_EX_DLGMODALFRAME; else if ( !(style & wxBORDER_NONE) ) msflags |= WS_BORDER; +#ifndef __WXWINCE__ else msflags |= WS_POPUP; +#endif if ( style & wxCAPTION ) msflags |= WS_CAPTION; +#ifndef __WXWINCE__ else msflags |= WS_POPUP; +#endif // next translate the individual flags if ( style & wxMINIMIZE_BOX ) @@ -173,10 +206,12 @@ WXDWORD wxTopLevelWindowMSW::MSWGetStyle(long style, WXDWORD *exflags) const msflags |= WS_MAXIMIZEBOX; if ( style & wxSYSTEM_MENU ) msflags |= WS_SYSMENU; +#ifndef __WXWINCE__ if ( style & wxMINIMIZE ) msflags |= WS_MINIMIZE; if ( style & wxMAXIMIZE ) msflags |= WS_MAXIMIZE; +#endif // Keep this here because it saves recoding this function in wxTinyFrame #if wxUSE_ITSY_BITSY && !defined(__WIN32__) @@ -191,13 +226,16 @@ WXDWORD wxTopLevelWindowMSW::MSWGetStyle(long style, WXDWORD *exflags) const if ( exflags ) { -#if !defined(__WIN16__) +#if !defined(__WIN16__) 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: @@ -212,11 +250,13 @@ WXDWORD wxTopLevelWindowMSW::MSWGetStyle(long style, WXDWORD *exflags) const // The second one is solved here by using WS_EX_APPWINDOW flag, the // first one is dealt with in our MSWGetParent() method // implementation +#ifndef __WXWINCE__ if ( !(style & wxFRAME_NO_TASKBAR) && GetParent() ) { // need to force the frame to appear in the taskbar *exflags |= WS_EX_APPWINDOW; } +#endif //else: nothing to do [here] } #endif // !Win16 @@ -323,10 +363,12 @@ bool wxTopLevelWindowMSW::CreateDialog(const void *dlgTemplate, if ( exflags ) { ::SetWindowLong(GetHwnd(), GWL_EXSTYLE, exflags); - ::SetWindowPos(GetHwnd(), NULL, 0, 0, 0, 0, + ::SetWindowPos(GetHwnd(), + exflags & WS_EX_TOPMOST ? HWND_TOPMOST : 0, + 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | - SWP_NOZORDER | + (exflags & WS_EX_TOPMOST ? 0 : SWP_NOZORDER) | SWP_NOACTIVATE); } @@ -414,7 +456,7 @@ bool wxTopLevelWindowMSW::Create(wxWindow *parent, long style, const wxString& name) { - bool ret = false; + bool ret wxDUMMY_INITIALIZE(false); // init our fields Init(); @@ -473,6 +515,23 @@ bool wxTopLevelWindowMSW::Create(wxWindow *parent, EnableCloseButton(false); } + // for some reason we need to manually send ourselves this message as + // otherwise the mnemonics are always shown -- even if they're configured + // to be hidden until "Alt" is pressed in the control panel + // + // this could indicate a bug somewhere else but for now this is the only + // fix we have + if ( ret ) + { + SendMessage + ( + GetHwnd(), + WM_UPDATEUISTATE, + MAKEWPARAM(UIS_INITIALIZE, UISF_HIDEFOCUS | UISF_HIDEACCEL), + 0 + ); + } + return ret; } @@ -580,7 +639,11 @@ void wxTopLevelWindowMSW::Maximize(bool maximize) bool wxTopLevelWindowMSW::IsMaximized() const { +#ifdef __WXWINCE__ + return FALSE; +#else return ::IsZoomed(GetHwnd()) != 0; +#endif } void wxTopLevelWindowMSW::Iconize(bool iconize) @@ -590,10 +653,14 @@ void wxTopLevelWindowMSW::Iconize(bool iconize) bool wxTopLevelWindowMSW::IsIconized() const { +#ifdef __WXWINCE__ + return FALSE; +#else // also update the current state ((wxTopLevelWindowMSW *)this)->m_iconized = ::IsIconic(GetHwnd()) != 0; return m_iconized; +#endif } void wxTopLevelWindowMSW::Restore() @@ -633,7 +700,12 @@ bool wxTopLevelWindowMSW::ShowFullScreen(bool show, long style) LONG offFlags = 0; if (style & wxFULLSCREEN_NOBORDER) - offFlags |= WS_BORDER | WS_THICKFRAME; + { + offFlags |= WS_BORDER; +#ifndef __WXWINCE__ + offFlags |= WS_THICKFRAME; +#endif + } if (style & wxFULLSCREEN_NOCAPTION) offFlags |= WS_CAPTION | WS_SYSMENU; @@ -655,6 +727,12 @@ bool wxTopLevelWindowMSW::ShowFullScreen(bool show, long style) { // resize to the size of the desktop wxCopyRECTToRect(wxGetWindowRect(::GetDesktopWindow()), rect); +#ifdef __WXWINCE__ + // FIXME: size of the bottom menu (toolbar) + // should be taken in account + rect.height += rect.y; + rect.y = 0; +#endif } #endif // wxUSE_DISPLAY @@ -680,12 +758,19 @@ bool wxTopLevelWindowMSW::ShowFullScreen(bool show, long style) rect.x, rect.y, rect.width, rect.height, flags); +#if defined(__WXWINCE__) && _WIN32_WCE < 400 + ::SHFullScreen(GetHwnd(), SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON); +#endif + // finally send an event allowing the window to relayout itself &c wxSizeEvent event(rect.GetSize(), GetId()); GetEventHandler()->ProcessEvent(event); } else // stop showing full screen { +#if defined(__WXWINCE__) && _WIN32_WCE < 400 + ::SHFullScreen(GetHwnd(), SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON); +#endif Maximize(m_fsIsMaximized); SetWindowLong(GetHwnd(),GWL_STYLE, m_fsOldWindowStyle); SetWindowPos(GetHwnd(),HWND_TOP,m_fsOldSize.x, m_fsOldSize.y, @@ -727,9 +812,9 @@ void wxTopLevelWindowMSW::SetIcons(const wxIconBundle& icons) bool wxTopLevelWindowMSW::EnableCloseButton(bool enable) { -#ifndef __WXMICROWIN__ +#if !defined(__WXMICROWIN__) // get system (a.k.a. window) menu - HMENU hmenu = ::GetSystemMenu(GetHwnd(), FALSE /* get it */); + HMENU hmenu = GetSystemMenu(GetHwnd(), FALSE /* get it */); if ( !hmenu ) { // no system menu at all -- ok if we want to remove the close button @@ -760,6 +845,9 @@ bool wxTopLevelWindowMSW::EnableCloseButton(bool enable) bool wxTopLevelWindowMSW::SetShape(const wxRegion& region) { +#ifdef __WXWINCE__ + return FALSE; +#else wxCHECK_MSG( HasFlag(wxFRAME_SHAPED), FALSE, _T("Shaped windows must be created with the wxFRAME_SHAPED style.")); @@ -800,6 +888,7 @@ bool wxTopLevelWindowMSW::SetShape(const wxRegion& region) return FALSE; } return TRUE; +#endif } // ---------------------------------------------------------------------------- @@ -812,17 +901,22 @@ void wxTopLevelWindowMSW::OnActivate(wxActivateEvent& event) { if ( event.GetActive() ) { - // restore focus to the child which was last focused + // restore focus to the child which was last focused unless we already + // have it wxLogTrace(_T("focus"), _T("wxTLW %08x activated."), (int) m_hWnd); - wxWindow *parent = m_winLastFocused ? m_winLastFocused->GetParent() - : NULL; - if ( !parent ) + wxWindow *winFocus = FindFocus(); + if ( !winFocus || wxGetTopLevelParent(winFocus) != this ) { - parent = this; - } + wxWindow *parent = m_winLastFocused ? m_winLastFocused->GetParent() + : NULL; + if ( !parent ) + { + parent = this; + } - wxSetFocusToChild(parent, &m_winLastFocused); + wxSetFocusToChild(parent, &m_winLastFocused); + } } else // deactivating { @@ -833,23 +927,12 @@ void wxTopLevelWindowMSW::OnActivate(wxActivateEvent& event) { // let it know that it doesn't have focus any more m_winLastFocused->HandleKillFocus((WXHWND)NULL); - } - // so we NULL it out if it's a child from some other frame - wxWindow *win = m_winLastFocused; - while ( win ) - { - if ( win->IsTopLevel() ) + // and don't remember it if it's a child from some other frame + if ( wxGetTopLevelParent(m_winLastFocused) != this ) { - if ( win != this ) - { - m_winLastFocused = NULL; - } - - break; + m_winLastFocused = NULL; } - - win = win->GetParent(); } wxLogTrace(_T("focus"), @@ -864,7 +947,10 @@ void wxTopLevelWindowMSW::OnActivate(wxActivateEvent& event) // the DialogProc for all wxWindows dialogs LONG APIENTRY _EXPORT -wxDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +wxDlgProc(HWND WXUNUSED(hDlg), + UINT message, + WPARAM WXUNUSED(wParam), + LPARAM WXUNUSED(lParam)) { switch ( message ) {