Событие правой кнопки мыши wxTaskBarIcon не работает

0

В первый раз я пытаюсь использовать это в программе wxWidget, я не знаю, что мне не хватает, но когда я нажимаю правой кнопкой мыши на свой значок, ничего не происходит. Я попытался BEGIN_EVENT_TABLE(wxTaskBarIconBase, wxTaskBarIcon) таблицу событий, но BEGIN_EVENT_TABLE(wxTaskBarIconBase, wxTaskBarIcon) не компилируется, возможно, это не хороший класс, но я действительно не знаю, что положить.

Икон хорошо отображается, и все компилируется, но ничего не происходит в событии 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)
};
Теги:
wxwidgets

2 ответа

1

Почему вы wxTaskBarIconBase сам wxTaskBarIconBase? Это не имеет никакого смысла, это класс библиотеки, вы должны наследовать его и переопределить его виртуальный CreatePopupMenu() вместо его изменения.

Кроме того, ваш обработчик событий не связан ни с чем вообще, по крайней мере в коде, который вы показываете, поэтому вряд ли это удивительно, что он никогда не называется.

Но это не так, как вы должны использовать этот класс. Если все ваши попытки сделать это не удалось, возможно, пора взглянуть на документацию? В нем явно упоминается переопределение CreatePopupMenu(). И если он все еще недостаточно подробно, взгляните на образец панели задач.

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;
}
  • 0
    Хорошо, я понимаю этот пример, я попробовал его, он компилируется, но ничего не происходит, когда я щелкаю правой кнопкой мыши на icone. Я только что сделал несколько printf для тестирования, и я достигаю Connect () в CreateBar (), когда моя программа запускается. Но я не могу связаться с OnIconEvent (), как мне связать TaskBarIcon с событием? я очень потерян в логике событий
  • 0
    Вы пытались использовать wxEVT_COMMAND_RIGHT_CLICK вместо wxEVT_TASKBAR_RIGHT_UP
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню