Infotext bei wxButton



  • Hallo zusammen

    Ich habe mal eine Frage zu wxWidgets.

    Ist es möglich ,bei einem "wxButton" Objekt einen Infotext anzeigen zulassen, oder einen Text in der Statusbar anzeigen zu lassen, wenn der Cursor den Button berührt (nicht anklicken) ?



  • Klar geht das:

    http://docs.wxwidgets.org/3.0.1/classwx_mouse_event.html

    EVT_ENTER_WINDOW(func):
    Process a wxEVT_ENTER_WINDOW event.

    Ein Button ist ja auch nur ein Window im Prinzip.
    edit: Damit das richtig funktioniert, eine eigene Klasse von wxButton ableiten und das Event dort abfangen.
    GROBER CODE:

    class MyButton : public wxButton
    {
       DECLARE_EVENT_TABLE();
    
    public:
       wxButton(const wxString& caption);
       virtual ~wxButton();
    
       void OnMouseEnter(wxMouseEvent&);
       void OnMouseLeave(wxMouseEvent&);
    };
    
    BEGIN_EVENT_TABLE(wxButton, MyButton)
       EVT_ENTER_WINDOW(MyButton:OnMouseEnter)
       EVT_LEAVE_WINDOW(MyButton::OnMouseLeave)
    END_EVENT_TABLE();
    

    Ich hab das jetzt nicht getestet, aber auf die weise solltest du nur ein Event erhalten wenn jemand den Zeiger über den entsprechenden Button fährt oder den Button mit der Maus verlässt. -- ende edit.

    Oder Tooltips verwenden:

    http://docs.wxwidgets.org/trunk/classwx_window.html#a81a9fb74e3c6c7f4416e882f5e589b8c

    wxButton ist von wxWindow abgeleitet, daher funzt das auch in wxButton.
    Am Ende musst du entscheiden welche der beiden Methoden du verwenden willst.



  • Diese Klasse kann man logischerweise für alle Button verwenden, oder?



  • Sebastian Müller schrieb:

    Diese Klasse kann man logischerweise für alle Button verwenden, oder?

    Ja, für alle wxButtons halt.

    Hab das übrigens gerade mal getestet weil mir langweilig war und es funktioniert so einwandfrei.
    Kompletter Code:

    #include <wx/wx.h>
    
    class MyButton : public wxButton
    {
    private: 
        DECLARE_EVENT_TABLE();
    
    public:
        MyButton(wxWindow* parent, int id, const wxString& caption, wxStatusBar* bar)
            : wxButton(parent, id, caption), m_bar(bar)
        {
    
        }
    
        void OnMouseEnter(wxMouseEvent&)
        {
            m_bar->SetStatusText("Mouse inside button");
        }
    
        void OnMouseLeave(wxMouseEvent&)
        {
            m_bar->SetStatusText("Mouse outside button");
        }
    
    private:
        wxStatusBar* m_bar;
    };
    
    BEGIN_EVENT_TABLE(MyButton, wxButton)
        EVT_ENTER_WINDOW(MyButton::OnMouseEnter)
        EVT_LEAVE_WINDOW(MyButton::OnMouseLeave)
    END_EVENT_TABLE()
    
    class Application : public wxApp
    {
    public:
        Application()
        {
    
        }
    
        virtual ~Application()
        {
    
        }
    
        virtual bool OnInit()
        {
            wxFrame* f = new wxFrame(NULL, -1, "Hello Button");
            SetTopWindow(f);
            wxStatusBar* b = f->CreateStatusBar();
            new MyButton(f, 1, "Test", b);
            f->Show();
            return true;
        }
    };
    
    IMPLEMENT_APP(Application);
    


  • Supper. Funktioniert sehr gut. Danke

    Kann man auch die Nachricht abfrage, ob die Maus den Button nun nicht mehr berührt?

    So kann man den Text in der Statusbar wieder löschen.



  • Achso. das habe ich übersehen

    dafür ist EVT_ENTER_WINDOW zuständig.



  • Sebastian Müller schrieb:

    Achso. das habe ich übersehen

    dafür ist EVT_ENTER_WINDOW zuständig.

    Ne, EVT_LEAVE_WINDOW. 😛



  • ja. 😃

    wie auch immer.


Log in to reply