Seite 1 von 1

WinAPI GUI Designer für C++?

Verfasst: 11.07.2009 21:08
von Kurzer
Hier kommt eine evtl. etwas dumme Frage, aber das liegt dann einfach daran, daß ich mit Programmierung unter C/C++ noch nicht zu tun hatte.

Um in C++ reinzuschnuppern habe ich mir entsprechende Fachliteratur zugelegt und mir vor ein paar Tagen die wxDev-C++ Entwicklungsumgebung installiert. Für die Übungen in dem Buch ist diese Freeware völlig ausreichend.

Meine Frage bezieht sich auf den Bereich der GUI-Erstellung für Windows Applikationen unter C/C++.

Da C/C++ von Haus aus nichts mit GUIs zu tun hat, muß man entweder auf die native API des Betriebsystems zugreifen (WinAPI) oder sich eines entsprechenden Frameworks/Toolkit/wieauchimmermanesnennt bedienen. Soweit glaube ich das begriffen zu haben.

Ich habe mir auch noch keine sonderlichen Gedanken gemacht, als ich feststellte, das es haufenweise solcher GUI-Frameworks gibt. Der wxDev-C++ ist ja sogar von Haus aus auf die wxWidgets ausgelegt und hat einen eigenen Form Designer dafür.

Allerdings hat mich spantan der Brechreiz überflutet, nachdem ich ein "Hello World" im Windows Fenster compiliert hatte.
Die Exe hatte über 3 MB. Nach Einschalten von Compiler-Optimierungen "Nur" noch 2,5 MB. :freak:

Das selbe "Hello World" unter Benutzung der nativen WinAPI von Windows hat dagegen die "immense Größe" von 7 KB.

Ich kann verstehen, daß diese Frameworks viele Vorteile haben. Sie kapseln die WinAPI (die in C geschreiben ist) in objektorientierten Klassen, die sich in C++ einfügen, manche sorgen für Platformunabhängigkeit (wxWidget z.B.) oder erweitern die GUI-Elemente um neue gadgets. Andere Pakete liefern gleich ganze Bereiche als gekapselte C++ API mit (Netzwerk, Memory, Filesystem, usw...)

Alles schön und gut - bei einem Programm wie Photoshop ist es vielelicht auch egal, wenn das GUI-Framework mal eben 3 MB Overhead erzeugt, aber für kleine Tools ist das mehr als oversized.

So, nun kann ich mir vorstellen, daß auch schon zu "C-Zeiten", als die Windows API enstanden ist, niemand gern die GUI seines Programms per Texteditor gebaut hat. Daher frag ich einfach mal ganz naiv: Kennt jemand einen GUI-Editor, der auf die WinAPI ausgelegt ist und C oder C++ Code ausspuckt, der nur das wiederspiegelt, was man im GUI Designer zusammengeklickt hat?

Also eigentlich so wie der Visual Designer von PB oder PureFORM von Gnozal.

Diese C/C++ Frameworks haben offensichtlich einen Haufen Funktionen dabei, die alle mitkompiliert werden, die man aber für seine Minianwendung nicht braucht.

Aber wie gesagt... das ganze ist vielleicht auch nur ein Verständnisproblem, weil ich keien C/C++ Erfahrung habe.

Nach etlichen Stunden googlen und surfen zu diesem Thema bin ich nur noch mehr verwirrt als vorher. So gibt (gab) es z.B. die MFC von Microsoft. DIe "geht" wohl aber nur, wenn man mit Visual C/C++ von M$ arbeitet. Borland hat dann wieder eine eigene Library... :o

Das ist ja echt verwirrend... neben der eigentlichen Programmiersprache muß man sich noch für ein GUI-Framework entscheiden und dessen API lernen. Und wehe man muß dann mal einen Source bearbeiten, der mit einem anderen Framework erstellt wurde. Wirre Welt...

So, nu hab ich nen halben Roman geschrieben, dabei wollt ich nur nach nem WinAPI GUI-Designer fragen. :lol:

Verfasst: 11.07.2009 21:39
von ts-soft
Wie wäre es mit ResEd? Leider scheint die Homepage von RADASM nicht
mehr zu existieren. Aber downloads sollten noch zu finden sein.

// edit

http://radasm.110mb.com/resed/index.html

