Brauche ein Kontextmenu



  • Guten Abend.
    Ich habe ein Dialogbasierendes MFC Programm geschrieben in dem sich zwei Buttons und ein Text-Steuerelement befinden.
    Ich habe dem Dialogfenster ein Kontextmenu hinzugefügt.
    Wenn ich innerhalb des Dialogfensters einen Linksklick mache erscheint wie es soll ein Kontextmenu.
    Es erscheint aber nicht wenn sich der Maus-Cursor über dem Text-Steuerelement befindet.
    Ich wollte mit dem Klassenassistenten dem Text-Steuerelement die WM_CONTEXTMENU
    Nachricht zuordnen aber die erscheit dort nicht.
    Das Textelement kann nur die Nachricht BN_CLICKED empfangen.
    Wie kriege ich das Text-Steuerelement dazu das es auf die Recht Maustaste reagiert
    Und ein Kontextmenu öffnet.
    Wenn ich dem Text-Element eine WM_RBUTTONDOWN Nachricht schicken könnte wäre das mit dem Kontextmenu gar kein Problem aber wie gesagt der Klassenassistenten bietet mir nur die BN_CLICKED Nachricht

    cebion

    .



  • Hat sich erledigt.
    Ich habe in meinem Quelltext ein pWnd->DestroyWindow(); übersehen.
    Nachdem ich es rausgenommen habe funktioniert das Kontextmenu auch über dem Text-Steuerelement.
    Aber was wäre wenn ich nur dem Text-Steuerelement ein Kontextmenu geben will.
    Könnte ich dem Text-Steuerelement die BN_CLICKED Nachricht senden und in dieser
    Methode dann die Mausposition in Erfahrung bringen um an dieser Stelle das Kontextmenu zu zeichnen. Ich müsste noch unterscheiden können ob die linke oder rechte Maustaste gedrückt wurde.

    cebion



  • wenn du dem Text-Steuerelement ein eigenes Kontextmenu verpassen willst ist es ratsam diesem eine eigene classe zu widmen.

    die neue classe leitest du zB von CEdit ab und erstellst in der "CNewEdit" ein eine neue Kontextmenufunction. die einzelnen befehle kannst du dann entweder in der neuen classe verarbeiten oder aber du schickst sie via SendMessage(...)
    an den Hauptdialog.

    LowFly



  • Hallo LowFly.
    Das hört sich sehr interesant an was du da schreibst aber ich bin in Sachen
    C++ noch ein neuling.
    Du schreibst : "Text-Steuerelement ... eine eigene classe zu widmen." und
    "die neue classe leitest du zB von CEdit ab". Das verstehe ich nicht.
    Sollte die "eigene classe" nicht irgendwie von dem Text-Steuerelement erben(ableiten)?

    Ein kleines Beispiel würde mich sehr interesieren.

    cebion



  • also wenn du im Arbeitsbereich Resourcen dir auf deinem dialog ein Textfeld erstellst dann in den Klassenassi gehst und das gerade erstellte Textfeld (IDC_EDIT1) mit einer Membervariable verknüpfst dann kannst du (in dem Dialog) unterhab wo du den Variablenname eingibst die Kategorie der Variable einstellen. (Wert o. Control)

    Wert leitet die variable von der classe CString ab somit kannst du die Variable mit den CString Functionen bearbeiten.

    Control leitet die variable von der Classe CEdit ab somit kannst du die variable mit den CEdit Functionen bearbeiten.

    in beiden fällen aber hast du keine möglichkeit functionen der bereitgestellten classen zu manipulieren.

    erstell dir nun mal eine Variable der Kategorie Control und gib ihr den namen zB m_ctrlEdit1.

    in der headerdatei deines dialoges solltest du nun unter AFX_DATA folgendes finden

    //{{AFX_DATA(C*Dlg)
    enum { IDD = IDD_*_DIALOG };
    [b]CEdit	m_ctrlEdit1;[/b]
    //}}AFX_DATA
    

    Geh jetzt mal in der Menuleiste des MFC auf Einfügen/Neu Klasse...
    im sich darauf öffnenden dialog läst du den klassentyp auf MFC-Klasse
    im Gruppenfeld Klasseninformationen trägst du unter
    Name: CNewEdit ein & unter
    Basisklasse: wählst du CEdit aus
    dann drückst du OK

    Jetzt hast du im Arbeitsbereich Dateien eine neue Datei names NewEdit.cpp / NewEdit.h die die Klasse CNewEdit beinhaltet. geh in dei NewEdit.cpp und kopier dir
    #include "NewEdit.h"
    und füge das in die Headerdatei deines hauptdialoges oberhalb der classendeklaration
    class C*Dlg : public CDialog
    ein

    jetzt kannst du entweder manuell die classe ändern von der die Variable m_ctrlEdit1 abgeleitet wird indem du CEdit durch CNewEdit erstetzt.

    oder aber du gehst in den klassenassi und löscht dort die variable m_ctrlEdit1 & erstellst für (IDC_EDIT1) wieder eine neue Variable m_ctrlEdit1 der Kategorie Control diesmal wählst du aber beim Vatriablentyp nicht die klasse CEdit sondern CNewEdit aus und drückst Ok.

    in beiden fällen hast du dir jetzt die möglichkeit geschaffen auf die Funktionen der klasse CEdit einfluss zu nehmen. da die Classe CNewEdit von CEdit abgeleitet wird.

    Wenn du jetzt hergehst und im klassenassi die classe CNewEdit wählst kannst du dort eine neues kontextmenu für das Textfeld erstellen das völlig andere funktionen hat als das kontextmenu im hauptdialog. Geht natürlich auch mit allen anderen funktionen die du von der CEdit überschreiben willst.

    LowFly



  • Hallo LowFly.
    Echt gut was du mir da schreibst.
    Das muss ich ausprobieren und werde ich mir merken.

    Vielen Dank für die Mühe.

    cebion


Anmelden zum Antworten