【问题标题】:Propagate wxWindows mouse events upwards向上传播 wxWindows 鼠标事件
【发布时间】:2016-04-14 17:02:02
【问题描述】:

如何安排将 wxWindows 右键单击​​鼠标事件从静态文本控件传播到父窗口?

动机:

我的 GUI 是这样的

每个框( wxPanel )代表一个“设备”,我想右键单击该框弹出一个对话框来编辑设备信息。

只要用户点击面板的背景,它就可以正常工作。如果单击落在任何文本 (wxStaticText) 上,则面板永远不会看到单击事件。由于文本覆盖了大部分设备面板,因此不能令人满意。

我知道原因是鼠标事件没有从 wxCommandEvent 继承。文档指出:默认情况下,只有 wxCommandEvent 派生的事件被设置为传播。但是我看不到如何更改默认行为,以便将右键单击事件设置为传播。似乎这应该是可能的,因为文档还说 其他事件也可以传播,因为事件处理代码使用 wxEvent::ShouldPropagate() 来检查是否应该传播事件。

也许我需要专门化 wxStaticText 类,以便它“处理”右键单击事件,并在其上调用 wxEvent::ResumePropagation( 1 )

这里是设备面板构造函数

cDevicePanel::cDevicePanel( wxWindow* parent, devicify::cDevice& device )
    : wxPanel( parent,-1,wxDefaultPosition,wxSize(200,110),wxBORDER_RAISED )
    , myDevice( device )
{
    switch( device.myMatch )
    {
    case devicify::cDevice::eMatch::OK:
        SetBackgroundColour( wxColor(120,180,255) );
        break;
    case devicify::cDevice::eMatch::noDevice:
        SetBackgroundColour( wxColor(255,180,120) );
        break;
    case devicify::cDevice::eMatch::noDetails:
        SetBackgroundColour( wxColor(255,255,0) );
        break;
    }
    myName = new wxStaticText(this,-1,device.myName,wxPoint(10,10));
    myPower = new wxStaticText(this,-1,
                               wxString::Format("Power: %f kw",myDevice.myPower),
                               wxPoint(20,30));
    myEnergy = new wxStaticText(this,-1,
                                wxString::Format("Energy: %f kwh",myDevice.myEnergy),
                                wxPoint(20,50));
    myButton = new wxButton(this,ButtonDeviceOnOff,"OFF",wxPoint(10,70),wxSize(40,20));
    Bind(wxEVT_BUTTON,&cDevicePanel::OnSwitch, this,ButtonDeviceOnOff );
    new wxButton(this,ButtonDevicePlot,"Plot",wxPoint(90,70),wxSize(40,20));
    Bind(wxEVT_BUTTON,&cDevicePanel::OnPlot, this,ButtonDevicePlot );
    Bind(wxEVT_RIGHT_UP,&cDevicePanel::OnRightClick, this );
}

【问题讨论】:

    标签: wxwidgets


    【解决方案1】:

    所有这些传播的东西都早于Bind(),甚至可能早于Connect()。现在我们有了这些,最简单的解决方案是在每个控件中绑定到您感兴趣的事件。这确实意味着您需要为所有控件执行此操作,但迭代所有子控件很简单,并且无论如何您都需要使用任何其他解决方案为所有窗口执行某些操作。

    我认为,“可以传播其他事件”是指您可以定义的自定义事件。 IE。如果您要定义一个新的事件类,您可以将m_propagationLevel 设置为wxEVENT_PROPAGATE_MAX,使其行为类似于wxCommandEvent

    【讨论】:

      【解决方案2】:

      正如 VZ 所建议的,最容易忽略传播问题并使用绑定来解决问题。

      重要:

      • 调用 bind 作为子窗口的成员

      • 将指向父窗口的指针作为参数传递给绑定

      所以,我的构造函数如下所示:

      myName = new wxStaticText(this,-1,device.myName,wxPoint(10,10));
      myName->Bind( wxEVT_RIGHT_DOWN, &cDevicePanel::OnRightClick, this );
      myPower = new wxStaticText(this,-1,
                                 wxString::Format("Power: %f kw",myDevice.myPower),
                                 wxPoint(20,30));
      myPower->Bind( wxEVT_RIGHT_DOWN, &cDevicePanel::OnRightClick, this );
      
      myEnergy = new wxStaticText(this,-1,
                                  wxString::Format("Energy: %f kwh",myDevice.myEnergy),
                                  wxPoint(20,50));
      myEnergy->Bind( wxEVT_RIGHT_DOWN, &cDevicePanel::OnRightClick, this );
      
      // right clicks on panel background
      Bind(wxEVT_RIGHT_DOWN,&cDevicePanel::OnRightClick, this );
      

      【讨论】:

        猜你喜欢
        • 2016-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多