// C++ für Spieleprogrammierer
// Listing 10.3
// Eine kleine Anwendung
//
#include <windows.h>
// Prototypen
//
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam);
HWND ErstelleHauptfenster (HINSTANCE hInst);
void ErstelleSteuerelemente (HWND hWnd, HINSTANCE hInst);
// IDs der Child-Fenster
//
#define ID_STATICTEXT 4000
#define ID_EDITBOX 4001
#define ID_BTN_UEBERNEHMEN 4002
#define ID_BTN_BEENDEN 4003
// Globale Variablen
// Don't do this at home!
//
HWND hText; // Handle für den statischen Text
HWND hEditBox; // Handle für die Editbox
HWND hUebernehmen; // Handle für Button "Übernehmen"
HWND hBeenden; // Handle für Button "Beenden"
// Hauptprogramm
//
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,
LPSTR lpcmdline, int ncmdshow)
{
HWND hWnd; // Fenster-Handle
MSG message; // Nachricht
// Hauptfenster erstellen
hWnd = ErstelleHauptfenster (hInst);
// Prüfen, ob alles glatt ging
if (hWnd == NULL)
return (0);
// Alle Steuerelemente erstellen
ErstelleSteuerelemente (hWnd, hInst);
// Der "Herzschlag" des Programms
// Hier werden alle Nachrichten abgeholt,
// übersetzt und weitergeleitet
//
while (GetMessage (&message, NULL, 0, 0) )
{
TranslateMessage (&message);
DispatchMessage (&message);
}
// Programm beenden
return (int)(message.wParam);
} // WinMain
// Erstelle Hauptfenster
//
// Hauptfenster erstellen und Handle zurückliefern
//
HWND ErstelleHauptfenster (HINSTANCE hInst)
{
HWND hWnd; // Fenster-Handle
WNDCLASSEX windowclass; // Nachricht
// Der Klassenname des Fensters ist frei wählbar
const char szClassName[] = "Zweites Fenster";
// Struktur mit gewünschten Eigenschaften füllen
//
// Größe der Struktur zwischenspeichern
windowclass.cbSize = sizeof (WNDCLASSEX);
// Fenster soll beim Verschieben neu gezeichnet werden
windowclass.style = CS_HREDRAW | CS_VREDRAW;
// Zeiger auf Callback-Funktion
windowclass.lpfnWndProc = WindowProc;
// Keine erweiterten Einstellungen
windowclass.cbClsExtra = 0;
windowclass.cbWndExtra = 0;
// Instanz speichern
windowclass.hInstance = hInst;
// Icons und Cursor festlegen
windowclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
windowclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
windowclass.hCursor = LoadCursor (NULL, IDC_ARROW);
// Hintergrundfarbe festlegen
windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+1;
// Ein Menü brauchen wir nicht
windowclass.lpszMenuName = NULL;
// Klassenname angeben
windowclass.lpszClassName = szClassName;
// Fensterklasse registrieren
if (!RegisterClassEx (&windowclass) )
return (NULL);
// Das Fenster erzeugen
hWnd = CreateWindowEx (NULL,
szClassName,
"Eine kleine Anwendung",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT,
300, 135,
NULL,
NULL,
hInst,
NULL);
// Fensterhandle zurückgeben
return (hWnd);
} // ErstelleHauptfenster
// ErstelleSteuerelemente
//
// Alle Steuerelemente erstellen
//
void ErstelleSteuerelemente (HWND hWnd, HINSTANCE hInst)
{
// Statischen Text als Child-Fenster erstellen
//
hText = CreateWindow ("STATIC",
"Eingegebener Text",
WS_VISIBLE | WS_CHILD | ES_CENTER,
0, 0,
300, 20,
hWnd,
(HMENU)ID_STATICTEXT,
hInst,
NULL);
// Editbox als Child-Fenster erstellen
//
hEditBox = CreateWindow ("EDIT",
"Bitte Text eingeben",
WS_VISIBLE | WS_CHILD | WS_BORDER,
0, 20,
300, 20,
hWnd,
(HMENU)ID_EDITBOX,
hInst,
NULL);
// "Übernehmen"-Button als Child-Fenster erstellen
//
hUebernehmen = CreateWindow ("BUTTON",
"Übernehmen",
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
20, 50,
95, 40,
hWnd,
(HMENU)ID_BTN_UEBERNEHMEN,
hInst,
NULL);
// "Beenden"-Button als Child-Fenster erstellen
//
hBeenden = CreateWindow ("BUTTON",
"Beenden",
BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
175, 50,
95, 40,
hWnd,
(HMENU)ID_BTN_BEENDEN,
hInst,
NULL);
} // ErstelleSteuerelemente
// Callback-Funktion zur Nachrichtenverarbeitung
//
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
// Messages auswerten
switch (message)
{
// Fenster schließen? (Auch Alt-F4)
case WM_DESTROY:
{
// Nachricht zum Beenden schicken
PostQuitMessage (0);
return (0);
}
// Ab hier die Nachrichten unserer Child-Fenster bearbeiten
case WM_COMMAND:
{
switch (wParam)
{
// Wurde "Übernehmen" angeklickt?
case ID_BTN_UEBERNEHMEN:
{
char szText[256];
// Text aus der Editbox holen
GetWindowText (hEditBox, szText, 256);
// Diesen Text in das Label schreiben und
// den Text der Editbox löschen
SetWindowText (hText, szText);
SetWindowText (hEditBox, "");
return (0);
}
// Wurde "Beenden" angeklickt?
case ID_BTN_BEENDEN:
{
int Resultat; // Rückgabewert der Messagebox
// Messagebox für Sicherheitsabfrage
Resultat = MessageBox (hWnd, "Wirklich beenden?",
"Programm beenden",
MB_YESNO | MB_ICONQUESTION);
// Wurde "Ja" angeklickt?
if (Resultat == IDYES)
{
// Ja, also Programm beenden
PostQuitMessage (0);
return (0);
}
// Nein, also ganz normal weiter
return (0);
}
} break;
} break;
}
// Die Nachricht wurde nicht von uns verarbeitet, also
// von Windows verarbeiten lassen
return (DefWindowProc (hWnd, message, wParam, lParam) );
} // WindowProc