X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5e67eb97376165832f4db541a5e4be0414da9efc..cb0791531fff2f3673e28d68be67a0ee5398a036:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index d90a1772e6..903d55ffcf 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -54,6 +54,7 @@ #endif #include "wx/module.h" +#include "wx/sysopt.h" #if wxUSE_DRAG_AND_DROP #include "wx/dnd.h" @@ -117,9 +118,13 @@ #include "wx/msw/missing.h" #if defined(__WXWINCE__) -#include "wx/msw/wince/missing.h" + #include "wx/msw/wince/missing.h" #endif +#if defined(TME_LEAVE) && defined(WM_MOUSELEAVE) + #define HAVE_TRACKMOUSEEVENT +#endif // everything needed for TrackMouseEvent() + // --------------------------------------------------------------------------- // global variables // --------------------------------------------------------------------------- @@ -305,9 +310,9 @@ wxBEGIN_PROPERTIES_TABLE(wxWindow) wxPROPERTY( Shown , bool , Show , IsShown , wxxVariant((bool)true) , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) #if 0 // possible property candidates (not in xrc) or not valid in all subclasses - wxPROPERTY( Title,wxString, SetTitle, GetTitle, wxT("") ) + wxPROPERTY( Title,wxString, SetTitle, GetTitle, wxEmptyString ) wxPROPERTY( Font , wxFont , SetFont , GetWindowFont , ) - wxPROPERTY( Label,wxString, SetLabel, GetLabel, wxT("") ) + wxPROPERTY( Label,wxString, SetLabel, GetLabel, wxEmptyString ) // MaxHeight, Width , MinHeight , Width // TODO switch label to control and title to toplevels @@ -1145,8 +1150,10 @@ WXDWORD wxWindowMSW::MSWGetStyle(long flags, WXDWORD *exstyle) const // using this flag results in very significant reduction in flicker, // especially with controls inside the static boxes (as the interior of the - // box is not redrawn twice) - style |= WS_CLIPCHILDREN; + // box is not redrawn twice). + // wxCLIP_CHILDREN support is for compatibility with old applications only. + if ((!wxSystemOptions::GetOptionInt(wxT("msw.window.no-clip-children")) == 1) || (flags & wxCLIP_CHILDREN)) + style |= WS_CLIPCHILDREN; // 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, @@ -1243,7 +1250,7 @@ bool wxWindowMSW::IsMouseInWindow() const void wxWindowMSW::OnInternalIdle() { -#ifdef __WXWINCE__ +#ifndef HAVE_TRACKMOUSEEVENT // Check if we need to send a LEAVE event if ( m_mouseInWindow ) { @@ -1254,7 +1261,7 @@ void wxWindowMSW::OnInternalIdle() GenerateMouseLeave(); } } -#endif // !__WXWINCE__ +#endif // !HAVE_TRACKMOUSEEVENT if (wxUpdateUIEvent::CanUpdate(this)) UpdateWindowUI(wxUPDATE_UI_FROMIDLE); @@ -1520,7 +1527,7 @@ void wxWindowMSW::DoMoveWindow(int x, int y, int width, int height) // otherwise (or if deferring failed) move the window in place immediately if ( !hdwp ) { - if ( !::MoveWindow(GetHwnd(), x, y, width, height, TRUE) ) + if ( !::MoveWindow(GetHwnd(), x, y, width, height, IsShown()) ) { wxLogLastError(wxT("MoveWindow")); } @@ -1651,13 +1658,6 @@ void wxWindowMSW::DoSetClientSize(int width, int height) } } -// For implementation purposes - sometimes decorations make the client area -// smaller -wxPoint wxWindowMSW::GetClientAreaOrigin() const -{ - return wxPoint(0, 0); -} - // --------------------------------------------------------------------------- // text metrics // --------------------------------------------------------------------------- @@ -1832,7 +1832,8 @@ bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg) } bool bForward = true, - bWindowChange = false; + bWindowChange = false, + bFromTab = false; // should we process this message specially? bool bProcess = true; @@ -1846,6 +1847,7 @@ bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg) // Ctrl-Tab cycles thru notebook pages bWindowChange = bCtrlDown; bForward = !bShiftDown; + bFromTab = true; } break; @@ -1970,6 +1972,7 @@ bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg) wxNavigationKeyEvent event; event.SetDirection(bForward); event.SetWindowChange(bWindowChange); + event.SetFromTab(bFromTab); event.SetEventObject(this); if ( GetEventHandler()->ProcessEvent(event) ) @@ -2315,23 +2318,26 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l break; } -#ifndef __WXWINCE__ - case WM_PRINT: +#ifdef WM_PRINT + case WM_PRINTCLIENT: + if ( GetParent() && + GetParent()->MSWPrintChild((wxWindow *)this, wParam, lParam) ) { -#if wxUSE_LISTCTRL - // Don't call the wx handlers in this case - if ( wxIsKindOf(this, wxListCtrl) ) - break; -#endif + processed = true; + } + break; + case WM_PRINT: + { if ( lParam & PRF_ERASEBKGND ) HandleEraseBkgnd((WXHDC)(HDC)wParam); wxPaintDCEx dc((wxWindow *)this, (WXHDC)wParam); + processed = HandlePaint(); } break; -#endif +#endif // WM_PRINT case WM_CLOSE: #ifdef __WXUNIVERSAL__ @@ -2358,23 +2364,20 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l wParam); break; -#ifdef WM_MOUSELEAVE +#ifdef HAVE_TRACKMOUSEEVENT case WM_MOUSELEAVE: + // filter out excess WM_MOUSELEAVE events sent after PopupMenu() (on XP at least) + if ( m_mouseInWindow ) { - // filter out excess WM_MOUSELEAVE events sent after PopupMenu() (on XP at least) - if ( m_mouseInWindow ) - { - GenerateMouseLeave(); - } - - // always pass processed back as false, this allows the window - // manager to process the message too. This is needed to - // ensure windows XP themes work properly as the mouse moves - // over widgets like buttons. - processed = false; + GenerateMouseLeave(); } + + // always pass processed back as false, this allows the window + // manager to process the message too. This is needed to + // ensure windows XP themes work properly as the mouse moves + // over widgets like buttons. So don't set processed to true here. break; -#endif // WM_MOUSELEAVE +#endif // HAVE_TRACKMOUSEEVENT #if wxUSE_MOUSEWHEEL case WM_MOUSEWHEEL: @@ -2786,7 +2789,7 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l wxHelpEvent helpEvent(wxEVT_HELP, subjectOfHelp->GetId(), #ifdef __WXWINCE__ - wxPoint(0, 0) + wxPoint(0,0) #else wxPoint(info->MousePos.x, info->MousePos.y) #endif @@ -4045,6 +4048,14 @@ WXHBRUSH wxWindowMSW::MSWGetBgBrush(WXHDC hDC) return 0; } +bool +wxWindowMSW::MSWPrintChild(wxWindow * WXUNUSED(win), + WXWPARAM WXUNUSED(wParam), + WXLPARAM WXUNUSED(lParam)) +{ + return false; +} + // --------------------------------------------------------------------------- // moving and resizing // --------------------------------------------------------------------------- @@ -4408,17 +4419,18 @@ bool wxWindowMSW::HandleMouseMove(int x, int y, WXUINT flags) { // Generate an ENTER event m_mouseInWindow = true; -#ifndef __WXWINCE__ - TRACKMOUSEEVENT trackinfo; - trackinfo.cbSize = sizeof(trackinfo); +#ifdef HAVE_TRACKMOUSEEVENT + WinStruct trackinfo; + trackinfo.dwFlags = TME_LEAVE; trackinfo.hwndTrack = GetHwnd(); - //Use the commctrl.h _TrackMouseEvent, which will call the - // appropriate TrackMouseEvent or emulate it ( win95 ) - // else we need _WIN32_WINNT >= 0x0400 + + // Use the commctrl.h _TrackMouseEvent(), which will call the real + // TrackMouseEvent() if available or emulate it _TrackMouseEvent(&trackinfo); -#endif // __WXWINCE__ +#endif // HAVE_TRACKMOUSEEVENT + wxMouseEvent event(wxEVT_ENTER_WINDOW); InitMouseEvent(event, x, y, flags); @@ -4944,7 +4956,7 @@ int wxCharCodeMSWToWX(int keySym, WXLPARAM lParam) case VK_CLEAR: id = WXK_CLEAR; break; case VK_SHIFT: id = WXK_SHIFT; break; case VK_CONTROL: id = WXK_CONTROL; break; - case VK_MENU : id = WXK_MENU; break; + case VK_MENU : id = WXK_ALT; break; case VK_PAUSE: id = WXK_PAUSE; break; case VK_CAPITAL: id = WXK_CAPITAL; break; case VK_SPACE: id = WXK_SPACE; break; @@ -5050,7 +5062,6 @@ WXWORD wxCharCodeWXToMSW(int id, bool *isVirtual) case WXK_SHIFT: keySym = VK_SHIFT; break; case WXK_CONTROL: keySym = VK_CONTROL; break; case WXK_ALT: keySym = VK_MENU; break; - case WXK_MENU : keySym = VK_MENU; break; case WXK_PAUSE: keySym = VK_PAUSE; break; case WXK_CAPITAL: keySym = VK_CAPITAL; break; case WXK_PRIOR: keySym = VK_PRIOR; break;