X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d935b42145c01cb82a0b74a5f9b1c34f40e0d711..c944775f72435d2c0493113e05445898ab8baf1b:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 3fd01af496..d8be1a890b 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -1288,29 +1288,39 @@ void wxWindowMSW::MSWUpdateStyle(long flagsOld, long exflagsOld) wxBorder wxWindowMSW::GetDefaultBorderForControl() const { - // we want to automatically give controls a sunken style (confusingly, - // it may not really mean sunken at all as we map it to WS_EX_CLIENTEDGE - // which is not sunken at all under Windows XP -- rather, just the default) + return wxBORDER_THEME; +} + +wxBorder wxWindowMSW::GetDefaultBorder() const +{ + return wxWindowBase::GetDefaultBorder(); +} +// Translate wxBORDER_THEME (and other border styles if necessary to the value +// that makes most sense for this Windows environment +wxBorder wxWindowMSW::TranslateBorder(wxBorder border) const +{ #if defined(__POCKETPC__) || defined(__SMARTPHONE__) - return wxBORDER_SIMPLE; + if (border == wxBORDER_THEME || border == wxBORDER_SUNKEN || border == wxBORDER_SIMPLE) + return wxBORDER_SIMPLE; + else + return wxBORDER_NONE; #else #if wxUSE_UXTHEME - if (CanApplyThemeBorder()) + if (border == wxBORDER_THEME) { - wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive(); - if (theme) - return wxBORDER_THEME; + if (CanApplyThemeBorder()) + { + wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive(); + if (theme) + return wxBORDER_THEME; + } } #endif - return wxBORDER_SUNKEN; + return border; #endif } -wxBorder wxWindowMSW::GetDefaultBorder() const -{ - return GetDefaultBorderForControl(); -} WXDWORD wxWindowMSW::MSWGetStyle(long flags, WXDWORD *exstyle) const { @@ -1341,7 +1351,10 @@ WXDWORD wxWindowMSW::MSWGetStyle(long flags, WXDWORD *exstyle) const if ( flags & wxHSCROLL ) style |= WS_HSCROLL; - const wxBorder border = GetBorder(flags); + const wxBorder border = TranslateBorder(GetBorder(flags)); + + // After translation, border is now optimized for the specific version of Windows + // and theme engine presence. // WS_BORDER is only required for wxBORDER_SIMPLE if ( border == wxBORDER_SIMPLE ) @@ -2219,13 +2232,6 @@ bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg) case VK_RETURN: { - if ( (lDlgCode & DLGC_WANTMESSAGE) && !bCtrlDown ) - { - // control wants to process Enter itself, don't - // call IsDialogMessage() which would consume it - return false; - } - #if wxUSE_BUTTON // currently active button should get enter press even // if there is a default button elsewhere so check if @@ -2247,9 +2253,49 @@ bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg) } else // not a button itself, do we have default button? { - wxTopLevelWindow * - tlw = wxDynamicCast(wxGetTopLevelParent(this), - wxTopLevelWindow); + // check if this window or any of its ancestors + // wants the message for itself (we always reserve + // Ctrl-Enter for dialog navigation though) + wxWindow *win = this; + if ( !bCtrlDown ) + { + // this will contain the dialog code of this + // window and all of its parent windows in turn + LONG lDlgCode2 = lDlgCode; + + while ( win ) + { + if ( lDlgCode2 & DLGC_WANTMESSAGE ) + { + // as it wants to process Enter itself, + // don't call IsDialogMessage() which + // would consume it + return false; + } + + // don't propagate keyboard messages beyond + // the first top level window parent + if ( win->IsTopLevel() ) + break; + + win = win->GetParent(); + + lDlgCode2 = ::SendMessage + ( + GetHwndOf(win), + WM_GETDLGCODE, + 0, + 0 + ); + } + } + else // bCtrlDown + { + win = wxGetTopLevelParent(win); + } + + wxTopLevelWindow * const + tlw = wxDynamicCast(win, wxTopLevelWindow); if ( tlw ) { btn = wxDynamicCast(tlw->GetDefaultItem(), @@ -3244,7 +3290,8 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l case WM_NCCALCSIZE: { wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive(); - if (theme && GetBorder() == wxBORDER_THEME) + const wxBorder border = TranslateBorder(GetBorder()); + if (theme && border == wxBORDER_THEME) { // first ask the widget to calculate the border size rc.result = MSWDefWindowProc(message, wParam, lParam); @@ -3284,7 +3331,8 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l case WM_NCPAINT: { wxUxThemeEngine* theme = wxUxThemeEngine::GetIfActive(); - if (theme && GetBorder() == wxBORDER_THEME) + const wxBorder border = TranslateBorder(GetBorder()); + if (theme && border == wxBORDER_THEME) { // first ask the widget to paint its non-client area, such as scrollbars, etc. rc.result = MSWDefWindowProc(message, wParam, lParam); @@ -4506,6 +4554,10 @@ bool wxWindowMSW::HandlePaint() eventNc.SetEventObject(this); GetEventHandler()->ProcessEvent(eventNc); + // don't keep an HRGN we don't need any longer (GetUpdateRegion() can only + // be called from inside the event handlers called above) + m_updateRegion.Clear(); + return processed; } @@ -4968,7 +5020,7 @@ void wxWindowMSW::InitMouseEvent(wxMouseEvent& event, event.m_aux1Down = (flags & MK_XBUTTON1) != 0; event.m_aux2Down = (flags & MK_XBUTTON2) != 0; #endif // wxHAS_XBUTTON - event.m_altDown = ::GetKeyState(VK_MENU) < 0; + event.m_altDown = ::wxIsAltDown(); #ifndef __WXWINCE__ event.SetTimestamp(::GetMessageTime()); @@ -6009,9 +6061,9 @@ wxMouseState wxGetMouseState() ms.SetAux2Down(wxIsKeyDown(VK_XBUTTON2)); #endif // wxHAS_XBUTTON - ms.SetControlDown(wxIsKeyDown(VK_CONTROL)); - ms.SetShiftDown(wxIsKeyDown(VK_SHIFT)); - ms.SetAltDown(wxIsKeyDown(VK_MENU)); + ms.SetControlDown(wxIsCtrlDown ()); + ms.SetShiftDown (wxIsShiftDown()); + ms.SetAltDown (wxIsAltDown ()); // ms.SetMetaDown(); return ms;