向上传播wxWindows鼠标事件

时间:2016-04-14 17:02:02

标签: wxwidgets

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

动机:

我的GUI看起来像这样

enter image description here

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

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

我理解原因是鼠标事件不会从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 );
}

2 个答案:

答案 0 :(得分:1)

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

我认为“其他事件可以传播”是指您可以定义的自定义事件。即如果您要定义新的事件类,则可以将m_propagationLevel设置为wxEVENT_PROPAGATE_MAX,以使其表现为wxCommandEvent

答案 1 :(得分:0)

正如VZ建议的那样,最容易忽略传播问题并使用bind解决问题。

重要的:

  • 将绑定作为子窗口的成员进行调用

  • 将指向父窗口的指针作为参数进行绑定

所以,我的构造函数看起来像这样:

countdown