X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/321239b6c4cbb7eb9f5ef1c27f69709f2d762bf4..a328684392b1a97623ff02cb4bb174d25f376900:/src/msw/window.cpp diff --git a/src/msw/window.cpp b/src/msw/window.cpp index a40b070912..bb30e91849 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -221,6 +221,38 @@ static inline void wxBringWindowToTop(HWND hwnd) } } +// ensure that all our parent windows have WS_EX_CONTROLPARENT style +static void EnsureParentHasControlParentStyle(wxWindow *parent) +{ + /* + If we have WS_EX_CONTROLPARENT flag we absolutely *must* set it for our + parent as well as otherwise several Win32 functions using + GetNextDlgTabItem() to iterate over all controls such as + IsDialogMessage() or DefDlgProc() would enter an infinite loop: indeed, + all of them iterate over all the controls starting from the currently + focused one and stop iterating when they get back to the focus but + unless all parents have WS_EX_CONTROLPARENT bit set, they would never + get back to the initial (focused) window: as we do have this style, + GetNextDlgTabItem() will leave this window and continue in its parent, + but if the parent doesn't have it, it wouldn't recurse inside it later + on and so wouldn't have a chance of getting back to this window neither. + */ +#ifndef __WXWINCE__ + while ( parent && !parent->IsTopLevel() ) + { + LONG exStyle = ::GetWindowLong(GetHwndOf(parent), GWL_EXSTYLE); + if ( !(exStyle & WS_EX_CONTROLPARENT) ) + { + // force the parent to have this style + ::SetWindowLong(GetHwndOf(parent), GWL_EXSTYLE, + exStyle | WS_EX_CONTROLPARENT); + } + + parent = parent->GetParent(); + } +#endif // !__WXWINCE__ +} + // --------------------------------------------------------------------------- // event tables // --------------------------------------------------------------------------- @@ -1290,6 +1322,13 @@ bool wxWindowMSW::Reparent(wxWindowBase *parent) ::SetParent(hWndChild, hWndParent); +#ifndef __WXWINCE__ + if ( ::GetWindowLong(hWndChild, GWL_EXSTYLE) & WS_EX_CONTROLPARENT ) + { + EnsureParentHasControlParentStyle(GetParent()); + } +#endif // !__WXWINCE__ + return TRUE; } @@ -3118,9 +3157,33 @@ bool wxWindowMSW::HandleTooltipNotify(WXUINT code, // in Unicode mode this is just what we need ttText->lpszText = (wxChar *)ttip.c_str(); #else // !Unicode +/* MultiByteToWideChar(CP_ACP, 0, ttip, ttip.length()+1, (wchar_t *)ttText->szText, sizeof(ttText->szText) / sizeof(wchar_t)); +*/ + // Fix by dimitrishortcut: see patch 771772 + + // FIXME: szText has a max of 80 bytes, so limit the tooltip string + // length accordingly. Ideally lpszText should be used, but who + // would be responsible for freeing the buffer? + + // Maximum length of a tip is 39 characters. 39 is 80/2 minus 1 byte + // needed for NULL character. + size_t tipLength = wxMin(ttip.Len(), 39); + + // Convert to WideChar without adding the NULL character. The NULL + // character is added afterwards (Could have used ttip.Left(tipLength) + // and a cchMultiByte parameter of tipLength+1, but this is more + //efficient. + ::MultiByteToWideChar(CP_ACP, 0, ttip, tipLength, + (wchar_t *)ttText->szText, + sizeof(ttText->szText) / sizeof(wchar_t)); + + // Add the NULL character. + ttText->szText[tipLength*2+0] = '\0'; + ttText->szText[tipLength*2+1] = '\0'; + #endif // Unicode/!Unicode } @@ -3205,32 +3268,13 @@ bool wxWindowMSW::HandleEndSession(bool endSession, long logOff) bool wxWindowMSW::HandleCreate(WXLPCREATESTRUCT cs, bool *mayCreate) { - // if we have WS_EX_CONTROLPARENT flag we absolutely *must* set it for our - // parent as well as otherwise several Win32 functions using - // GetNextDlgTabItem() to iterate over all controls such as - // IsDialogMessage() or DefDlgProc() would enter an infinite loop: indeed, - // all of them iterate over all the controls starting from the focus and - // stop iterating when they get back to the focus but unless all parents - // have WS_EX_CONTROLPARENT bit set, they would never get back to focus + // VZ: why is this commented out for WinCE? If it doesn't support + // WS_EX_CONTROLPARENT at all it should be somehow handled globally, + // not with multiple #ifdef's! #ifndef __WXWINCE__ if ( ((CREATESTRUCT *)cs)->dwExStyle & WS_EX_CONTROLPARENT ) - { - // there is no need to do anything for the top level windows - const wxWindow *parent = GetParent(); - while ( parent && !parent->IsTopLevel() ) - { - LONG exStyle = ::GetWindowLong(GetHwndOf(parent), GWL_EXSTYLE); - if ( !(exStyle & WS_EX_CONTROLPARENT) ) - { - // force the parent to have this style - ::SetWindowLong(GetHwndOf(parent), GWL_EXSTYLE, - exStyle | WS_EX_CONTROLPARENT); - } - - parent = parent->GetParent(); - } - } -#endif + EnsureParentHasControlParentStyle(GetParent()); +#endif // !__WXWINCE__ // TODO: should generate this event from WM_NCCREATE wxWindowCreateEvent event((wxWindow *)this);