Früher Konsolenanwendung - Heute WinAPI?
-
Hallo zusammen!
Ich habe Anfang des Jahres eine Konsolenanwendung geschrieben. Nun habe ich vor das Ganze graphisch aufzupeppen bzw das Design nach meinen Wünschen anzupassen.
Ich ging also hin und erstellte mir eine Standard WinAPI in Dev-C++. Das Fenster öffnet sich sogar

Nun zum eigentlich Problem:
Im alten Projekt gabs dann die Phrase mit dem:
int main (int argc, char *argv[]) { //mach was }Nu stehe ich irgendwie leicht auf dem Schlauch, wo ich das denn bei der WinAPI habe. Auffällig wurde das Ganze durch folgendes:
(ehemalige Konsole)void (*pfi) (int fl, MString col, MString Sender, MString Message); void ParseChatLine (int flag, MString col,MString Sender, MString Message) { if (Message.includes (("Ein Text"))) { MString p; p = "Machwasdagegen"; ChatBot.say (p.print()); } } int main (int argc, char *argv[]) { pfi = &ParseChatLine; }Wo füge ich denn sowas nun in der WinAPI main.cpp ein?
Für nen Lösungsansatz bedanke ich mich wie immer im voraus
Gruß,
SKB
-
Prinzipiell läuft das so, dass in der WinAPI alles über Nachrichten läuft. Unter www.winapi.net gibts eine Einführung in die WinAPI-Programmierung.
Prinzipiell hast du die WndProc, eine Prozedur, die auf jede Nachricht reagiert, die eine Komponente deines Programms bekommt, also z.B. auf Buttonklicks, Mausbewegung, Texteingaben usw.
Da musst du dann deine Methoden/Funktionen einbauen. Kommt halt darauf an, was du schreibst. Wenn es z.B. ein simpler Texteditor ist, dann kommt halt bei SaveButtonClicked ein Aufruf hin, der den Inhalt deines Textfeldes in eine Datei schreibt.
Schau dir mal die Seite an, vielleicht gibt dir das einen Ansatz.
gruß
Martin
-
Hallo Martin,
danke für deine Antwort. Nun bin ich wenigstens etwas schlauer, was mein Programm betrifft. Nächste Frage ist nun, wie bastel ich denn da eine "Funktion" (oder wie es unter WinAPI auch genannt wird) ein, die ständig ausgeführt werden soll?
Also im Klartext: Das ganze war früher ein Chat Client für Win32 Konsole und soll nun halt als Windows Application mit neuem Gewand erscheinen. Somit habe ich eine Winsock Verbdinung zu dem jeweiligen Server, dann einen Chatline-Parser und z guter letzt noch eine Verbindung zum Server, der das Posten der Texte übernimmt.
Das so als kleiner Einblick in mein Programm.Gruß,
SKB
-
SKB schrieb:
Nächste Frage ist nun, wie bastel ich denn da eine "Funktion" (oder wie es unter WinAPI auch genannt wird) ein, die ständig ausgeführt werden soll?
am einfachsten ist wohl, wenn du dafür einen separaten thread startest (mit einem Sleep(10) in der schleife, damit dein windows nicht so langsam wird).

-
Wieso sollte man da extra einen Thread für laufen lassen? Für die Clientseite IMHO unnötig, maximal auf der Serverseite nötig (obwohl es da ja auch verschiedene Strategien gibt).
Prinzipiell läuft die Mainloop, bis die WM_QUIT-Nachricht kommt. Dort arbeitest du ja die Nachrichten ab. An der Stelle kann man einfach eigene Funktionen einbringen.
Beispiel (ohne Anspruch auf optimale Lösung):
while (GetMessage(&msg, NULL, 0, 0)){ if (msg.message == WM_QUIT) { break; // Raus aus der Schleife, um zu beenden. } else { // Nachrichten abarbeiten. TranslateMessage(&msg); DispatchMessage(&msg); } Sleep(1); // Ganz kurz warten, um die Auslastung zu verringern. // An dieser Stelle kann man weitere Dinge machen, wie z.B. den // Socket fragen, ob eine Nachricht ansteht. }gruß
Martin
-
Imho ist das komisch so

GetMessage() blockiert eh solange bis ne neue Nachricht kommt.
Das Sleep() sorgt eher dafür das die eigene Anwendung träger wird.Wenn es hier um einen Chat-Client geht sind da asynchrone Sockets viel interessanter. ( WSAAsyncSelect() etc...)
Dann muss man nicht ständig ne Schleife laufen lassen und gucken ob evtl. was zu empfangen da ist sondern bekommt von Windows ne Nachricht geschickt wenn neue Bytes da sind...
-
Hm, ja, man könnte mit PeekMessage arbeiten. Aber in irgendeiner Schleife muss ich sein, und wenn die ständig durchgerödelt wird, hab ich u.U. auch dicke Auslastung.