HIWORD(wParam) nur 4 oder 5?
-
Guten Tag,
Ich möchte auf einen Doppeklick auf das Fenster reagieren.
/*...*/ if(LOWORD(wParam) == 01) /* Wurde auf das Fenster geklickt? */ { sprintf(omg, "%i", HIWORD(wParam)); /* schreibe HIWORD(wParam) in den string "omg" */ SetWindowText(gHandleEditMessage, omg); /* Edit = HIWORD(wParam) */ if(HIWORD(wParam) == LBN_DBLCLK) /* Wurde doppelt geklickt? */ { MessageBox(0, "Klick", "", 0); } /*...*/Die Aktion mit dem string usw. habe ich nur zum testen inzugefügt.
LBN_DBLCLK ist als 2 definiert.Nun wird HIWORD(wParam) aber nur 4 (Fenster hat Fokus) oder 5 (Fokus verloren)
aber niemals LBN_DBLCLK (2) oder LBN_SELCHANGE (1).Überseh ich was?
-
Hallo,
Welche Nachricht bearbeitest Du? Versuch's mal mit WM_LBUTTONDBLCLK. LBN_DBLCLK wird nur von Listboxen verschickt.
mfg Martin
-
Das besagte Fenster ist ja auch ne Listbox (child)

WM_LBUTTONDBLCLK funktioniert leider auch nicht.
-
Bei einem anderen Projekt funktioniert das ganze
einwandfrei, allerdings ist die Listbox da auch
in einer Dialogbox..Könnte es daran liegen dass die Listbox "nur" ein child ist?
Ich erstelle die Listbox auf meinem Hauptfenster mit (HMENU)1,
und frage die hauptschleife ab.Die Abfrage an sich ist allerdings nicht fehlerhaft,
wenn ich direkt nach || if(LOWORD(wParam) == 01)
eine MessageBox() mache, wird diese bei jedem klick
angezeigt..
-
01 ist doch ne oktal-zahl oder? warum machst du sowas.
-
LBS_NOTIFY vergessen?
An application sends the LBN_DBLCLK notification message when the user double-clicks a string in a list box. The parent window of the list box receives this notification message through the WM_COMMAND message.
....
Only a list box that has the LBS_NOTIFY style will send this notification message.
-
derName schrieb:
Das besagte Fenster ist ja auch ne Listbox (child)

WM_LBUTTONDBLCLK funktioniert leider auch nicht.
Du hast meine Frage nicht beantwortet, ich wiederhole daher: Welche Nachricht bearbeitest Du?
Ich frage mich auch, was Du mit dem HIWORD(xxx) machen willst. In meinem Beispiel muß ich nirgendwo mit HIWORD die Nachricht holen. Hier mal ein Beispiel:
long CALL_WIN::callBack( unsigned int message, int wParam, long lParam ) { ... switch( message ) { ... case WM_LBUTTONDBLCLK: case WM_LBUTTONDOWN: case WM_LBUTTONUP: point = MAKEPOINT( lParam ); handleLeftButton( message, wParam, &point ); break; ... } ... }mfg Martin
-
berniebutt schrieb:
LBS_NOTIFY vergessen?
An application sends the LBN_DBLCLK notification message when the user double-clicks a string in a list box. The parent window of the list box receives this notification message through the WM_COMMAND message.
....
Only a list box that has the LBS_NOTIFY style will send this notification message.
Vielen Dank, Problem gelöst

-
derName schrieb:
Vielen Dank, Problem gelöst

Das ist schön für Dich
Trotzdem würde mich noch interessieren, warum Du Deine Nachricht aus HIWORD(wParam) geholt hast. Das hat mich verwirrt.mfg Martin
-
Nunja, soweit ichs verstanden hab:
message <- besteht aus 2 Bytes.
Das Hauptfenster schickt die Nachricht einfach so,
ein Child jedoch schickt im 1. Byte seine ID (LOWORD) und im 2. Byte die
eigentlich Nachricht (HIWORD).Deswegen frage ich ja:
if(LOWORD(wParam) == xx) /* wer hat die Nachricht geschickt? /
if(HIWORD(wParam) == xx) / welche Nachricht? */Kann auch falsch sein hab ich mir so zusammengereimt.. ^^
-
derName schrieb:
if(LOWORD(wParam) == xx) /* wer hat die Nachricht geschickt? /
if(HIWORD(wParam) == xx) / welche Nachricht? */Kann auch falsch sein hab ich mir so zusammengereimt.. ^^
Mit Zusammenreimen läuft mit WinApi nichts! Es handelt sich um eine Notification-Message. Die wird mit WM_COMMAND genauso geschickt.

-
derName schrieb:
Nunja, soweit ichs verstanden hab:
message <- besteht aus 2 Bytes.
Das Hauptfenster schickt die Nachricht einfach so,
ein Child jedoch schickt im 1. Byte seine ID (LOWORD) und im 2. Byte die
eigentlich Nachricht (HIWORD).Deswegen frage ich ja:
if(LOWORD(wParam) == xx) /* wer hat die Nachricht geschickt? /
if(HIWORD(wParam) == xx) / welche Nachricht? */Kann auch falsch sein hab ich mir so zusammengereimt.. ^^
Mag ja sein, das manche Frameworks das so machen. Wie sind hier aber bei der Windows API. Da funktioniert das nicht.
Eine Callbackfunktion schaut immer so aus:
extern "C" // <-- nur für C++ LONG FAR PASCAL _export WindowProc( HWND handle, UINT message, WPARAM wParam, LPARAM lParam );Der Empfänger der Nachricht steht im ersten Parameter. Die Nachricht selber steht in einem eigenen Parameter message. wParam und lParam enthalten dann nachrichtenspezifische Werte. Deshalb muß auch immer zuerst die Nachricht geprüft werden. Dann kannst Du dich für wParam und lParam interessieren.
Für die Nachricht LBN_DBLCLK hast Du die ID der Listbox korrekt geholt. Die Nachricht selber steht aber im Parameter message. Richtig hättest Du es so machen müssen:
... if( message == LBN_DBLCLK && LOWORD( wParam ) == 1 ) { MessageBox(0, "Klick", "", 0); }Deine Implementierung mag zwar zufällig funktionieren. Das ist aber eben Zufall.
BTW: wParam ist mittlerweile auch ein 4-byte Wert. Schmeiß Deine Doku zum 16-Bit Windows weg. Dann lernst Du erst gar nicht so einen Unfug.
mfg Martin
-
mgaeckler schrieb:
... if( message == LBN_DBLCLK && LOWORD( wParam ) == 1 ) { MessageBox(0, "Klick", "", 0); }Das ist Blödsinn, hab gerade die Doku nochmal gelesen. Muß natürlich so sein:
... if( message == WM_COMMAND && HIWORD(wParam) == LBN_DBLCLK && LOWORD( wParam ) == 1 ) { MessageBox(0, "Klick", "", 0); }Dann warst Du doch nicht so daneben.
mfg Martin