Prinzipieller aufbau eines windows-programms in c
Prinzipieller Aufbau eines Windows-Programms in C
von Reis Thorsten1. Hauptfunktion
Die Hauptfunktion ist das Grundgerüst des Windows-Programms.
int PASCAL WinMain (HANDLE hInst,HANDLE hPrevInst,LPSTR lpCmdLine,int nCmdShow)
Dem Hauptfenster wird ein Handle des Hauptfensters und des vorherigen Fensters übergeben. Mit dem hPrevInst-Parameter kann überprüft werden ob das Programm das erste Mal gestartet wurde. Eine Ausnahme bildet Win32. Hier ist der hPrevInst-Parameter immer NULL.
1.1 Fenster registrieren
if (!hPrevInst) {
wndclass.style = NULL;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.
hInstance = hInst;
wndclass.hIcon = LoadIcon (0, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(0, IDC_ARROW);
wndclass.hbrBackground = COLOR_WINDOW+1;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szApplName;
if (!RegisterClass (&wndclass)) return 1; // Fehler beim Fenster-
} // Registrieren
Beim der Fensterregistrierung wird die Fensterklasse in Windows registriert, also die Informationen über das Hauptfenster eingetragen.
Die Menüs, Icons und Cursor werden aus der Resourcendatei mittels der ID's eingetragen.
1.2 Fenster erzeugen und anzeigen
hWnd = CreateWindow ( szApplName, // Fenster-Klassen-Name
szWinTitle, // Fenster-Titel
WS_OVERLAPPEDWINDOW, // Fenster-Stil
CW_USEDEFAULT, 0, // x, y Standard-Pos.
CW_USEDEFAULT, 0, // cx,cy Standard-Größe
NULL, NULL, // kein Vater, kein Menü
hInst, NULL // Ersteller, kein WM-C.P
);
if (!hWnd) return 2; // Fehler beim Fenster-
// Erzeugen if
ShowWindow (hWnd, nCmdShow);
UpdateWindow (hWnd);
Beim Erzeugen des Fensters wird dann das Fenster bereits erzeugt aber noch nicht angezeigt. Mit ShowWindow wird das durch den Handle identifizierte Fenster angezeigt während mit UpdateWindow ein WM_PAINT ausgelöst wird, welches den Fenster-Inhalt anzeigt.
1.3 Meldungsschleife
while (GetMessage (&msg, 0, 0, 0)) {
TranslateMessage (&msg);
DispatchMessage (&msg);
}
Der TranslateMessage-Befehl wandelt einen Befehl so um, daß er beim nächsten GetMessage ausgelesen werden kann. Der GetMessage liest dann den umgewandelten Befehl ein und gibt bei der Nachricht WM_QUIT den Wert NULL zurück. DispatchMessage schickt den eingelesenen Befehl dann an die entsprechende Fensterfunktion. Die Export-Funktionen (WndProc und DlgProc) an die die Nachrichten weitergeleitet werden, werden in der DEF-Datei eingetragen.
2.
Fensterfunktionen
2.1 Hauptfenster
LONG FAR PASCAL _export WndProc(HWND hWnd, UINT msg, WPARAM wPar, LPARAM lPar)
{
switch (msg) {
case WM_PAINT: WndProcWMPAINT (hWnd); break;
case WM_LBUTTONDOWN: WndProcWMLBUTTONDOWN (hWnd); break;
case WM_DESTROY: PostQuitMessage (0); break;
default: return DefWindowProc(hWnd, msg, wPar, lPar);
}
return 0;
}
Die Hauptfenster-Funktion wird immer dann aufgerufen, wenn GetMessage eine Windows-Nachricht erhält. Der Parameter msg gibt die Art der Meldung an, während die beiden Parameter wPar und lPar weitere Informationen über die Nachricht enthalten.
2.2 Dialogfenster
BOOL FAR PASCAL _export DlgProc(HWND hWnd, UINT msg, WPARAM wPar, LPARAM lPar)
{
BOOL ret = TRUE;
switch (msg) {
case WM_INITDIALOG: SetFocus (GetDlgItem (hWnd, IDD_FELD_I));
ret = FALSE; break;
case WM_COMMAND: DlgProcWMCOMMAND (hWnd, wPar); break;
case WM_CLOSE: EndDialog (hWnd, 0); break;
default: ret = FALSE;
}
return ret;
}
Die Dialogfenster-Funktion funktioniert wie die Hauptfenster-Funktion. Wenn ein Dialog angelegt worden ist, werden die Nachrichten vom Hauptprogramm an diese Funktion weitergeleitet, auf die dann dort entsprechend reagiert werden kann.
3. Dialoge erzeugen
Dialoge sind eigene Fenster die einen Windows-Handle erhalten. Das Aussehen der Dialoge wird durch die Resourcen-Datei bestimmt. Im Resourcen-Headerfile, welches im Hauptprogramm eingebunden wird, werden außerdem die Dialogelemente mit ID's identifiziert.
void WndProcWMLBUTTONDOWN (HWND hWnd)
{
FARPROC lpitDialog; // Instanz-Verbinder zur Dialog-Funktion
lpitDialog = MakeProcInstance ((FARPROC)DlgProc, hMainInst);
DialogBox (hMainInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, lpitDialog);
FreeProcInstance (lpitDialog);
InvalidateRect (hWnd, NULL, TRUE);
}
In diesem Beispiel wird der Dialog beim Klicken der Linken Maustaste angelegt. Dazu muss zuerst eine Instanz auf die Dialogfenster-Funktion angelegt werden.
Das betrifft aber nur die 16Bit-Windows-Version, da im Win32 auf die Funktion direkt zugegriffen werden kann. Die Funktion DialogBox erzeugt dann das Fenster welches als Parameter den Handle des Hauptfensters, die Resourcen-ID des Dialogs, der Handle des Erzeugers des Fensters (in diesem Fall ebenfalls das Hauptfenster) und die Instanz der Fensterfunktion. Die Kontrolle an das Hauptfenster wird hier erst wieder zurückgegeben, wenn der Dialog geschlossen wird (modaler Dialog).
4. Meldungen
In Windows-Programmen wird hauptsächlich mit Meldungen gearbeitet. Wie schon erwähnt werden die Meldungen an die jeweiligen Fensterfunktionen geschickt.
Da auch Dialogfenster genauso Fenster sind wie das Hauptfenster gibt es diesselben Nachrichten. Hier einige der wichtigsten Windows-Meldungen.
WM_PAINT:
Wird bei jeder Änderung des jeweiligen Fensters aufgerufen. Hier werden die grafischen Ausgaben im Fenster festgelegt.
WM_LBUTTONDOWN, WM_RBUTTONDOWN,..
:
Wird bei Maustastendruck ausgelöst.
WM_DESTROY:
Wird ausgelöst wenn das Fenster geschlossen wird.
WM_CLOSE:
Im Prinzip wie WM_DESTROY, nur daß bei WM_CLOSE nur die Anweisung daß das Fenster geschlossen werden soll geschickt wird. Mit dieser Nachricht kann auch verhindert werden daß das Fenster normal geschlossen wird.
WM_INITDIALOG:
Wird ausgelöst, wenn ein Dialog neu erstellt wurde. Dient für Initialisierungen.
WM_COMMAND:
Ist die Meldung, daß ein Command-Button gedrückt wurde. Im wPar-Parameter ist die Resourcen-ID des Buttons festgehalten.
Die Meldungen müssen nicht unbedingt vom Programm ausgelöst werden, es ist auch möglich die Meldungen mittels PostMessage selbst zu schicken. Bsp.:PostMessage (hWnd, WM_CLOSE, 0, 0);
Es wird an das Fenster ein WM_CLOSE geschickt, welches dann beim nächsten GetMessage darauf reagiert.
Anmerkungen: |
| impressum | datenschutz
© Copyright Artikelpedia.com