}
}
+// 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
// ---------------------------------------------------------------------------
::SetParent(hWndChild, hWndParent);
+#ifndef __WXWINCE__
+ if ( ::GetWindowLong(hWndChild, GWL_EXSTYLE) & WS_EX_CONTROLPARENT )
+ {
+ EnsureParentHasControlParentStyle(GetParent());
+ }
+#endif // !__WXWINCE__
+
return TRUE;
}
// 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
}
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);