popupcmn.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 573 行 · 第 1/2 页
CPP
573 行
#ifdef __WXX11__
if (!show)
{
XUngrabPointer( wxGlobalDisplay(), CurrentTime );
}
#endif
#ifdef __WXMSW__
if (!show && m_child && m_child->HasCapture())
{
m_child->ReleaseMouse();
}
#endif
bool ret = wxPopupWindow::Show( show );
#ifdef __WXGTK__
if (show)
{
gtk_grab_add( m_widget );
gdk_pointer_grab( m_widget->window, TRUE,
(GdkEventMask)
(GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK |
GDK_POINTER_MOTION_HINT_MASK |
GDK_POINTER_MOTION_MASK),
(GdkWindow *) NULL,
(GdkCursor *) NULL,
(guint32)GDK_CURRENT_TIME );
}
#endif
#ifdef __WXX11__
if (show)
{
Window xwindow = (Window) m_clientWindow;
/* int res =*/ XGrabPointer(wxGlobalDisplay(), xwindow,
True,
ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask,
GrabModeAsync,
GrabModeAsync,
None,
None,
CurrentTime );
}
#endif
#ifdef __WXMSW__
if (show && m_child)
{
// Assume that the mouse is outside the popup to begin with
m_child->CaptureMouse();
}
#endif
return ret;
}
void wxPopupTransientWindow::Dismiss()
{
Hide();
PopHandlers();
}
void wxPopupTransientWindow::DismissAndNotify()
{
Dismiss();
OnDismiss();
}
void wxPopupTransientWindow::OnDismiss()
{
// nothing to do here - but it may be interesting for derived class
}
bool wxPopupTransientWindow::ProcessLeftDown(wxMouseEvent& WXUNUSED(event))
{
// no special processing here
return false;
}
#ifdef __WXMSW__
void wxPopupTransientWindow::OnIdle(wxIdleEvent& event)
{
event.Skip();
if (IsShown() && m_child)
{
wxPoint pos = ScreenToClient(wxGetMousePosition());
wxRect rect(GetSize());
if ( rect.Inside(pos) )
{
if ( m_child->HasCapture() )
{
m_child->ReleaseMouse();
}
}
else
{
if ( !m_child->HasCapture() )
{
m_child->CaptureMouse();
}
}
}
}
#endif
#if wxUSE_COMBOBOX && defined(__WXUNIVERSAL__)
// ----------------------------------------------------------------------------
// wxPopupComboWindow
// ----------------------------------------------------------------------------
BEGIN_EVENT_TABLE(wxPopupComboWindow, wxPopupTransientWindow)
EVT_KEY_DOWN(wxPopupComboWindow::OnKeyDown)
END_EVENT_TABLE()
wxPopupComboWindow::wxPopupComboWindow(wxComboControl *parent)
: wxPopupTransientWindow(parent)
{
m_combo = parent;
}
bool wxPopupComboWindow::Create(wxComboControl *parent)
{
m_combo = parent;
return wxPopupWindow::Create(parent);
}
void wxPopupComboWindow::PositionNearCombo()
{
// the origin point must be in screen coords
wxPoint ptOrigin = m_combo->ClientToScreen(wxPoint(0,0));
#if 0 //def __WXUNIVERSAL__
// account for the fact that (0, 0) is not the top left corner of the
// window: there is also the border
wxRect rectBorders = m_combo->GetRenderer()->
GetBorderDimensions(m_combo->GetBorder());
ptOrigin.x -= rectBorders.x;
ptOrigin.y -= rectBorders.y;
#endif // __WXUNIVERSAL__
// position below or above the combobox: the width is 0 to put it exactly
// below us, not to the left or to the right
Position(ptOrigin, wxSize(0, m_combo->GetSize().y));
}
void wxPopupComboWindow::OnDismiss()
{
m_combo->OnDismiss();
}
void wxPopupComboWindow::OnKeyDown(wxKeyEvent& event)
{
m_combo->ProcessEvent(event);
}
#endif // wxUSE_COMBOBOX && defined(__WXUNIVERSAL__)
// ----------------------------------------------------------------------------
// wxPopupWindowHandler
// ----------------------------------------------------------------------------
void wxPopupWindowHandler::OnLeftDown(wxMouseEvent& event)
{
// let the window have it first (we're the first event handler in the chain
// of handlers for this window)
if ( m_popup->ProcessLeftDown(event) )
{
return;
}
wxPoint pos = event.GetPosition();
// scrollbar on which the click occurred
wxWindow *sbar = NULL;
wxWindow *win = (wxWindow *)event.GetEventObject();
switch ( win->HitTest(pos.x, pos.y) )
{
case wxHT_WINDOW_OUTSIDE:
{
// do the coords translation now as after DismissAndNotify()
// m_popup may be destroyed
wxMouseEvent event2(event);
m_popup->ClientToScreen(&event2.m_x, &event2.m_y);
// clicking outside a popup dismisses it
m_popup->DismissAndNotify();
// dismissing a tooltip shouldn't waste a click, i.e. you
// should be able to dismiss it and press the button with the
// same click, so repost this event to the window beneath us
wxWindow *win = wxFindWindowAtPoint(event2.GetPosition());
if ( win )
{
// translate the event coords to the ones of the window
// which is going to get the event
win->ScreenToClient(&event2.m_x, &event2.m_y);
event2.SetEventObject(win);
wxPostEvent(win, event2);
}
}
break;
#ifdef __WXUNIVERSAL__
case wxHT_WINDOW_HORZ_SCROLLBAR:
sbar = win->GetScrollbar(wxHORIZONTAL);
break;
case wxHT_WINDOW_VERT_SCROLLBAR:
sbar = win->GetScrollbar(wxVERTICAL);
break;
#endif
default:
// forgot to update the switch after adding a new hit test code?
wxFAIL_MSG( _T("unexpected HitTest() return value") );
// fall through
case wxHT_WINDOW_CORNER:
// don't actually know if this one is good for anything, but let it
// pass just in case
case wxHT_WINDOW_INSIDE:
// let the normal processing take place
event.Skip();
break;
}
if ( sbar )
{
// translate the event coordinates to the scrollbar ones
pos = sbar->ScreenToClient(win->ClientToScreen(pos));
// and give the event to it
wxMouseEvent event2 = event;
event2.m_x = pos.x;
event2.m_y = pos.y;
(void)sbar->GetEventHandler()->ProcessEvent(event2);
}
}
// ----------------------------------------------------------------------------
// wxPopupFocusHandler
// ----------------------------------------------------------------------------
void wxPopupFocusHandler::OnKillFocus(wxFocusEvent& event)
{
// when we lose focus we always disappear - unless it goes to the popup (in
// which case we don't really lose it)
wxWindow *win = event.GetWindow();
while ( win )
{
if ( win == m_popup )
return;
win = win->GetParent();
}
m_popup->DismissAndNotify();
}
void wxPopupFocusHandler::OnKeyDown(wxKeyEvent& event)
{
// let the window have it first, it might process the keys
if ( !m_popup->ProcessEvent(event) )
{
// by default, dismiss the popup
m_popup->DismissAndNotify();
}
}
#endif // wxUSE_POPUPWIN
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?