[erledigt] wxTaskBarIcon -> Events werden ignoriert.....



  • Hey Leute,

    hoffe ich bin hier richtig.
    Ich versuche mich zur Zeit an wxWidgets und bin bisher sehr begeistert. Bei einem meiner Projekte will ich das Fenster nach dem Minimieren in den Tray haben. Funtkioniert auch gut. Wenn ich aber auf das Tray Icon klicke, soll es sich wieder aufbauen....
    Dazu benutze ich wxTaskBarIcon. Nun mein Problem: Wenn das Fenster wieder erscheinen soll, soll man einfach nen Doppelklick draufmachen... leider funzt es nicht so-> das wxEVT_TASKBAR_LEFT_DCLICK wird iwie nicht erzeugt.
    Ich benutze Code::Blocks mit wxWidgets 2.8

    Hier nun mein Ansatz:

    die Frameklasse enthält im Privaten:
    wxTaskBarIcon* tbi;

    Dann passiert folgendes:

    //Konstruktor
    
    tbi = new wxTaskBarIcon();
    
    Connect(wxID_ANY,wxEVT_TASKBAR_LEFT_DCLICK,(wxObjectEventFunction)&MainFrame::OnTaskBar);
    
    //die zugehörige Funktion
    
    void MainFrame::OnTaskBar(wxTaskBarIconEvent& event)
    {
        this->Show(true);
    }
    

    Mache ich nun den Doppelklick auf das Icon im Tray, passiert nichts...
    Habe auch schon das ganze im Event Table probiert und die virtuelle CreateMenu Funktion belegt aber bisher erfolglos...

    Wieso wird das Fenster nicht wieder maximiert?

    Danke schon mal im voraus.



  • Du musst eine Klasse erstellen, die davon ableitet. Und das Eventhandling muss in Deiner Taskbar-Klasse stattfinden, nicht im Frame. Sonst funktioniert das nicht.

    #include <wx/wx.h>
    #include <msvc/wx/setup.h>
    #include <wx/taskbar.h>
    #include "wxwin32x32.xpm"
    
    class MyTaskBarIcon : public wxTaskBarIcon
    {
    public:
    	MyTaskBarIcon(wxWindow* p)
    		: m_parent(p)
    	{
    		Connect(-1, wxEVT_TASKBAR_LEFT_DCLICK, (wxObjectEventFunction)&MyTaskBarIcon::OnTaskBarDblClick);
    	}
    
    protected:
    	void OnTaskBarDblClick(wxTaskBarIconEvent& e)
    	{
    		m_parent->Show(!m_parent->IsShown());
    	}
    
    private:
    	wxWindow* m_parent;
    };
    
    class MainFrame : public wxFrame
    {
    public:
    	MainFrame()
    		: wxFrame(NULL, -1, "Hello World")
    	{
    		m_taskbar = new MyTaskBarIcon(this);
    		wxIcon mondrian(wxwin32x32_xpm);
    		m_taskbar->SetIcon(mondrian, "MyWxApp");
    		if ( !m_taskbar->IsOk() )
    		{
    			wxMessageBox("Taskbar not ok");
    		}
    	}
    
    	virtual ~MainFrame()
    	{
    		m_taskbar->RemoveIcon();
    		delete m_taskbar;
    	}
    
    private:
    	MyTaskBarIcon* m_taskbar;
    };
    
    class MySampleApp : public wxApp
    {
    	virtual bool OnInit()
    	{
    		MainFrame* f = new MainFrame();
    		f->Show(true);
    		this->SetTopWindow(f);
    		return true;
    	}
    };
    
    IMPLEMENT_APP(MySampleApp);
    

    Hier ein minimales sample das ich eben zusammengezimmert habe für Dich ;).
    rya.



  • Klappt bestens! Ich danke dir 👍


Anmelden zum Antworten