Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Kontextmenü Einträge enabeln/disabeln

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
18.07.2005, 12:29 Uhr
GuenniAtWork



Mahlzeit,

Ich bekomme es einfach nicht hin die Einträge in meinem Kontextmenü zu aktivieren/deaktivieren. Habs auch schon mit ON_COMMAND_UI versucht, aber das Programm führt die Funktion gar nicht aus. Bei den Einträgen in meiner Menüleiste hat das wunderbar geklapt. mit EnableMenuItem hab ich es auch schon versucht. Cer code wird zwar ausgeführt, aber es passiert nichts.
--
Gruß GuenniAtWork

Dieser Post wurde am 18.07.2005 um 12:29 Uhr von GuenniAtWork editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.07.2005, 12:51 Uhr
Tommix



Hallo,
EnableMenuItem ist durchaus richtig. Achte darauf, daß Du MF_GRAYED für nEnable nimmst und nicht MF_DISABLED (sonst sieht man nichts).

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.07.2005, 13:04 Uhr
GuenniAtWork



Habe MF_GRAYED und MF_DISABLED immer in Kombination benutzt.

Das hat auch nicht funktioniert.
--
Gruß GuenniAtWork
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.07.2005, 13:31 Uhr
Tommix



MF_GRAYED reicht. Wie auch immer - es sollte so klappen. Ansonsten funktioniert das Menü?

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.07.2005, 13:52 Uhr
GuenniAtWork



Ja sonst geht alles.

Hab ne seperate Klasse erstellt.

C++:
// KontextMenu.cpp : Implementierungsdatei
//

#include "stdafx.h"
#include "To-Do.h"
#include "KontextMenu.h"
#include ".\kontextmenu.h"

// CKontextMenu

IMPLEMENT_DYNAMIC(CKontextMenu, CWnd)
CKontextMenu::CKontextMenu()
{
}

CKontextMenu::~CKontextMenu()
{
}


BEGIN_MESSAGE_MAP(CKontextMenu, CWnd)
//    ON_COMMAND(ID_KONTEXTNEU, OnKontextneu)
//ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
//ON_UPDATE_COMMAND_UI(ID_EDIT_DELETE, OnUpdateEditDelete)
END_MESSAGE_MAP()

//*** CKontextMenu-Methoden
void CKontextMenu::ShowMenu(CWnd* pWnd, CPoint point)
{
    //*** Lokale Variablen deklarieren
    CMenu *m_lMenu = new CMenu(); // Zeiger auf Menü
    CPoint m_pPoint; // Kopie der Mausposition

    //*** Mausposition in lokale Variable kopieren
    m_pPoint = point;
    //*** Zeiger auf Fenstermenü holen
    m_lMenu->LoadMenu(IDR_CONTEXT);
    //*** Zeiger auf erstes Untermenü holen
    m_lMenu = m_lMenu->GetSubMenu(0);
    //*** Popup-Menü anzeigen
    m_lMenu->TrackPopupMenu(TPM_LEFTALIGN + TPM_LEFTBUTTON,
    m_pPoint.x, m_pPoint.y, pWnd, NULL);
}

//*** Menüpunkt ein/aus (funktioniert aus irgendeinem Grund nicht)
void CKontextMenu::EnableMenuEntry(int iID, bool bEnable)
{
    CMenu *m_lMenu = new CMenu(); // Zeiger auf Menü
    //*** Zeiger auf Fenstermenü holen
    m_lMenu->LoadMenu(IDR_CONTEXT);
    //*** Zeiger auf erstes Untermenü holen
    m_lMenu = m_lMenu->GetSubMenu(0);
    //*** Menüpunkt aktivieren
    if (bEnable)
        m_lMenu->EnableMenuItem(iID,MF_BYCOMMAND | MF_ENABLED);    //Menüpunkt aktiviernen
    else
        m_lMenu->EnableMenuItem(iID,MF_BYCOMMAND | MF_GRAYED | MF_DISABLED);    //Menüpunkt deaktivieren
}



Habe auch versucht MF_BYPOSITION, auch nichts.

Der Aufruf sieht so aus:

C++:
//*** Rechtsklick auf Liste (Kontextmenü)
void CToDoView::OnContextMenu(CWnd* pWnd, CPoint point)
{
    //*** Referenz auf die Liste
    CListCtrl& ToDoList = GetListCtrl();
    //*** Kontextmenüvariable anlegen
    CKontextMenu KontextMenu;
    //*** Kontextmenü anzeigen
    KontextMenu.ShowMenu(this,point);
    
    //*** zum Testen
    KontextMenu.EnableMenuEntry(ID_KONTEXT_BEARBEITEN,FALSE);
}


--
Gruß GuenniAtWork

