【发布时间】: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