X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fc4070fc9d9d79c60b9f33278047e2d8081c8b18..a7130edbab452196921daabd3748c3538e82607b:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index f3b78bc62e..441e258415 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -113,10 +113,6 @@ #include #endif -#if !defined __WXWINCE__ && !defined NEED_PBT_H - #include -#endif - #if defined(__WXWINCE__) #include "wx/msw/wince/missing.h" #ifdef __POCKETPC__ @@ -413,7 +409,7 @@ wxWindow *wxWindowMSW::FindItemByHWND(WXHWND hWnd, bool controlOnly) const if ( !controlOnly #if wxUSE_CONTROLS - || parent->IsKindOf(CLASSINFO(wxControl)) + || wxDynamicCast(parent, wxControl) #endif // wxUSE_CONTROLS ) { @@ -2178,7 +2174,7 @@ void wxWindowMSW::DoGetTextExtent(const wxString& string, SIZE sizeRect; TEXTMETRIC tm; - ::GetTextExtentPoint32(hdc, string.wx_str(), string.length(), &sizeRect); + ::GetTextExtentPoint32(hdc, string.t_str(), string.length(), &sizeRect); GetTextMetrics(hdc, &tm); if ( x ) @@ -2902,9 +2898,13 @@ wxWindowMSW::MSWHandleMessage(WXLRESULT *result, #if wxUSE_MOUSEWHEEL case WM_MOUSEWHEEL: - processed = HandleMouseWheel(wParam, lParam); + processed = HandleMouseWheel(wxMOUSE_WHEEL_VERTICAL, wParam, lParam); break; -#endif + + case WM_MOUSEHWHEEL: + processed = HandleMouseWheel(wxMOUSE_WHEEL_HORIZONTAL, wParam, lParam); + break; +#endif // wxUSE_MOUSEWHEEL case WM_LBUTTONDOWN: case WM_LBUTTONUP: @@ -3027,8 +3027,8 @@ wxWindowMSW::MSWHandleMessage(WXLRESULT *result, case MM_JOY1BUTTONUP: case MM_JOY2BUTTONUP: processed = HandleJoystickEvent(message, - GET_X_LPARAM(lParam), - GET_Y_LPARAM(lParam), + LOWORD(lParam), + HIWORD(lParam), wParam); break; #endif // __WXMICROWIN__ @@ -3761,8 +3761,8 @@ bool wxWindowMSW::MSWCreate(const wxChar *wclass, m_hWnd = (WXHWND)::CreateWindowEx ( extendedStyle, - className.wx_str(), - title ? title : m_windowName.wx_str(), + className.t_str(), + title ? title : m_windowName.t_str(), style, x, y, w, h, (HWND)MSWGetParent(), @@ -3882,7 +3882,7 @@ bool wxWindowMSW::HandleTooltipNotify(WXUINT code, ( CP_ACP, 0, // no flags - ttip.wx_str(), + ttip.t_str(), tipLength, buf, WXSIZEOF(buf) - 1 @@ -4843,6 +4843,16 @@ void wxWindowMSW::OnPaint(wxPaintEvent& event) bool wxWindowMSW::HandleEraseBkgnd(WXHDC hdc) { + if ( IsBeingDeleted() ) + { + // We can get WM_ERASEBKGND after starting the destruction of our top + // level parent. Handling it in this case is unnecessary and can be + // actually harmful as e.g. wxStaticBox::GetClientSize() doesn't work + // without a valid TLW parent (because it uses dialog units internally + // which use the dialog font), so just don't do anything then. + return false; + } + switch ( GetBackgroundStyle() ) { case wxBG_STYLE_ERASE: @@ -5555,7 +5565,9 @@ bool wxWindowMSW::HandleMouseMove(int x, int y, WXUINT flags) } -bool wxWindowMSW::HandleMouseWheel(WXWPARAM wParam, WXLPARAM lParam) +bool +wxWindowMSW::HandleMouseWheel(wxMouseWheelAxis axis, + WXWPARAM wParam, WXLPARAM lParam) { #if wxUSE_MOUSEWHEEL // notice that WM_MOUSEWHEEL position is in screen coords (as it's @@ -5568,6 +5580,7 @@ bool wxWindowMSW::HandleMouseWheel(WXWPARAM wParam, WXLPARAM lParam) InitMouseEvent(event, pt.x, pt.y, LOWORD(wParam)); event.m_wheelRotation = (short)HIWORD(wParam); event.m_wheelDelta = WHEEL_DELTA; + event.m_wheelAxis = axis; static int s_linesPerRotation = -1; if ( s_linesPerRotation == -1 ) @@ -5798,9 +5811,7 @@ int wxWindowMSW::HandleMenuChar(int WXUNUSED_IN_WINCE(chAccel), #ifndef __WXWINCE__ const HMENU hmenu = (HMENU)lParam; - MENUITEMINFO mii; - wxZeroMemory(mii); - mii.cbSize = sizeof(MENUITEMINFO); + WinStruct mii; // we could use MIIM_FTYPE here as we only need to know if the item is // ownerdrawn or not and not dwTypeData which MIIM_TYPE also returns, but @@ -5825,7 +5836,7 @@ int wxWindowMSW::HandleMenuChar(int WXUNUSED_IN_WINCE(chAccel), wxMenuItem *item = (wxMenuItem*)mii.dwItemData; const wxString label(item->GetItemLabel()); - const wxChar *p = wxStrchr(label.wx_str(), wxT('&')); + const wxChar *p = wxStrchr(label.t_str(), wxT('&')); while ( p++ ) { if ( *p == wxT('&') ) @@ -5954,7 +5965,10 @@ bool wxWindowMSW::HandleJoystickEvent(WXUINT msg, int x, int y, WXUINT flags) } wxJoystickEvent event(eventType, buttons, joystick, change); - event.SetPosition(wxPoint(x, y)); + if ( eventType == wxEVT_JOY_ZMOVE ) + event.SetZPosition(x); + else + event.SetPosition(wxPoint(x, y)); event.SetEventObject(this); return HandleWindowEvent(event); @@ -6626,7 +6640,14 @@ wxKeyboardHook(int nCode, WORD wParam, DWORD lParam) #endif // wxUSE_UNICODE ) { - const wxWindow * const win = wxGetActiveWindow(); + wxWindow const* win = wxWindow::DoFindFocus(); + if ( !win ) + { + // Even if the focus got lost somehow, still send the event + // to the top level parent to allow a wxDialog to always + // close on Escape. + win = wxGetActiveWindow(); + } wxKeyEvent event(wxEVT_CHAR_HOOK); MSWInitAnyKeyEvent(event, wParam, lParam, win); @@ -6641,8 +6662,11 @@ wxKeyboardHook(int nCode, WORD wParam, DWORD lParam) if ( handler && handler->ProcessEvent(event) ) { - // processed - return 1; + if ( !event.IsNextEventAllowed() ) + { + // Stop processing of this event. + return 1; + } } } } @@ -7198,6 +7222,14 @@ wxWindow* wxFindWindowAtPoint(const wxPoint& pt) pt2.y = pt.y; HWND hWnd = ::WindowFromPoint(pt2); + if ( hWnd ) + { + // 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); + } return wxGetWindowFromHWND((WXHWND)hWnd); } @@ -7364,7 +7396,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxIdleWakeUpModule, wxModule) #if wxUSE_STATBOX static void wxAdjustZOrder(wxWindow* parent) { - if (parent->IsKindOf(CLASSINFO(wxStaticBox))) + if (wxDynamicCast(parent, wxStaticBox)) { // Set the z-order correctly SetWindowPos((HWND) parent->GetHWND(), HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);