Wie kann man abfragen, ob eine Message erhalten wurde?

Ravebaby

Erfahrenes Mitglied
Ich übergebe eine selbst definierte Message per
Code:
SendMessageToDescendants(WM_COMMAND, MAKEWPARAM(ID_IDLE, 0), 0);
an all die Kinder der Klasse.
Wie aber kann ein solches Kind abfragen, ob es die Nachricht erhalten hat?

Grüße Rave
 
Über die Methode : "PreTranslateMessage(..)"
Da müsste die eigentlich irgenwann mal drinn auftauchen.

M.f.G, Erik
 
ich verstehs nicht wirklich, sorry.
Ich habe nun

Code:
if (PreTranslateMessage(ID_IDLE))
{
	TRACE("idle");
}

und dann gibt er mir als Fehler: cannot convert parameter from int to MSG* :confused:
 
Du musst dir vom Assistenten oder über die Eigenschaften PreTranslateMessage anlegen lassen. Die Funktion erhält einen Pointer auf ein MSG-Struct. Im MSG-Struct kannst du jetzt prüfen, ob message deine Nachricht enthält.

Anmerkung: PreTranslateMessage enthält auch Nachrichten für alle Child-Fenster deines aktuellen Fensters, deshalb auch das HWND abfragen!
 
OK, ich habe nun den Code so umgeschrieben, aber er gibt einfach kein IDLE aus:
Code:
MSG msg;
this->PreTranslateMessage(&msg);
if (msg.message == ID_IDLE)
{
	TRACE("IDLE\n");
}

Das hwnd hab ich in die Überprüfung nicht mit einbezogen, weil es egal ist, wer die Nachricht erhält. Sie wird ja eh gleichzeitig an alle gesendet. Hauptsache sie wäre mal da!
Woran kann das denn liegen?

Also ich sende zuerst die Message folgendermaßen:
Code:
pWnd->SendMessage(WM_COMMAND, MAKEWPARAM(ID_IDLE, 0), 0);

Dieses Window erhält die message auch sicher, denn wenn ich
Code:
switch (LOWORD(wParam))
{
case ID_IDLE:
	TRACE("IDLE");
	SendMessageToDescendants(WM_COMMAND, MAKEWPARAM(ID_IDLE, 0), 0);
	break;
	}

schreibe, gibt er IDLE aus.
Und er sendet es ja auch an alle Kinder. Aber dort scheint es wohl nicht anzukommen...
 
Also du sendest ja die Nachricht WM_COMMAND und nicht die NAchricht ID_IDLE.
Also das "message"-Member der msg-Struktur ist dann WM_COMMAND und irgendwo
im HIWORD des wParam der msg-Struktur muss dein dein ID_IDLE stecken - denn so schickst du sie ja auch.

M.f.G. Erik
 
Zuletzt bearbeitet:
Hier gibt's ein Missverständis: Die PreTranslateMsg rufst du nicht auf, die wird von MFC automatisch aufgerufen. Wenn du da drin auf eine Nachricht prüfen willst, lässt du dir vom Assistenten die Überladung anlegen und setzt dort dann deine Prüfung rein.

Und wie EriFo schon gesagt hat, auf WM_COMMAND prüfen; das ID_IDLE ist genauso im Parameter drin, wie du es reingesteckt hast.
 
Zuletzt bearbeitet:
ou man, ich bin echt zu blöd dafür...tut mir echt leid... was denn für ein Assistent?
Ich habe den Code nun so geändert, was leider auch nichts bringt, aber anscheinend soll ich ja die PreTranslateMessage() gar nicht aufrufen?! Aber wie soll ich denn dann an die message dran kommen?

Code:
MSG msg;
this->PreTranslateMessage(&msg);
if (msg.message == WM_COMMAND)
{
	TRACE("IDLE\n");
}
 
Welches VS benutzt du denn? Ab 2002 kannst du, wenn deine Datei offen ist, über Alt-Enter die Eigenschaften der Datei einsehen. Da sollten oben vier Buttons nebeneinander liegen, ganz rechts so eine dunkelgrüne Box. Da sind die Overrides drin.
Draufklicken, in der Liste nach unten scrollen, und PreTranslateMessage auswählen. In der Combo, die dann in der rechten Hälfte auftaucht, PreTranslateMessage auswählen. TADA -> Der Assistent sollte dir jetzt in deine Klasse die Funktion eingefügt haben.

Du musst jetzt nur noch innerhalb der Funktion deine Abfrage machen.

Die Funktion sollte in etwa so aussehen:

Code:
BOOL CColorPicker::PreTranslateMessage( MSG* pMsg ) 
{

  if ( ( pMsg == WM_COMMAND )
  &&   ( pMsg->hwnd == m_hWnd )
  &&   ( LOWORD( pMsg->wParam ) == ID_IDLE ) )
  {
    // jetzt isses passiert
  }

  return CBasisKlasse::PreTranslateMessage(pMsg);
}
 
Frage: Sollte man den die Funktion, wenn die IF-Anweisung erfüllt wird, nicht mit "return TRUE;" beenden?
 

Neue Beiträge

Zurück