В первый раз я пытаюсь использовать это в программе 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)
};
Почему вы wxTaskBarIconBase
сам wxTaskBarIconBase
? Это не имеет никакого смысла, это класс библиотеки, вы должны наследовать его и переопределить его виртуальный CreatePopupMenu()
вместо его изменения.
Кроме того, ваш обработчик событий не связан ни с чем вообще, по крайней мере в коде, который вы показываете, поэтому вряд ли это удивительно, что он никогда не называется.
Но это не так, как вы должны использовать этот класс. Если все ваши попытки сделать это не удалось, возможно, пора взглянуть на документацию? В нем явно упоминается переопределение CreatePopupMenu()
. И если он все еще недостаточно подробно, взгляните на образец панели задач.
Во-первых, вы НЕ ДОЛЖНЫ изменять код 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;
}
wxEVT_COMMAND_RIGHT_CLICK
вместоwxEVT_TASKBAR_RIGHT_UP