Kontextmenü funktioniert nicht richtig



  • Hallo.

    Ich lerne gerade C++.

    Ich weiss nicht warum mein Kontextmenü nicht so will, wie ich es will.
    Ich programmiere mit "wxDev-C++ 7.0 RC4". Das Kontextmenü ist zwar da, aber die Farbe ändert sich nicht wie ich´s mag.

    Kann sich das bitte mal jemand ansehen und mir schreiben was da nicht stimmt?

    Meine "Projekt1Frm.cpp":

    #include "Projekt1Frm.h"
    
    ////Event Table Start
    BEGIN_EVENT_TABLE(Projekt1Frm,wxFrame)
    	////Manual Code Start
    	////Manual Code End
    
    	EVT_CLOSE(Projekt1Frm::OnClose)
    	EVT_MOTION(Projekt1Frm::OnMouseMove)
    	EVT_LEFT_DOWN(Projekt1Frm::Projekt1FrmLeftDown)
    	EVT_LEFT_UP(Projekt1Frm::Projekt1FrmLeftUp)
    	EVT_RIGHT_DOWN(Projekt1Frm::Projekt1FrmRightDown)
    	EVT_PAINT(Projekt1Frm::Projekt1FrmPaint)
    	EVT_MENU(1,Projekt1Frm::OnMenuSelect)
    	EVT_MENU(2,Projekt1Frm::OnMenuSelect)
    END_EVENT_TABLE()
    ////Event Table End
    
    Projekt1Frm::Projekt1Frm(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style)
    : wxFrame(parent, id, title, position, size, style)
    {
    	CreateGUIControls();
    	x1 = 10, x2 = 45, x3 = 66, x4 = 166;
    	y1 = 123, y2 = 13, y3 = 44, y4 = 100;
    	farbe = wxBLACK;
    }
    
    /*
     * Projekt1FrmPaint
     */
    void Projekt1Frm::Projekt1FrmPaint(wxPaintEvent& event)
    {
    	wxPaintDC dc(this);
    
    	dc.SetPen(wxPen(*farbe));
    	dc.DrawLine(x1, y1, x2, y2);
    	dc.DrawLine(x2, y2, x3, y3);
    	dc.DrawLine(x3, y3, x4, y4);
    	dc.DrawLine(x4, y4, x1, y1);
    }
    
    void Projekt1Frm::Projekt1FrmRightDown(wxMouseEvent& event)
    {
    	CreateContext(event.GetX(), event.GetY());
    }
    
    void Projekt1Frm::CreateContext(int x, int y)
    {
    	wxMenu* cmenu = new wxMenu;
    	(*cmenu).Append(1, "ROT");
    	(*cmenu).Append(2, "BLAU");
    	PopupMenu(cmenu, x, y);
    
    }
    
    void Projekt1Frm::OnMenuSelect(wxCommandEvent& e)
    {
    		switch (e.GetInt())
    			{
    				case 1: farbe = wxRED;
    						break;
    				case 2: farbe = wxBLUE;
    			}
    			Refresh();
    }
    

    Meine "Projekt1Frm.h":

    #ifndef __PROJEKT1FRM_h__
    #define __PROJEKT1FRM_h__
    
    #ifdef __BORLANDC__
    	#pragma hdrstop
    #endif
    
    #ifndef WX_PRECOMP
    	#include <wx/wx.h>
    	#include <wx/frame.h>
    #else
    	#include <wx/wxprec.h>
    #endif
    
    ////Dialog Style Start
    #undef Projekt1Frm_STYLE
    #define Projekt1Frm_STYLE wxCAPTION | wxSYSTEM_MENU | wxMINIMIZE_BOX | wxCLOSE_BOX
    ////Dialog Style End
    
    class Projekt1Frm : public wxFrame
    {
    	private:
    		DECLARE_EVENT_TABLE();
    
    	public:
    		Projekt1Frm(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("Projekt1"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = Projekt1Frm_STYLE);
    		virtual ~Projekt1Frm();
    		void Projekt1FrmPaint(wxPaintEvent& event);
    		void OnMouseMove(wxMouseEvent& e);
    		int x1, x2, x3, x4, y1, y2, y3, y4;
    
    		bool dragging;
    		int index;
    		void Projekt1FrmLeftDown(wxMouseEvent& event);
    		void Projekt1FrmLeftUp(wxMouseEvent& event);
    		void Projekt1FrmRightDown(wxMouseEvent& event);
    		void CreateContext(int x, int y);
    		void OnMenuSelect(wxCommandEvent& e);
    
    		wxColour const* farbe;
    
    	private:
    		void OnClose(wxCloseEvent& event);
    		void CreateGUIControls();
    };
    
    #endif
    


  • Falsches Forum, da kein Iso-C++.

    C++ kennt keine GUIs! Was du da hast ist irgendeine Third-Party-Bibliothek.



  • Dieser Thread wurde von Moderator/in Phoemuex aus dem Forum C++ in das Forum Andere GUIs - Qt, GTK+, wxWidgets verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Hm, bitte poste nur den Code der dein Problem betrifft. ~230 Zeilen sind definitiv zu viel.

    Wird dein Handler überhaupt aufgerufen?
    Und ich würde dir zu einer anderen IDE raten.
    Code::Blocks passt eigentlich ganz gut, wenn du wxWidgets verwendest.



  • Habe den Code gekürzt, ich weiss aber nicht woran es liegt, deswegen hab ich das nun so gelassen damit ich nicht den Fehler mit rauslösche.

    Also Kontextmenü kommt noch aber wenn ich auf RED oder BLUE klicke passiert nichts. Eigentlich sollte sich die Farbe ändern.

    Ich probiere Code::Blocks später mal. Danke für den Hinweis.
    Habe auch schon wo anders gehört, dass wxDevC++ nicht so toll ist.

    Wie genau meinst du das mit dem Handler?


  • Mod

    Deine OnMenuSelect Methode. Wird die überhaupt aufgerufen?



  • Wie genau kann ich das feststellen ob sie aufgerufen wird?

    Da sollte es ja dann zur Farbauswahl kommen, aber es wird nichts gewählt. Es bleibt ja alles so wie´s ist.



  • Digisven schrieb:

    Wie genau kann ich das feststellen ob sie aufgerufen wird?

    mach dort ne Ausgabe



  • Hab es mit einem "Destroy();" gemacht. Wenn ich nun das Kontextmenü öffne und dann auf RED oder BLUE klicke geht das Programm wie geplant zu. Also wird es wohl aufgerufen.


  • Mod

    Dann enthält der Wert von GetInt wohl was anderes, als die ID.



  • Ja das ist dann wohl so. 😕 Ich weiss aber nicht wie´s nu richtig auszusehen hat... ich krieg noch nen Krampf...


  • Mod

    Versuchs mal mit GetId();



  • Hey DANKE SEHR! Das klappt. 🙂


Anmelden zum Antworten