Dieser Post wurde am 18.07.2005 um 13:56 Uhr von GuenniAtWork editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.07.2005, 14:16 Uhr
Tommix



Ahhh...
Wenn Du in EnableMenuEntry jedesmal ein neues Menü erzeugst, kann ShowMenu nichts von Enabled und Disabled wissen. Außerdem fehlt das delete und es müßte auch

C++:
CMenu *m_lMenu = new CMenu; // ohne Klammern


heißen, obwohl es keinen Grund gibt, nicht einfach eine normale Variable vom Typ CMenu zu nehmen. Die machst zum Member der Klasse, machst das Laden nur noch einmal, z.B. im Ctor und dann klappts auch mit dem disablen.

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.07.2005, 14:43 Uhr
GuenniAtWork



Danke für den Tipp.

habs jetzt so:

C++:
// KontextMenu.cpp : Implementierungsdatei
//

#include "stdafx.h"
#include "To-Do.h"
#include "KontextMenu.h"
#include ".\kontextmenu.h"

// CKontextMenu

IMPLEMENT_DYNAMIC(CKontextMenu, CWnd)
CKontextMenu::CKontextMenu()
{
    m_lMenu = new CMenu; // Zeiger auf Menü
    //*** Zeiger auf Fenstermenü holen
    m_lMenu->LoadMenu(IDR_CONTEXT);
}

CKontextMenu::~CKontextMenu()
{
    delete m_lMenu;
}


BEGIN_MESSAGE_MAP(CKontextMenu, CWnd)
//    ON_COMMAND(ID_KONTEXTNEU, OnKontextneu)
//ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
//ON_UPDATE_COMMAND_UI(ID_EDIT_DELETE, OnUpdateEditDelete)
END_MESSAGE_MAP()

//*** CKontextMenu-Methoden
void CKontextMenu::ShowMenu(CWnd* pWnd, CPoint point)
{
    CPoint m_pPoint; // Kopie der Mausposition
    //*** Mausposition in lokale Variable kopieren
    m_pPoint = point;
    //*** Zeiger auf erstes Untermenü holen
    m_lMenu = m_lMenu->GetSubMenu(0);
    //*** Popup-Menü anzeigen
    m_lMenu->TrackPopupMenu(TPM_LEFTALIGN + TPM_LEFTBUTTON,
    m_pPoint.x, m_pPoint.y, pWnd, NULL);
    //*** zum Testen
    EnableMenuEntry(ID_KONTEXT_BEARBEITEN,FALSE);
}

//*** Menüpunkt ein/aus
void CKontextMenu::EnableMenuEntry(int iID, bool bEnable)
{
    m_lMenu = m_lMenu->GetSubMenu(0);
    ASSERT(m_lMenu);
    //*** Menüpunkt aktivieren
    if (bEnable)
        m_lMenu->EnableMenuItem(iID,MF_BYCOMMAND | MF_ENABLED);    //Menüpunkt aktiviernen
    else
        m_lMenu->EnableMenuItem(iID,MF_BYCOMMAND | MF_GRAYED | MF_DISABLED);    //Menüpunkt deaktivieren
}



Geht noch nicht. Anzeigen unktioniert, aber in EnableMenuEntry geht das Prog erst wenn das Kontextmenü wieder geschlossen ist. Und da gibt es das Menü nicht mehr, deshalb bekomme ich ne Fehlermeldung.
Ich denke mal da muss ich irgendwas mit Meldungshandlern machen, aber mit welchem, oder doch nicht?
--
Gruß GuenniAtWork

Dieser Post wurde am 18.07.2005 um 14:54 Uhr von GuenniAtWork editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.07.2005, 15:25 Uhr
Tommix



Das Enablen muß natürlich vor TrackPopupMenu passieren.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
18.07.2005, 15:34 Uhr
GuenniAtWork



Geht auch nicht, der selbe Fehler.
(m_lMenu ist NULL)


Zitat von TOMMIX:

Das Enablen muß natürlich vor TrackPopupMenu passieren.



Wohle eher mitten drin

Warum geht eigentlich dieses On_UPDATE_UI nicht, bei dem Menüleistenmenü gehts doch auch.
--
Gruß GuenniAtWork
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
18.07.2005, 15:51 Uhr
Tommix




Zitat:

C++:
m_lMenu = m_lMenu->GetSubMenu(0);



Das geht natürlich nur einmal gut. Besser:

C++:
CMenu* pSubMenu = m_lMenu->GetSubMenu(0);
ASSERT_VALID(pSubMenu);
pSubMenu->EnableMenuItem(...


OnUpdateCommandUI wird hier erst gerufen, wenn man den Menüpunkt auswählt, frage mich nicht warum.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: