wxTaskBarIcon右键单击事件无效

时间:2014-07-22 07:45:27

标签: c++ windows wxwidgets

我第一次尝试在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)
};

2 个答案:

答案 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;
}
相关问题