Toolbar (Nachrichten abfangen)

sTEk

Erfahrenes Mitglied
Nachdem ich mit den Tipps hier im Forum meine selbst erstellten Icons in der Toolbar aktivieren konnte (mittels Command_Ui) habe ich ein paar weitere Problem:
  1. Die Nachricht des entsprechenden Icons (oder auch Menüeintrages) kommt nur bis ins Mainframe
  2. Ich kann die Icons nicht mehr deaktivieren
  3. Die Icons bleiben nicht "aktiviert", also im gedrückten Status
Ich habe ei mehrfach gesplittetes SDI.
Wie kann ich diese Probleme lösen?
zu 1. Muss ich mir extra einen Zeiger auf die Klasse besorgen, in der die Nachricht behandelt und ausgewertet werden soll? Das ist doch nicht Sinn und Zweck der Toolbar, oder hab ich da was nicht richtig verstanden?
 
Hi,

zu 1: Die Nachrichten werden in der Klasse behandelt, in der sich der Eventhandler befindet. Du mußt dir also wirklich einen Zeiger auf die Klasse besorgen, wo du sie behandeln willst - oder den Handler in diese Klasse verlegen (sofern möglich).

zu 2: Normalerweise werden die Icons in der Toolbar über den UI-Mechanismus aktiviert und deaktiviert. Wenn du allerdings Icons hast, deren ID nicht mit einem Menu-Eintrag korrespondieren, mußt du die Funktionen von Hand einfügen, da über den Ressourcen-Editor für die ToolBar-Elemente keine Handler eingefügt werden können.

Hoffe, es hilft etwas weiter.

Mfg

langer
 
Danke - hatte ich schon befürchtet.
Und für alle, die das Problem auch haben sollten hier mal meine Lösung:

Das einzige, auf das man hier Acht geben muss ist, dass man das Handle der aktiven Klasse unbedingt am Anfang übergeben muss (ist im Code realisiert), da im MainFrm sonst mit einem ungültigen Zeiger gearbeitet wird - was unwiederruflich zu einem Absturz führen würde, wenn das Icon gedrückt wird. (daher zur Sicherheit Icon erst einmal deaktiviert)
Die Kommandos OnUpdateIcon1(...) und OnIcon1() sollten mit dem Klassenassi eingefügt werden, daher habe ich die MESSAGGE_MAP-Passage im MainFrm.cpp und die entsprechenden Zeilen des MainFrm- Headers nicht gepostet.
Die Lösung funktioniert natürlich ebenso für Menü-Einträge.

MainFrm.h
C++:
...
public:
//Pointer, damit später z.B. Menübefehle weitergeleitet werden können
CWnd    *m_AktuellesView;
BOOL    m_I_Icon1gedrueckt;
BOOL    m_I_Icon1Aktiv;
...

MainFrm.cpp
C++:
...
CMainFrame::CMainFrame()
{...
   m_I_Icon1Aktiv               = FALSE;    //Icon nicht aktiviert (grayed)
   m_I_Icon1gedrueckt        = FALSE;   //Icon nicht gedrückt (pressed)
...}
.
.
void CMainFrame::OnUpdateIcon1(CCmdUI* pCmdUI) {
//Icon aktivieren, wenn Variable TRUE
       pCmdUI->Enable(m_I_Icon1Aktiv);
//Icon als gedrückt zeigen, wenn aktiviert und gedrückt wurde
       pCmdUI->SetRadio(m_I_Icon1Aktiv && m_I_Icon1gedrueckt);
}
.
.
void CMainFrame::OnIcon1() {
//Hier kommen die gewünschten Aktionen beim Drücken des Icons rein.
//In diesem Fall wird der Status des Icons geändert und 
//eine Nachricht an den entsprechenden Dialog gesendet.
  if(!m_I_Icon1gedrueckt) //wenn Icon nicht gedrückt war:
//Nachricht an die gewünschte Klasse  (z.B. der behandelnde Dialog) schicken
    m_AktuellesView->SendMessage(WM_APP+1,1,1);
//Wechsel von gedrückt in nicht gedrückt und umgekehrt
    m_I_Icon1gedrueckt = !m_I_Icon1gedrueckt;
}

Dialogklasse.h
C++:
...
public:
   void Menueabfrage(WPARAM wParam, LPARAM lParam);
...

Dialogklasse.cpp
C++:
.
.
BEGIN_MESSAGE_MAP(CDialogklasse, CView)
	//{{AFX_MSG_MAP(CDialogklasse)
...
	ON_MESSAGE(WM_APP+1, Menueabfrage)
...
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
.
.
void CDialogklasse::OnInitialUpdate() 
{...
// Handle des Hauptfenster
   CWnd* FrameDialog = AfxGetMainWnd();
// zur Klasse des MainFrame casten
   CMainFrame *View = (CMainFrame*)FrameDialog;
//Zeiger auf diese Klasse festlegen
   View->m_BasisStandard=this;
//Voreinstellungen des Icons der Klasse entsprechend tätigen
View->m_I_Icon1Aktiv       = TRUE;
View->m_I_Icon1gedrueckt    = FALSE;
...}
.
.
void CDialogklasse::Menueabfrage(WPARAM wParam, LPARAM lParam)
{ //hier die gewünschten Behandlungen rein, z.B. switch(){case:...} für 
  //verschiedene Parameter
}
...
 
Zuletzt bearbeitet von einem Moderator:
Zurück