LRESULT APIENTRY wxToolTipWndProc(HWND hwndTT, UINT msg, WPARAM wParam, LPARAM lParam) { if ( msg == TTM_WINDOWFROMPOINT ) { LPPOINT ppt = (LPPOINT)lParam; // the window on which event occurred HWND hwnd = ::WindowFromPoint(*ppt); OutputDebugString("TTM_WINDOWFROMPOINT: "); OutputDebugString(wxString::Format("0x%08x => ", hwnd)); // return a HWND corresponding to a wxWindow because only wxWidgets are // associated with tooltips using TTM_ADDTOOL wxWindow *win = wxGetWindowFromHWND((WXHWND)hwnd); if ( win ) { hwnd = GetHwndOf(win); OutputDebugString(wxString::Format("0x%08x\r\n", hwnd)); #if 0 // modify the point too! RECT rect; GetWindowRect(hwnd, &rect); ppt->x = (rect.right - rect.left) / 2; ppt->y = (rect.bottom - rect.top) / 2; #endif // 0 return (LRESULT)hwnd; } else { OutputDebugString("no window\r\n"); } } return ::CallWindowProc(CASTWNDPROC gs_wndprocToolTip, hwndTT, msg, wParam, lParam); }
bool wxGUIEventLoop::PreProcessMessage(WXMSG *msg) { HWND hwnd = msg->hwnd; wxWindow *wndThis = wxGetWindowFromHWND((WXHWND)hwnd); wxWindow *wnd; // this might happen if we're in a modeless dialog, or if a wx control has // children which themselves were not created by wx (i.e. wxActiveX control children) if ( !wndThis ) { while ( hwnd && (::GetWindowLong(hwnd, GWL_STYLE) & WS_CHILD )) { hwnd = ::GetParent(hwnd); // If the control has a wx parent, break and give the parent a chance // to process the window message wndThis = wxGetWindowFromHWND((WXHWND)hwnd); if (wndThis != NULL) break; } if ( !wndThis ) { // this may happen if the event occurred in a standard modeless dialog (the // only example of which I know of is the find/replace dialog) - then call // IsDialogMessage() to make TAB navigation in it work // NOTE: IsDialogMessage() just eats all the messages (i.e. returns true for // them) if we call it for the control itself return hwnd && ::IsDialogMessage(hwnd, msg) != 0; } } if ( !AllowProcessing(wndThis) ) { // not a child of critical window, so we eat the event but take care to // stop an endless stream of WM_PAINTs which would have resulted if we // didn't validate the invalidated part of the window if ( msg->message == WM_PAINT ) ::ValidateRect(hwnd, NULL); return true; } #if wxUSE_TOOLTIPS // we must relay WM_MOUSEMOVE events to the tooltip ctrl if we want it to // popup the tooltip bubbles if ( msg->message == WM_MOUSEMOVE ) { // we should do it if one of window children has an associated tooltip // (and not just if the window has a tooltip itself) if ( wndThis->HasToolTips() ) wxToolTip::RelayEvent((WXMSG *)msg); } #endif // wxUSE_TOOLTIPS // allow the window to prevent certain messages from being // translated/processed (this is currently used by wxTextCtrl to always // grab Ctrl-C/V/X, even if they are also accelerators in some parent) if ( !wndThis->MSWShouldPreProcessMessage((WXMSG *)msg) ) { return false; } // try translations first: the accelerators override everything for ( wnd = wndThis; wnd; wnd = wnd->GetParent() ) { if ( wnd->MSWTranslateMessage((WXMSG *)msg)) return true; // stop at first top level window, i.e. don't try to process the key // strokes originating in a dialog using the accelerators of the parent // frame - this doesn't make much sense if ( wnd->IsTopLevel() ) break; } // now try the other hooks (kbd navigation is handled here) for ( wnd = wndThis; wnd; wnd = wnd->GetParent() ) { if ( wnd->MSWProcessMessage((WXMSG *)msg) ) return true; // also stop at first top level window here, just as above because // if we don't do this, pressing ESC on a modal dialog shown as child // of a modal dialog with wxID_CANCEL will cause the parent dialog to // be closed, for example if ( wnd->IsTopLevel() ) break; } // no special preprocessing for this message, dispatch it normally return false; }
bool wxEventLoop::PreProcessMessage(WXMSG *msg) { HWND hwnd = msg->hwnd; wxWindow * const wndThis = wxGetWindowFromHWND((WXHWND)hwnd); wxWindow *wnd; // this may happen if the event occurred in a standard modeless dialog (the // only example of which I know of is the find/replace dialog) - then call // IsDialogMessage() to make TAB navigation in it work if ( !wndThis ) { // we need to find the dialog containing this control as // IsDialogMessage() just eats all the messages (i.e. returns true for // them) if we call it for the control itself while ( hwnd && ::GetWindowLong(hwnd, GWL_STYLE) & WS_CHILD ) { hwnd = ::GetParent(hwnd); } return hwnd && ::IsDialogMessage(hwnd, msg) != 0; } if ( !AllowProcessing(wndThis) ) { // not a child of critical window, so we eat the event but take care to // stop an endless stream of WM_PAINTs which would have resulted if we // didn't validate the invalidated part of the window if ( msg->message == WM_PAINT ) ::ValidateRect(hwnd, NULL); return true; } #if wxUSE_TOOLTIPS // we must relay WM_MOUSEMOVE events to the tooltip ctrl if we want it to // popup the tooltip bubbles if ( msg->message == WM_MOUSEMOVE ) { wxToolTip *tt = wndThis->GetToolTip(); if ( tt ) { tt->RelayEvent((WXMSG *)msg); } } #endif // wxUSE_TOOLTIPS // allow the window to prevent certain messages from being // translated/processed (this is currently used by wxTextCtrl to always // grab Ctrl-C/V/X, even if they are also accelerators in some parent) if ( !wndThis->MSWShouldPreProcessMessage((WXMSG *)msg) ) { return false; } // try translations first: the accelerators override everything for ( wnd = wndThis; wnd; wnd = wnd->GetParent() ) { if ( wnd->MSWTranslateMessage((WXMSG *)msg)) return true; // stop at first top level window, i.e. don't try to process the key // strokes originating in a dialog using the accelerators of the parent // frame - this doesn't make much sense if ( wnd->IsTopLevel() ) break; } // now try the other hooks (kbd navigation is handled here) for ( wnd = wndThis; wnd; wnd = wnd->GetParent() ) { if (wnd != wndThis) // Skip the first since wndThis->MSWProcessMessage() was called above { if ( wnd->MSWProcessMessage((WXMSG *)msg) ) return true; } // Stop at first top level window (as per comment above). // If we don't do this, pressing ESC on a modal dialog shown as child of a modal // dialog with wxID_CANCEL will cause the parent dialog to be closed, for example if (wnd->IsTopLevel()) break; } // no special preprocessing for this message, dispatch it normally return false; }