X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2f7baaeccf143a4606c463bd50b1bd995fd3d18a..43c42c18d36c703a88b1b7b697bac27fe5608eca:/src/msw/window.cpp?ds=sidebyside diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 6bb0616f0b..c614dca82d 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -81,6 +81,7 @@ #include "wx/msw/private.h" #include "wx/msw/private/keyboard.h" #include "wx/msw/dcclient.h" +#include "wx/private/textmeasure.h" #if wxUSE_TOOLTIPS #include "wx/tooltip.h" @@ -1429,7 +1430,7 @@ WXDWORD wxWindowMSW::MSWGetStyle(long flags, WXDWORD *exstyle) const // it doesn't seem useful to use WS_CLIPSIBLINGS here as we officially // don't support overlapping windows and it only makes sense for them and, // presumably, gives the system some extra work (to manage more clipping - // regions), so avoid it alltogether + // regions), so avoid it altogether if ( flags & wxVSCROLL ) @@ -2164,31 +2165,18 @@ void wxWindowMSW::DoGetTextExtent(const wxString& string, int *externalLeading, const wxFont *fontToUse) const { - wxASSERT_MSG( !fontToUse || fontToUse->IsOk(), - wxT("invalid font in GetTextExtent()") ); - - HFONT hfontToUse; - if ( fontToUse ) - hfontToUse = GetHfontOf(*fontToUse); + // ensure we work with a valid font + wxFont font; + if ( !fontToUse || !fontToUse->IsOk() ) + font = GetFont(); else - hfontToUse = GetHfontOf(GetFont()); + font = *fontToUse; - WindowHDC hdc(GetHwnd()); - SelectInHDC selectFont(hdc, hfontToUse); + wxCHECK_RET( font.IsOk(), wxT("invalid font in GetTextExtent()") ); - SIZE sizeRect; - TEXTMETRIC tm; - ::GetTextExtentPoint32(hdc, string.t_str(), string.length(), &sizeRect); - GetTextMetrics(hdc, &tm); - - if ( x ) - *x = sizeRect.cx; - if ( y ) - *y = sizeRect.cy; - if ( descent ) - *descent = tm.tmDescent; - if ( externalLeading ) - *externalLeading = tm.tmExternalLeading; + const wxWindow* win = static_cast(this); + wxTextMeasure txm(win, &font); + txm.GetTextExtent(string, x, y, descent, externalLeading); } // --------------------------------------------------------------------------- @@ -3445,6 +3433,12 @@ wxWindowMSW::MSWHandleMessage(WXLRESULT *result, #if !defined(__WXWINCE__) case WM_CONTEXTMENU: { + // As with WM_HELP above, this message is propagated upwards + // the parent chain by DefWindowProc() itself, so we should + // always mark it as processed to prevent it from doing this + // as this would result in duplicate calls to event handlers. + processed = true; + // we don't convert from screen to client coordinates as // the event may be handled by a parent window wxPoint pt(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); @@ -3464,7 +3458,7 @@ wxWindowMSW::MSWHandleMessage(WXLRESULT *result, win = this; evtCtx.SetEventObject(win); - processed = win->HandleWindowEvent(evtCtx); + win->HandleWindowEvent(evtCtx); } break; #endif @@ -4828,6 +4822,8 @@ bool wxWindowMSW::HandlePaint() // be called from inside the event handlers called above) m_updateRegion.Clear(); + wxPaintDCImpl::EndPaint((wxWindow *)this); + return processed; } @@ -4969,7 +4965,11 @@ wxWindowMSW::MSWGetBgBrushForChild(WXHDC hDC, wxWindowMSW *child) ::MapWindowPoints(NULL, GetHwnd(), (POINT *)&rc, 1); - if ( !::SetBrushOrgEx((HDC)hDC, -rc.left, -rc.top, NULL) ) + int x = rc.left, + y = rc.top; + MSWAdjustBrushOrg(&x, &y); + + if ( !::SetBrushOrgEx((HDC)hDC, -x, -y, NULL) ) { wxLogLastError(wxT("SetBrushOrgEx(bg brush)")); } @@ -5297,10 +5297,10 @@ bool wxWindowMSW::HandleCommand(WXWORD id_, WXWORD cmd, WXHWND control) // the messages sent from the in-place edit control used by the treectrl // for label editing have id == 0, but they should _not_ be treated as menu // messages (they are EN_XXX ones, in fact) so don't translate anything - // coming from a control to wxEVT_COMMAND_MENU_SELECTED + // coming from a control to wxEVT_MENU if ( !control ) { - wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, id); + wxCommandEvent event(wxEVT_MENU, id); event.SetEventObject(this); event.SetInt(id); @@ -5461,7 +5461,7 @@ bool wxWindowMSW::HandleMouseEvent(WXUINT msg, int x, int y, WXUINT flags) }; #ifdef wxHAS_XBUTTON - // the same messages are used for both auxillary mouse buttons so we need + // the same messages are used for both auxiliary mouse buttons so we need // to adjust the index manually switch ( msg ) { @@ -5865,9 +5865,9 @@ int wxWindowMSW::HandleMenuChar(int WXUNUSED_IN_WINCE(chAccel), bool wxWindowMSW::HandleClipboardEvent(WXUINT nMsg) { - const wxEventType type = nMsg == WM_CUT ? wxEVT_COMMAND_TEXT_CUT - : nMsg == WM_COPY ? wxEVT_COMMAND_TEXT_COPY - : /* nMsg == WM_PASTE */ wxEVT_COMMAND_TEXT_PASTE; + const wxEventType type = nMsg == WM_CUT ? wxEVT_TEXT_CUT + : nMsg == WM_COPY ? wxEVT_TEXT_COPY + : /* nMsg == WM_PASTE */ wxEVT_TEXT_PASTE; wxClipboardTextEvent evt(type, GetId()); evt.SetEventObject(this); @@ -6315,6 +6315,9 @@ int VKToWX(WXWORD vk, WXLPARAM lParam, wchar_t *uc) case VK_DELETE: wxk = ChooseNormalOrExtended(lParam, WXK_NUMPAD_DELETE, WXK_DELETE); + + if ( uc ) + *uc = WXK_DELETE; break; case VK_RETURN: @@ -6609,7 +6612,7 @@ wxKeyboardHook(int nCode, WORD wParam, DWORD lParam) DWORD hiWord = HIWORD(lParam); if ( nCode != HC_NOREMOVE && ((hiWord & KF_UP) == 0) ) { - wchar_t uc; + wchar_t uc = 0; int id = wxMSWKeyboard::VKToWX(wParam, lParam, &uc); // Don't intercept keyboard entry (notably Escape) if a modal window @@ -7215,9 +7218,21 @@ wxWindow* wxFindWindowAtPoint(const wxPoint& pt) { // WindowFromPoint() ignores the disabled children but we're supposed // to take them into account, so check if we have a child at this - // coordinate. - ::ScreenToClient(hWnd, &pt2); - hWnd = ::ChildWindowFromPointEx(hWnd, pt2, CWP_SKIPINVISIBLE); + // coordinate using ChildWindowFromPointEx(). + for ( ;; ) + { + pt2.x = pt.x; + pt2.y = pt.y; + ::ScreenToClient(hWnd, &pt2); + HWND child = ::ChildWindowFromPointEx(hWnd, pt2, CWP_SKIPINVISIBLE); + if ( child == hWnd || !child ) + break; + + // ChildWindowFromPointEx() only examines the immediate children + // but we want to get the deepest (top in Z-order) one, so continue + // iterating for as long as it finds anything. + hWnd = child; + } } return wxGetWindowFromHWND((WXHWND)hWnd); @@ -7297,8 +7312,6 @@ bool wxWindowMSW::UnregisterHotKey(int hotkeyId) return true; } -#if wxUSE_ACCEL - bool wxWindowMSW::HandleHotKey(WXWPARAM wParam, WXLPARAM lParam) { int win_modifiers = LOWORD(lParam); @@ -7313,8 +7326,6 @@ bool wxWindowMSW::HandleHotKey(WXWPARAM wParam, WXLPARAM lParam) return HandleWindowEvent(event); } -#endif // wxUSE_ACCEL - #endif // wxUSE_HOTKEY // Not tested under WinCE