Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 17.05.2007, 10:03 Titel: Das WinApi-Schaubild... |
|
|
Hi,
also ich versuch jetzt den Ablauf eines jeden WinApi Programms zu verstehen und habe mal angefangen ein Schaubild zu zeichnen, jedoch ist es noch nicht komplett um es richtig verstehen zu können.
Könnt ihr mir helfen es zu vervollständigen?
Also auch was an dem Schaubild ändern bzw. korrigieren?
Oder kennt ihr schon ein bereits existierendes Schaublid über die WinApi und könnt es hier posten?
|
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 17.05.2007, 10:15 Titel: |
|
|
was mir spontan einfällt:
- lParam, wParam sind keine zusätzlichen Nachrichten, sondern zusätzliche Informationen zur eigentlichen Nachricht.
- Ich würde nicht "LRESULT CALLBACK" schreiben, weil das ja eignetlich nur der Rückgabetyp ist. Eher "MessageCallbackProc" oder so.
- Dann könnte man noch allgemein beachten, das ein Windowsprogramm sehr viele Fenster haben kann. Jedes Fenster hat dann auch seine eigene Callback Procedure. Manche werden auch von Windows gemanaged, wenn ich mich nicht irre, ist ein Button z.B. ein normales Fenster, aber die CallbackProc wird von Windows behandelt. Wenn diese einen Mausklick feststellt, schick der Button an sein Übergeordnetes Fenster die Nachricht. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 17.05.2007, 10:57 Titel: |
|
|
Also ich habe das mal ein bischen verbessert, nur das mit den zusätzlichen Fenstern verstehe ich noch nicht so richtig, kommen die jetzt vom Hauptfenster aus oda von Windows, sorry ich kanns mir i-wie nicht bildlich vorstellen... grml.
|
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 17.05.2007, 11:08 Titel: |
|
|
Man kann Unterfenster anlegen. Buttons z.B. sind ja Unterfenster. Aber auch ein 3D Editor, mit 4 Ansichten hat halt ein Hauptfenster und die 4 Unterfenster. Plus Unterfenster für Tools und so.
Man kann aber auch ganz normal mehrer Fenster anlegen, die nix miteinander zu tun haben. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 17.05.2007, 11:09 Titel: |
|
|
Jonathan_Klein hat Folgendes geschrieben: | Man kann Unterfenster anlegen. Buttons z.B. sind ja Unterfenster. |
Buttons können Unterfenster sein. |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 17.05.2007, 11:25 Titel: |
|
|
Aha und diese Unterfenster kommen dann von der CreateMainWindow Funktion oder von dem Messagehandler? |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 17.05.2007, 11:46 Titel: |
|
|
Jedes Fenster hat eine Klasse
Per RegisterWindow(Ex) registrierst du eine neue Fensterklasse die du per WNDCLASS(EX) definierst.
Per CreateWindow(Ex) kannst du ein Fenster erzeugen dessen Verhalten/Aussehen von der gewählten Fensterklasse abhängt
Jede Fensterklasse benötigt einen Funktion zum behandeln der Notifikationen, die Window Prozedur.
Der Handle des Fensters wird in Form einer Zahl von CreateWindow(Ex) zurückgegeben (HWND)
Die Funktion WinMain() ist die Eintrittsfunktion im Programm, entsprechend der main() Funktion bei Konsolenanwendungen.
Per GetMessage() wird die letzte Nachricht aus dem Nachrichtenqueue geholt. Ist die aktuelle Nachricht WM_QUIT so gibt GetMessage() 0 zurück sonst eine Wert ungleich 0.
DispatchMessage() leitet die aktuelle Nachricht in die Window Prozedur weiter wo die Nachricht fensterklassenabhängig behandelt werden kann.
Die WindowProzedur liefert Standardmäßig bei allen Nachrichten die behandelt wurden 0 zurück. Nicht behandelte Nachrichten werden per DefWindowProc() weitergeleitet und vom System "standardmäßig" behandelt. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 17.05.2007, 11:48 Titel: |
|
|
das ist egal. CreateMainWindow ist eine Hilfsfunktion, die hat nix mit WinAPI zu tun.
Du kannst an jeder beliebigen Stelle CreateWindow aufrufen, und damit ein neues Fenster erstellen. Es ist egal, ob du das in einer Callbackfunktion, oder sonstwo im Programm machst. (Ok, es wird wohl Stellen geben, wo das Probleme machen könnte, aber grundsätzlich ist es ziemlich egal). _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 17.05.2007, 15:15 Titel: |
|
|
Nagut ich habe noch eine Frage:
http://nopaste.info/c9dd5ebde5.html
In der WinMain Funktion wird ja eine MSG Struktur angelegt, aber wie kann der MessageHandler auf msg zugreifen?
Dann müsste man ja die msg in der WinMain globalisieren, oder nicht??
oder ist das eine komplett neue msg??
edit//: Ich sehe grade das für den MessageHandler eine neue msg erstellt wurde, also: UINT msg . (UINT ist ja ein typedef für unsignet int, oder?)
Doch in der WinMain wurde auch eine msg erstellt: MSG msg .
Aber irgendwie werden ja die Nachrichten von
TranslateMessage() / DispatchMessage() zum Messagehandler geschickt, nur ich weiß nicht wie???
Weil da ist jetzt 2 mal msg, einmal als Struktur (glaube ich): MSG msg ; und einmal als unsignet int: UINT msg ist. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 17.05.2007, 16:07 Titel: |
|
|
http://nopaste.de/p/apfJ1jDXh
(wenn man schon so eine Seite benutzt, wählt man gefälligst die richtige Sprache aus, damit es formatiert wird. Sonst ist das doch alles sinnlos.)
so.
Ja, UINT Message ist der Messagetyp in Form einer Zahl. Die MessageStruktur hingegen speichert viel mehr, was genau steht bestimmt in dem MSDN. Eigentlich ist es ganz einfach. Man hohlt per GetMessage die Nachricht und speichert die in der Varaible. Diese kann jetzt wieder an Windows übergeben werden (TranslateMessage(), DispatchMessage()). Diese Funktionen kennen die zugehörigen Callbackfunktionen der Nachricht (die ist ja in der Fensterklase gespeichert) und rufen so die Callbackfunktion auf. Eigentlich ganz einfach. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 29.05.2007, 13:50 Titel: |
|
|
So also jetzt habe ich es mal ein bisschen anders gemacht, habe ich da evtl i-welche Fehler gemacht oder gibts da noch was zu verbessern??
|
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 30.05.2007, 13:34 Titel: |
|
|
im Grunde stimmts, aber wenn du den Weg der Nachricht über get- und dispatchMessage schreibst, solltest du auch die 3. Funktion im Bunde, nämlich TranslateMessage() hinzufügen. Aber ein schönes Diagramm, womit hast du das denn gemacht?
Gruß DXer |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 31.05.2007, 12:33 Titel: |
|
|
DirectXer hat Folgendes geschrieben: | im Grunde stimmts, aber wenn du den Weg der Nachricht über get- und dispatchMessage schreibst, solltest du auch die 3. Funktion im Bunde, nämlich TranslateMessage() hinzufügen.
|
So besser?
DirectXer hat Folgendes geschrieben: | Aber ein schönes Diagramm, womit hast du das denn gemacht?
|
Paint |
|
Nach oben |
|
|
|