Verständnisfrage zu Nachrichten in Windows

Hallo,

ich arbeite mich seit einigen Tagen in die Windows-Programmierung mit Visual C++ 6.0 ein.

Dazu hätte ich mal eine Veständnisfrage zu folgendem Szenario:

Also, ich habe ein Fenster, in dem sich ein Button „OK“ befindet.
Der Anwender klickt auf den Button. Wie läuft das jetzt mit den Nachrichten ab?

Ich erkläre mir das folgendermaßen im Falle eines Mausklicks auf den Button:

  • Windows ruft die Fensterprozedur des Buttons (ein Button ist doch ein Fenster?) direkt auf und übergibt das Event LBUTTON_DOWN (o. ä.).
  • Der Button ruft eine ensprechende Methode seiner Basisklasse auf, die einen entsprechenden optischen Eindrückeffekt erzeugt.
  • Das gleiche passiert dann mit LBUTTON_UP.
  • Dann ruft Windows wieder direkt die Fensterprozedur des Buttons auf und übergibt eine BN_CLICKED Event.
  • Die Methode der Basisklasse des Buttons sendet eine Nachricht an Windows und übergibt als Parameter den handle des Elternfensters und das Event BN_CLICKED.
  • Windows reiht diese Nachricht in die Warteschlange der Anwendung ein.

Stimmt das denn bis hierher?

Ab jetzt weiß ich nicht mehr wie es weitergeht. Wird jetzt die Fensterprozedur des Fensters, in dem sich der Button befindet, aufgerufen? Woher weiß aber das Fenster (wenn es mehrere Buttons hat), welcher der Buttons gedrückt wurde?

Über eine Erklärung / Richtigstellung würde ich mich sehr freuen?

Danke & Gruß
Mac

Auch hallo.

ich arbeite mich seit einigen Tagen in die
Windows-Programmierung mit Visual C++ 6.0 ein.

Ist zwar das falsche Brett, aber egal :wink:

Dazu hätte ich mal eine Veständnisfrage zu folgendem :Szenario:

(…)

Ich erkläre mir das folgendermaßen im Falle eines :Mausklicks auf den Button:

  • Windows ruft die Fensterprozedur des Buttons (ein :Button ist doch ein Fenster?)

Besser: ein grafisches Element
;direkt auf und übergibt das Event

LBUTTON_DOWN (o. ä.).

  • Der Button ruft eine ensprechende Methode seiner :Basisklasse auf, die einen entsprechenden optischen :Eindrückeffekt erzeugt.

So könnte man es sagen :wink:

  • Das gleiche passiert dann mit LBUTTON_UP.
  • Dann ruft Windows wieder direkt die Fensterprozedur :des Buttons auf und übergibt eine BN_CLICKED Event.
  • Die Methode der Basisklasse des Buttons sendet eine
    Nachricht an Windows und übergibt als Parameter den :handle des
    Elternfensters und das Event BN_CLICKED.
  • Windows reiht diese Nachricht in die Warteschlange :der Anwendung ein.

Stimmt das denn bis hierher?

Klingt zumindest nicht verkehrt.

Ab jetzt weiß ich nicht mehr wie es weitergeht. Wird :jetzt die Fensterprozedur des Fensters, in dem sich der :Button befindet, aufgerufen?

k.A.

Woher weiß aber das Fenster (wenn es mehrere
Buttons hat), welcher der Buttons gedrückt wurde?

Die grafischen Elemente werden entweder durchnummeriert oder bekommen eindeutige Namen, z.B. Button1, Button3,…
Daran erkennt das Programm, welches Element eine Nachricht gesendet hat. Und welche.

HTH
mfg M.L.

Hi,

Auch hallo.

ich arbeite mich seit einigen Tagen in die
Windows-Programmierung mit Visual C++ 6.0 ein.

Ist zwar das falsche Brett, aber egal :wink:

Dazu hätte ich mal eine Veständnisfrage zu folgendem :Szenario:

(…)

Ich erkläre mir das folgendermaßen im Falle eines :Mausklicks auf den Button:

  • Windows ruft die Fensterprozedur des Buttons (ein :Button ist doch ein Fenster?)

Besser: ein grafisches Element
;direkt auf und übergibt das Event

LBUTTON_DOWN (o. ä.).

  • Der Button ruft eine ensprechende Methode seiner :Basisklasse auf, die einen entsprechenden optischen :Eindrückeffekt erzeugt.

So könnte man es sagen :wink:

  • Das gleiche passiert dann mit LBUTTON_UP.
  • Dann ruft Windows wieder direkt die Fensterprozedur :des Buttons auf und übergibt eine BN_CLICKED Event.
  • Die Methode der Basisklasse des Buttons sendet eine
    Nachricht an Windows und übergibt als Parameter den :handle des
    Elternfensters und das Event BN_CLICKED.
  • Windows reiht diese Nachricht in die Warteschlange :der Anwendung ein.

Stimmt das denn bis hierher?

Klingt zumindest nicht verkehrt.

Aber du weißt es auch nicht genau?

Ab jetzt weiß ich nicht mehr wie es weitergeht. Wird :jetzt die Fensterprozedur des Fensters, in dem sich der :Button befindet, aufgerufen?

k.A.

Woher weiß aber das Fenster (wenn es mehrere
Buttons hat), welcher der Buttons gedrückt wurde?

Die grafischen Elemente werden entweder durchnummeriert oder
bekommen eindeutige Namen, z.B. Button1, Button3,…
Daran erkennt das Programm, welches Element eine Nachricht
gesendet hat. Und welche.

Schau mal, die Fenster-Prozedur sieht folgendermaßen aus:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

Wo wird da die ID des Buttons übergeben?

Gruß
Mac

Hi!

Die WndProc jedes Fensters sieht letztlich so aus. Über die konkrete Message wird jeweils festgelegt, welche Bedeutung wPar und lPar haben.
I.d.R. müssen die betreffenden Parameter auf irgendwelche Strukturzeiger gecastet werden, damit man an die jeweiligen Infos rankommt, die für die betreffende Nachricht noch interessant sind (abgesehen davon, _dass_ die Nachricht empfangen wurde).

Im konkreten Beispiel BN_CLICKED besagt die Doku (MSDN):

The BN\_CLICKED notification code is sent when the user clicks a button. 
The parent window of the button receives the BN\_CLICKED notification code through the WM\_COMMAND message.
...
Parameters

wParam
The low-order word contains the button's control identifier. The high-order word specifies the notification message. 
lParam
Handle to the button. 

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Super, vielen Dank!