Verfasst: 11.07.2009 22:48
von Kurzer
Danke für den link, ts-soft. :allright:

*EinLichtgehtauf* Aha... Ressourcen!? Tja, hätte ich mich vorher mal mit Ressourcen auseinandergesetzt, dann wär ich vermutlich selbst drauf gekommen.
Sind aber immer wieder schön solche Aha-Erlebnisse. :wink:

Verfasst: 03.08.2009 10:59
von Andi
Auch ich möchte neben PB ein wenig C/C++ lernen, inklusive GUI-Programmierung mittels WinApi (bin also in der gleichen Situation wie Kurzer). Dazu habe ich mir den Bloodshed-Compiler heruntergeladen.

Meine erste Aufgabe, die ich mir gestellt habe, soll ein mehr oder weniger leeres Fenster mit einem Button sein. Nach dem Anklicken des Buttons soll irgendeine simple Aktion (es geht ja nur um das Prinzip) wie beispielsweise MessageBox zeigen, Fenstertitel ändern oder irgendeine Textausgabe passieren. Habe mir auch den Petzold ("Windows-Programmierung") zugelegt, aber da steht nur (Seiete 341 bis 344) ein für mich sehr komplexes Beispiel mit vielen Buttons und einem für mich nicht durchschaubaren Event-Handling drin. Leider konnte ich auch kein einfaches Button-WinApi-Beispiel googeln. Kann mir da jemand weiterhelfen?

ts-soft hat dann noch ResEd ins Spiel gebracht. Aber damit kann man doch nicht einzelne Steuerelemente wie Buttons erzeugen, sondern nur "vorgefertigte" Sachen wie Dialogs und Menus? Oder sehe ich das falsch?

Verfasst: 03.08.2009 11:32
von milan1612
Es gibt auch einen richtigen Window Designer der C Code mit WinAPI Aufrufen generiert.
Ist ziemlich einfach erweiterbar und kostenlos. Das Teil heißt Visg, hier ist der Link:
http://mrhx.ucoz.com/load/ (Downloadlink: http://mrhx.ucoz.com/load/0-0-0-27-20)

Hab aber noch nie was damit gemacht, nur ein paar Tests...

Verfasst: 03.08.2009 11:57
von edel
@Andi

Lies dir mal den Thread hier durch
http://www.purebasic.fr/german/viewtopic.php?t=23

Verfasst: 03.08.2009 16:22
von Andi
@milan1612: Danke für den Link. Das werde ich sicherlich testen.

@edel: Danke für den Hinweis auf den Thread. Das ist schon mal ein Erfolgserlebnis. Ich kann jetzt Buttons erzeugen. Aber ich habe noch ein Problem mit dem WinApi-Callback. Ich weiß nämlich nicht, wie ich die Zeilen

Code: Alles auswählen

Select (wParam >> 16) & $FFFF
Select (wParam & $FFFF) 
in C-Syntax bringen kann. Ich habe es mal mit HIWORD(wParam) und LOWORD(wParam) versucht. Aber auch das gab nur Fehlermeldungen.

Verfasst: 03.08.2009 16:37
von Andi
Ups, da war ich wohl voreilig. Das mit HIWORD() und LOWORD() klappt nämlich! Ich hatte nur die beiden Button-Ids als Integer-Variablen definiert. Die müssen aber mit einer #define-Anweisung festgelegt werden. Bin halt noch ein C-Rookie.

Verfasst: 03.08.2009 17:29
von iostream
Um ganz WinApi-konform zu bleiben, muss die Eventschleife so aussehen:

Code: Alles auswählen

while(GetMessage(&msg, hWndMain, 0, 0) > 0)
Beim erzeugen der Child-Windows muss als vorletzter Parameter die Instanz des Programms übergeben werden.

Code: Alles auswählen

HINSTANCE hInstance = (HINSTANCE) GetWindowLongPtr(hWndMain, GWL_HINSTANCE);
HWND hButton = CreateWindow("Button", "Text", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 10, 100, 22, hWndMain, NULL, hInstance, NULL);

Verfasst: 03.08.2009 17:48
von edel
iostream hat geschrieben:Um ganz WinApi-konform zu bleiben, muss die Eventschleife so aussehen:

Code: Alles auswählen

while(GetMessage(&msg, hWndMain, 0, 0) > 0)
hWndMain ist optional.