如何安排将wxWindows右键单击鼠标事件传播到静态文本控件的父窗口?
动机:
我的GUI看起来像这样
每个框(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 );
}
答案 0 :(得分:1)
所有这些传播内容早于Bind()
,甚至可能Connect()
。现在我们有了这些,最简单的解决方案是绑定到您在每个控件中感兴趣的事件。它确实意味着您需要为所有控件执行此操作,但是迭代所有子项很简单,无论如何,您需要使用任何其他解决方案为所有窗口执行某些操作。
我认为“其他事件可以传播”是指您可以定义的自定义事件。即如果您要定义新的事件类,则可以将m_propagationLevel
设置为wxEVENT_PROPAGATE_MAX
,以使其表现为wxCommandEvent
。
答案 1 :(得分:0)
正如VZ建议的那样,最容易忽略传播问题并使用bind解决问题。
重要的:
将绑定作为子窗口的成员进行调用
将指向父窗口的指针作为参数进行绑定
所以,我的构造函数看起来像这样:
countdown