X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/90df6033544b93f48573c6a5371fefc87f36e564..a790886d7f38216c106640f22a9f27ed58a09ff8:/src/msw/window.cpp?ds=sidebyside diff --git a/src/msw/window.cpp b/src/msw/window.cpp index cbacc08988..8037b29d9d 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -1288,30 +1288,42 @@ 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(); + return border; } + WXDWORD wxWindowMSW::MSWGetStyle(long flags, WXDWORD *exstyle) const { // translate common wxWidgets styles to Windows ones @@ -1341,7 +1353,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 +2234,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 +2255,32 @@ 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 ) + { + while ( win && !win->IsTopLevel() ) + { + if ( lDlgCode & DLGC_WANTMESSAGE ) + { + // as it wants to process Enter itself, + // don't call IsDialogMessage() which + // would consume it + return false; + } + + win = win->GetParent(); + } + } + else // bCtrlDown + { + win = wxGetTopLevelParent(win); + } + + wxTopLevelWindow * const + tlw = wxDynamicCast(win, wxTopLevelWindow); if ( tlw ) { btn = wxDynamicCast(tlw->GetDefaultItem(), @@ -3244,7 +3275,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 +3316,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); @@ -4555,29 +4588,20 @@ void wxWindowMSW::OnEraseBackground(wxEraseEvent& event) return; } - switch ( GetBackgroundStyle() ) + if ( GetBackgroundStyle() == wxBG_STYLE_CUSTOM ) { - default: - wxFAIL_MSG( _T("Unknown background style") ); - // fall through - - case wxBG_STYLE_SYSTEM: - case wxBG_STYLE_COLOUR: - // do default background painting - if ( !DoEraseBackground(GetHdcOf(*event.GetDC())) ) - { - // let the system paint the background - event.Skip(); - } + // don't skip the event here, custom background means that the app + // is drawing it itself in its OnPaint(), so don't draw it at all + // now to avoid flicker + return; + } - case wxBG_STYLE_CUSTOM: - // don't skip the event here, custom background means that the app - // is drawing it itself in its OnPaint(), so don't draw it at all - // now to avoid flicker - return; - case wxBG_STYLE_TRANSPARENT: - event.Skip(); + // do default background painting + if ( !DoEraseBackground(GetHdcOf(*event.GetDC())) ) + { + // let the system paint the background + event.Skip(); } } @@ -5948,18 +5972,10 @@ WXWORD wxCharCodeWXToMSW(int wxk, bool *isVirtual) break; default: - // check to see if its one of the OEM key codes. - BYTE vks = LOBYTE(VkKeyScan(wxk)); - if ( vks != -1 ) - { - vk = vks; - } - else - { - if ( isVirtual ) - *isVirtual = false; - vk = (WXWORD)wxk; - } + if ( isVirtual ) + *isVirtual = false; + vk = (WXWORD)wxk; + break; } return vk;