我第一次尝试在wxWidget程序中使用它时,我不知道我错过了什么,但是当我右键单击我的图标时,没有任何反应。
我试图开始一个事件表,但BEGIN_EVENT_TABLE(wxTaskBarIconBase, wxTaskBarIcon)
没有编译,它可能不是一个好的类,但我真的不知道该放什么。
icone显示良好,一切都编译完成,但RightClickDown事件中没有任何事情发生..
这里是我的代码(不完全是所需的部分,同样适用于.h)
.cpp:
#include <wx/taskbar.h>
#include<wx/menu.h>
wxTaskBarIcon* mataskBarIcon = new wxTaskBarIcon();
wxMenu* monMenu = new wxMenu(wxString::FromUTF8("Imthemenu"));
wxIcon icon;
icon.LoadFile(wxString::FromUTF8("myicone.gif"), wxBITMAP_TYPE_GIF);
mataskBarIcon->SetIcon(icon, wxString::FromUTF8("ImtheIcone"));
void wxTaskBarIconBase::OnRightButtonDown(wxTaskBarIconEvent& event)
{
printf("test\n");
mataskBarIcon->CreatePopupMenu();
mataskBarIcon->PopupMenu(monMenu);
}
wx / taskbar.h:
class WXDLLIMPEXP_ADV wxTaskBarIconBase : public wxEvtHandler
{
public:
wxTaskBarIconBase() { }
// Operations:
virtual bool SetIcon(const wxIcon& icon,
const wxString& tooltip = wxEmptyString) = 0;
virtual bool RemoveIcon() = 0;
virtual bool PopupMenu(wxMenu *menu) = 0;
protected:
// creates menu to be displayed when user clicks on the icon
virtual wxMenu *CreatePopupMenu() { return NULL; }
private:
// default events handling, calls CreatePopupMenu:
void OnRightButtonDown(wxTaskBarIconEvent& event);
DECLARE_EVENT_TABLE()
DECLARE_NO_COPY_CLASS(wxTaskBarIconBase)
};
答案 0 :(得分:1)
为什么要更改wxTaskBarIconBase
本身?这没有任何意义,它是一个库类,你应该继承它并覆盖它的虚拟CreatePopupMenu()
方法,而不是改变它。
此外,您的事件处理程序根本没有连接到任何内容,至少在您显示的代码中,因此从未调用过它也就不足为奇了。
但这不是你应该如何使用这个类。如果你所做的所有努力都失败了,或许是时候看看the documentation了?它明确提到压倒一切CreatePopupMenu()
。如果它仍然不够详细,请查看taskbar sample。
答案 1 :(得分:0)
首先,您不应该更改wxTaskBarIconBase代码。要么继承它,要么创建一个自定义的wxEvtHandler来处理事件。
其次,我无法真正帮助DECLARE_EVENT_TABLE
。语法很重,不允许动态事件处理。在我看来,你应该避免它。我的建议是使用Connect
。以下是示例:
class TaskBarHandler :
public ::wxEvtHandler
{
public:
void OnIconEvent(wxEvent& the_event)
{
wxEventType const type = the_event.GetEventType();
if (type == wxEVT_TASKBAR_RIGHT_UP)
{
// DO SOMETHING HERE
}
}
};
void CreateBar()
{
wxTaskBarIcon* bar = new wxTaskBarIcon();
TaskBarHandler* handler = new TaskBarHandler();
handler->Connect(
wxID_ANY,
wxEVT_TASKBAR_RIGHT_UP,
(wxObjectEventFunction) (&TaskBarHandler::OnIconEvent ),
(wxObject*)NULL,
handler);
// later
delete handler;
}