X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/28bf925c65ac2ccda970d4ab6fb2ba4e3a4168c7..18caa1e963269d02499b327bb4e7cc2ac48fd67e:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 31a35b51c7..53eefe26ed 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -79,6 +79,7 @@ #endif #include "wx/msw/private.h" +#include "wx/msw/dcclient.h" #if wxUSE_TOOLTIPS #include "wx/tooltip.h" @@ -133,6 +134,19 @@ #define ETS_ASSIST 7 #endif +// define the constants used by AnimateWindow() if our SDK doesn't have them +#ifndef AW_CENTER + #define AW_HOR_POSITIVE 0x00000001 + #define AW_HOR_NEGATIVE 0x00000002 + #define AW_VER_POSITIVE 0x00000004 + #define AW_VER_NEGATIVE 0x00000008 + #define AW_CENTER 0x00000010 + #define AW_HIDE 0x00010000 + #define AW_ACTIVATE 0x00020000 + #define AW_SLIDE 0x00040000 + #define AW_BLEND 0x00080000 +#endif + #if defined(TME_LEAVE) && defined(WM_MOUSELEAVE) && wxUSE_DYNLIB_CLASS #define HAVE_TRACKMOUSEEVENT #endif // everything needed for TrackMouseEvent() @@ -166,8 +180,8 @@ // --------------------------------------------------------------------------- #if wxUSE_MENUS_NATIVE -wxMenu *wxCurrentPopupMenu = NULL; -#endif // wxUSE_MENUS_NATIVE +extern wxMenu *wxCurrentPopupMenu; +#endif #ifdef __WXWINCE__ extern wxChar *wxCanvasClassName; @@ -510,8 +524,6 @@ void wxWindowMSW::Init() m_mouseInWindow = false; m_lastKeydownProcessed = false; - m_frozenness = 0; - m_hWnd = 0; m_hDWP = 0; @@ -713,9 +725,7 @@ wxWindowMSW::MSWShowWithEffect(bool show, static bool s_initDone = false; if ( !s_initDone ) { - wxLogNull noLog; - - wxDynamicLibrary dllUser32(_T("user32.dll"), wxDL_VERBATIM); + wxDynamicLibrary dllUser32(_T("user32.dll"), wxDL_VERBATIM | wxDL_QUIET); wxDL_INIT_FUNC(s_pfn, AnimateWindow, dllUser32); s_initDone = true; @@ -1198,7 +1208,7 @@ void wxWindowMSW::SubclassWin(WXHWND hWnd) // we're officially created now, send the event wxWindowCreateEvent event((wxWindow *)this); - (void)GetEventHandler()->ProcessEvent(event); + (void)HandleWindowEvent(event); } void wxWindowMSW::UnsubclassWin() @@ -1560,7 +1570,7 @@ void wxWindowMSW::OnInternalIdle() } #endif // !HAVE_TRACKMOUSEEVENT - if (wxUpdateUIEvent::CanUpdate(this) && IsShown()) + if (wxUpdateUIEvent::CanUpdate(this) && IsShownOnScreen()) UpdateWindowUI(wxUPDATE_UI_FROMIDLE); } @@ -1592,29 +1602,21 @@ static inline void SendSetRedraw(HWND hwnd, bool on) #endif } -void wxWindowMSW::Freeze() +void wxWindowMSW::DoFreeze() { - if ( !m_frozenness++ ) - { - if ( IsShown() ) - SendSetRedraw(GetHwnd(), false); - } + if ( IsShown() ) + SendSetRedraw(GetHwnd(), false); } -void wxWindowMSW::Thaw() +void wxWindowMSW::DoThaw() { - wxASSERT_MSG( m_frozenness > 0, _T("Thaw() without matching Freeze()") ); - - if ( --m_frozenness == 0 ) + if ( IsShown() ) { - if ( IsShown() ) - { - SendSetRedraw(GetHwnd(), true); + SendSetRedraw(GetHwnd(), true); - // we need to refresh everything or otherwise the invalidated area - // is not going to be repainted - Refresh(); - } + // we need to refresh everything or otherwise the invalidated area + // is not going to be repainted + Refresh(); } } @@ -2126,19 +2128,19 @@ int wxWindowMSW::GetCharWidth() const void wxWindowMSW::GetTextExtent(const wxString& string, int *x, int *y, int *descent, int *externalLeading, - const wxFont *theFont) const + const wxFont *fontToUse) const { - wxASSERT_MSG( !theFont || theFont->Ok(), + wxASSERT_MSG( !fontToUse || fontToUse->Ok(), _T("invalid font in GetTextExtent()") ); - wxFont fontToUse; - if (theFont) - fontToUse = *theFont; + HFONT hfontToUse; + if ( fontToUse ) + hfontToUse = GetHfontOf(*fontToUse); else - fontToUse = GetFont(); + hfontToUse = GetHfontOf(GetFont()); WindowHDC hdc(GetHwnd()); - SelectInHDC selectFont(hdc, GetHfontOf(fontToUse)); + SelectInHDC selectFont(hdc, hfontToUse); SIZE sizeRect; TEXTMETRIC tm; @@ -2205,7 +2207,6 @@ bool wxWindowMSW::DoPopupMenu(wxMenu *menu, int x, int y) point.x = x; point.y = y; ::ClientToScreen(hWnd, &point); - wxCurrentPopupMenu = menu; #if defined(__WXWINCE__) static const UINT flags = 0; #else // !__WXWINCE__ @@ -2234,8 +2235,6 @@ bool wxWindowMSW::DoPopupMenu(wxMenu *menu, int x, int y) // for example) and so we do need to process the event immediately wxYieldForCommandsOnly(); - wxCurrentPopupMenu = NULL; - menu->SetInvokingWindow(NULL); return true; @@ -2420,7 +2419,7 @@ bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg) // map Enter presses into button presses on PDAs wxJoystickEvent event(wxEVT_JOY_BUTTON_DOWN); event.SetEventObject(this); - if ( GetEventHandler()->ProcessEvent(event) ) + if ( HandleWindowEvent(event) ) return true; #endif // __WXWINCE__ } @@ -2438,7 +2437,7 @@ bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg) event.SetFromTab(bFromTab); event.SetEventObject(this); - if ( GetEventHandler()->ProcessEvent(event) ) + if ( HandleWindowEvent(event) ) { // as we don't call IsDialogMessage(), which would take of // this by default, we need to manually send this message @@ -2931,7 +2930,7 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l wxContextMenuEvent evtCtx(wxEVT_CONTEXT_MENU, GetId(), pt); evtCtx.SetEventObject(this); - if (GetEventHandler()->ProcessEvent(evtCtx)) + if (HandleWindowEvent(evtCtx)) { processed = true; return true; @@ -3165,6 +3164,12 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l break; #endif // wxUSE_HOTKEY + case WM_CUT: + case WM_COPY: + case WM_PASTE: + processed = HandleClipboardEvent(message); + break; + case WM_HSCROLL: case WM_VSCROLL: { @@ -3319,14 +3324,14 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l ); helpEvent.SetEventObject(this); - GetEventHandler()->ProcessEvent(helpEvent); + HandleWindowEvent(helpEvent); #ifndef __WXWINCE__ } else if ( info->iContextType == HELPINFO_MENUITEM ) { wxHelpEvent helpEvent(wxEVT_HELP, info->iCtrlId); helpEvent.SetEventObject(this); - GetEventHandler()->ProcessEvent(helpEvent); + HandleWindowEvent(helpEvent); } else // unknown help event? @@ -3359,7 +3364,7 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l win = this; evtCtx.SetEventObject(win); - processed = win->GetEventHandler()->ProcessEvent(evtCtx); + processed = win->HandleWindowEvent(evtCtx); } break; #endif @@ -3417,9 +3422,10 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l wxUxThemeHandle hTheme((wxWindow *)this, L"EDIT"); RECT rcClient = { 0, 0, 0, 0 }; wxClientDC dc((wxWindow *)this); + wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl(); if (theme->GetThemeBackgroundContentRect( - hTheme, GetHdcOf(dc), EP_EDITTEXT, ETS_NORMAL, + hTheme, GetHdcOf(*impl), EP_EDITTEXT, ETS_NORMAL, &rect, &rcClient) == S_OK) { InflateRect(&rcClient, -1, -1); @@ -3445,6 +3451,7 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l wxUxThemeHandle hTheme((wxWindow *)this, L"EDIT"); wxWindowDC dc((wxWindow *)this); + wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl(); // Clip the DC so that you only draw on the non-client area RECT rcBorder; @@ -3452,16 +3459,16 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l RECT rcClient; theme->GetThemeBackgroundContentRect( - hTheme, GetHdcOf(dc), EP_EDITTEXT, ETS_NORMAL, &rcBorder, &rcClient); + hTheme, GetHdcOf(*impl), EP_EDITTEXT, ETS_NORMAL, &rcBorder, &rcClient); InflateRect(&rcClient, -1, -1); - ::ExcludeClipRect(GetHdcOf(dc), rcClient.left, rcClient.top, + ::ExcludeClipRect(GetHdcOf(*impl), rcClient.left, rcClient.top, rcClient.right, rcClient.bottom); // Make sure the background is in a proper state if (theme->IsThemeBackgroundPartiallyTransparent(hTheme, EP_EDITTEXT, ETS_NORMAL)) { - theme->DrawThemeParentBackground(GetHwnd(), GetHdcOf(dc), &rcBorder); + theme->DrawThemeParentBackground(GetHwnd(), GetHdcOf(*impl), &rcBorder); } // Draw the border @@ -3473,7 +3480,7 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l // nState = ETS_READONLY; else nState = ETS_NORMAL; - theme->DrawThemeBackground(hTheme, GetHdcOf(dc), EP_EDITTEXT, nState, &rcBorder, NULL); + theme->DrawThemeBackground(hTheme, GetHdcOf(*impl), EP_EDITTEXT, nState, &rcBorder, NULL); } } break; @@ -3952,7 +3959,7 @@ bool wxWindowMSW::HandleActivate(int state, m_windowId); event.SetEventObject(this); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } bool wxWindowMSW::HandleSetFocus(WXHWND hwnd) @@ -3967,7 +3974,7 @@ bool wxWindowMSW::HandleSetFocus(WXHWND hwnd) // notify the parent keeping track of focus for the kbd navigation // purposes that we got it wxChildFocusEvent eventFocus((wxWindow *)this); - (void)GetEventHandler()->ProcessEvent(eventFocus); + (void)HandleWindowEvent(eventFocus); #if wxUSE_CARET // Deal with caret @@ -3977,22 +3984,13 @@ bool wxWindowMSW::HandleSetFocus(WXHWND hwnd) } #endif // wxUSE_CARET -#if wxUSE_TEXTCTRL - // If it's a wxTextCtrl don't send the event as it will be done - // after the control gets to process it from EN_FOCUS handler - if ( wxDynamicCastThis(wxTextCtrl) ) - { - return false; - } -#endif // wxUSE_TEXTCTRL - wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId); event.SetEventObject(this); // wxFindWinFromHandle() may return NULL, it is ok event.SetWindow(wxFindWinFromHandle(hwnd)); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } bool wxWindowMSW::HandleKillFocus(WXHWND hwnd) @@ -4005,16 +4003,6 @@ bool wxWindowMSW::HandleKillFocus(WXHWND hwnd) } #endif // wxUSE_CARET -#if wxUSE_TEXTCTRL - // If it's a wxTextCtrl don't send the event as it will be done - // after the control gets to process it. - wxTextCtrl *ctrl = wxDynamicCastThis(wxTextCtrl); - if ( ctrl ) - { - return false; - } -#endif - // Don't send the event when in the process of being deleted. This can // only cause problems if the event handler tries to access the object. if ( m_isBeingDeleted ) @@ -4028,7 +4016,7 @@ bool wxWindowMSW::HandleKillFocus(WXHWND hwnd) // wxFindWinFromHandle() may return NULL, it is ok event.SetWindow(wxFindWinFromHandle(hwnd)); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } // --------------------------------------------------------------------------- @@ -4054,7 +4042,7 @@ bool wxWindowMSW::HandleShow(bool show, int WXUNUSED(status)) wxShowEvent event(GetId(), show); event.SetEventObject(this); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } bool wxWindowMSW::HandleInitDialog(WXHWND WXUNUSED(hWndFocus)) @@ -4062,7 +4050,7 @@ bool wxWindowMSW::HandleInitDialog(WXHWND WXUNUSED(hWndFocus)) wxInitDialogEvent event(GetId()); event.SetEventObject(this); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } bool wxWindowMSW::HandleDropFiles(WXWPARAM wParam) @@ -4102,7 +4090,7 @@ bool wxWindowMSW::HandleDropFiles(WXWPARAM wParam) event.m_pos.x = dropPoint.x; event.m_pos.y = dropPoint.y; - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); #endif } @@ -4145,7 +4133,7 @@ bool wxWindowMSW::HandleSetCursor(WXHWND WXUNUSED(hWnd), ScreenToClient(&x, &y); wxSetCursorEvent event(x, y); - bool processedEvtSetCursor = GetEventHandler()->ProcessEvent(event); + bool processedEvtSetCursor = HandleWindowEvent(event); if ( processedEvtSetCursor && event.HasCursor() ) { hcursor = GetHcursorOf(event.GetCursor()); @@ -4241,7 +4229,7 @@ bool wxWindowMSW::HandlePower(WXWPARAM WXUNUSED_IN_WINCE(wParam), // TODO: notify about PBTF_APMRESUMEFROMFAILURE in case of resume events? wxPowerEvent event(evtType); - if ( !GetEventHandler()->ProcessEvent(event) ) + if ( !HandleWindowEvent(event) ) return false; *vetoed = event.IsVetoed(); @@ -4391,7 +4379,7 @@ bool wxWindowMSW::HandleSysColorChange() wxSysColourChangedEvent event; event.SetEventObject(this); - (void)GetEventHandler()->ProcessEvent(event); + (void)HandleWindowEvent(event); // always let the system carry on the default processing to allow the // native controls to react to the colours update @@ -4403,7 +4391,7 @@ bool wxWindowMSW::HandleDisplayChange() wxDisplayChangedEvent event; event.SetEventObject(this); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } #ifndef __WXMICROWIN__ @@ -4467,7 +4455,7 @@ bool wxWindowMSW::HandlePaletteChanged(WXHWND hWndPalChange) event.SetEventObject(this); event.SetChangedWindow(wxFindWinFromHandle(hWndPalChange)); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } bool wxWindowMSW::HandleCaptureChanged(WXHWND hWndGainedCapture) @@ -4479,7 +4467,7 @@ bool wxWindowMSW::HandleCaptureChanged(WXHWND hWndGainedCapture) wxWindow *win = wxFindWinFromHandle(hWndGainedCapture); wxMouseCaptureChangedEvent event(GetId(), win); event.SetEventObject(this); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } bool wxWindowMSW::HandleSettingChange(WXWPARAM wParam, WXLPARAM lParam) @@ -4534,7 +4522,7 @@ bool wxWindowMSW::HandleQueryNewPalette() wxQueryNewPaletteEvent event(GetId()); event.SetEventObject(this); - return GetEventHandler()->ProcessEvent(event) && event.GetPaletteRealized(); + return HandleWindowEvent(event) && event.GetPaletteRealized(); } // Responds to colour changes: passes event on to children. @@ -4650,14 +4638,14 @@ bool wxWindowMSW::HandlePaint() wxPaintEvent event(m_windowId); event.SetEventObject(this); - bool processed = GetEventHandler()->ProcessEvent(event); + bool processed = HandleWindowEvent(event); // note that we must generate NC event after the normal one as otherwise // BeginPaint() will happily overwrite our decorations with the background // colour wxNcPaintEvent eventNc(m_windowId); eventNc.SetEventObject(this); - GetEventHandler()->ProcessEvent(eventNc); + HandleWindowEvent(eventNc); // don't keep an HRGN we don't need any longer (GetUpdateRegion() can only // be called from inside the event handlers called above) @@ -4672,7 +4660,7 @@ void wxWindowMSW::OnPaint(wxPaintEvent& event) #ifdef __WXUNIVERSAL__ event.Skip(); #else - HDC hDC = (HDC) wxPaintDC::FindDCInCache((wxWindow*) event.GetEventObject()); + HDC hDC = (HDC) wxPaintDCImpl::FindDCInCache((wxWindow*) event.GetEventObject()); if (hDC != 0) { MSWDefWindowProc(WM_PAINT, (WPARAM) hDC, 0); @@ -4683,16 +4671,17 @@ void wxWindowMSW::OnPaint(wxPaintEvent& event) bool wxWindowMSW::HandleEraseBkgnd(WXHDC hdc) { wxDCTemp dc(hdc, GetClientSize()); + wxDCTempImpl *impl = (wxDCTempImpl*) dc.GetImpl(); - dc.SetHDC(hdc); - dc.SetWindow((wxWindow *)this); + impl->SetHDC(hdc); + impl->SetWindow((wxWindow *)this); wxEraseEvent event(m_windowId, &dc); event.SetEventObject(this); - bool rc = GetEventHandler()->ProcessEvent(event); + bool rc = HandleWindowEvent(event); // must be called manually as ~wxDC doesn't do anything for wxDCTemp - dc.SelectOldObjects(hdc); + impl->SelectOldObjects(hdc); return rc; } @@ -4716,9 +4705,12 @@ void wxWindowMSW::OnEraseBackground(wxEraseEvent& event) return; } + wxDC *dc = event.GetDC(); + if (!dc) return; + wxMSWDCImpl *impl = (wxMSWDCImpl*) dc->GetImpl(); // do default background painting - if ( !DoEraseBackground(GetHdcOf(*event.GetDC())) ) + if ( !DoEraseBackground(GetHdcOf(*impl)) ) { // let the system paint the background event.Skip(); @@ -4828,7 +4820,7 @@ bool wxWindowMSW::HandleMinimize() wxIconizeEvent event(m_windowId); event.SetEventObject(this); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } bool wxWindowMSW::HandleMaximize() @@ -4836,7 +4828,7 @@ bool wxWindowMSW::HandleMaximize() wxMaximizeEvent event(m_windowId); event.SetEventObject(this); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } bool wxWindowMSW::HandleMove(int x, int y) @@ -4845,7 +4837,7 @@ bool wxWindowMSW::HandleMove(int x, int y) wxMoveEvent event(point, m_windowId); event.SetEventObject(this); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } bool wxWindowMSW::HandleMoving(wxRect& rect) @@ -4853,7 +4845,7 @@ bool wxWindowMSW::HandleMoving(wxRect& rect) wxMoveEvent event(rect, m_windowId); event.SetEventObject(this); - bool rc = GetEventHandler()->ProcessEvent(event); + bool rc = HandleWindowEvent(event); if (rc) rect = event.GetRect(); return rc; @@ -4865,7 +4857,7 @@ bool wxWindowMSW::HandleEnterSizeMove() event.SetEventType(wxEVT_MOVE_START); event.SetEventObject(this); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } bool wxWindowMSW::HandleExitSizeMove() @@ -4874,7 +4866,7 @@ bool wxWindowMSW::HandleExitSizeMove() event.SetEventType(wxEVT_MOVE_END); event.SetEventObject(this); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } bool wxWindowMSW::HandleSize(int WXUNUSED(w), int WXUNUSED(h), WXUINT wParam) @@ -4936,7 +4928,7 @@ bool wxWindowMSW::HandleSize(int WXUNUSED(w), int WXUNUSED(h), WXUINT wParam) wxSizeEvent event(GetSize(), m_windowId); event.SetEventObject(this); - processed = GetEventHandler()->ProcessEvent(event); + processed = HandleWindowEvent(event); } #if USE_DEFERRED_SIZING @@ -4976,7 +4968,7 @@ bool wxWindowMSW::HandleSizing(wxRect& rect) wxSizeEvent event(rect, m_windowId); event.SetEventObject(this); - bool rc = GetEventHandler()->ProcessEvent(event); + bool rc = HandleWindowEvent(event); if (rc) rect = event.GetRect(); return rc; @@ -5077,7 +5069,7 @@ bool wxWindowMSW::HandleCommand(WXWORD id_, WXWORD cmd, WXHWND control) event.SetId(id); event.SetInt(id); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } else { @@ -5249,7 +5241,7 @@ bool wxWindowMSW::HandleMouseEvent(WXUINT msg, int x, int y, WXUINT flags) wxMouseEvent event(eventsMouse[msg - WM_MOUSEMOVE]); InitMouseEvent(event, x, y, flags); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } bool wxWindowMSW::HandleMouseMove(int x, int y, WXUINT flags) @@ -5306,7 +5298,7 @@ bool wxWindowMSW::HandleMouseMove(int x, int y, WXUINT flags) wxMouseEvent event(wxEVT_ENTER_WINDOW); InitMouseEvent(event, x, y, flags); - (void)GetEventHandler()->ProcessEvent(event); + (void)HandleWindowEvent(event); } } #ifdef HAVE_TRACKMOUSEEVENT @@ -5375,7 +5367,7 @@ bool wxWindowMSW::HandleMouseWheel(WXWPARAM wParam, WXLPARAM lParam) } event.m_linesPerAction = s_linesPerRotation; - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); #else // !wxUSE_MOUSEWHEEL wxUnusedVar(wParam); @@ -5422,7 +5414,7 @@ void wxWindowMSW::GenerateMouseLeave() wxMouseEvent event(wxEVT_LEAVE_WINDOW); InitMouseEvent(event, pt.x, pt.y, state); - (void)GetEventHandler()->ProcessEvent(event); + (void)HandleWindowEvent(event); } // --------------------------------------------------------------------------- @@ -5509,7 +5501,7 @@ bool wxWindowMSW::HandleChar(WXWPARAM wParam, WXLPARAM lParam, bool isASCII) event.m_altDown = false; } - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } bool wxWindowMSW::HandleKeyDown(WXWPARAM wParam, WXLPARAM lParam) @@ -5523,7 +5515,7 @@ bool wxWindowMSW::HandleKeyDown(WXWPARAM wParam, WXLPARAM lParam) } wxKeyEvent event(CreateKeyEvent(wxEVT_KEY_DOWN, id, lParam, wParam)); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } bool wxWindowMSW::HandleKeyUp(WXWPARAM wParam, WXLPARAM lParam) @@ -5537,7 +5529,7 @@ bool wxWindowMSW::HandleKeyUp(WXWPARAM wParam, WXLPARAM lParam) } wxKeyEvent event(CreateKeyEvent(wxEVT_KEY_UP, id, lParam, wParam)); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } #if wxUSE_MENUS @@ -5620,7 +5612,7 @@ bool wxWindowMSW::HandleClipboardEvent( WXUINT nMsg ) evt.SetEventObject(this); - return GetEventHandler()->ProcessEvent(evt); + return HandleWindowEvent(evt); } #endif // wxUSE_MENUS @@ -5706,7 +5698,7 @@ bool wxWindowMSW::HandleJoystickEvent(WXUINT msg, int x, int y, WXUINT flags) event.SetPosition(wxPoint(x, y)); event.SetEventObject(this); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); #else wxUnusedVar(msg); wxUnusedVar(x); @@ -5793,7 +5785,7 @@ bool wxWindowMSW::MSWOnScroll(int orientation, WXWORD wParam, return false; } - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } // ---------------------------------------------------------------------------- @@ -6092,31 +6084,44 @@ WXWORD wxCharCodeWXToMSW(int wxk, bool *isVirtual) break; default: - if ( isVirtual ) - *isVirtual = false; - vk = (WXWORD)wxk; - break; + // no VkKeyScan() under CE unfortunately, we need to test how does + // it handle OEM keys +#ifndef __WXWINCE__ + // check to see if its one of the OEM key codes. + BYTE vks = LOBYTE(VkKeyScan(wxk)); + if ( vks != 0xff ) + { + vk = vks; + } + else +#endif // !__WXWINCE__ + { + if ( isVirtual ) + *isVirtual = false; + vk = (WXWORD)wxk; + } } return vk; } -#ifndef SM_SWAPBUTTON - #define SM_SWAPBUTTON 23 -#endif - // small helper for wxGetKeyState() and wxGetMouseState() static inline bool wxIsKeyDown(WXWORD vk) { - switch (vk) + // SM_SWAPBUTTON is not available under CE, so don't swap buttons there +#ifdef SM_SWAPBUTTON + if ( vk == VK_LBUTTON || vk == VK_RBUTTON ) { - case VK_LBUTTON: - if (GetSystemMetrics(SM_SWAPBUTTON)) vk = VK_RBUTTON; - break; - case VK_RBUTTON: - if (GetSystemMetrics(SM_SWAPBUTTON)) vk = VK_LBUTTON; - break; + if ( ::GetSystemMetrics(SM_SWAPBUTTON) ) + { + if ( vk == VK_LBUTTON ) + vk = VK_RBUTTON; + else // vk == VK_RBUTTON + vk = VK_LBUTTON; + } } +#endif // SM_SWAPBUTTON + // the low order bit indicates whether the key was pressed since the last // call and the high order one indicates whether it is down right now and // we only want that one @@ -6932,7 +6937,7 @@ bool wxWindowMSW::HandleHotKey(WXWPARAM wParam, WXLPARAM lParam) event.m_altDown = (win_modifiers & MOD_ALT) != 0; event.m_metaDown = (win_modifiers & MOD_WIN) != 0; - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } #endif // wxUSE_ACCEL