1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
// C++ für Spieleprogrammierer
// Listing 10.1
// Ein Windows-Grundgerüst
#include <Windows.h>
// Prototyp der Callback-Funktion
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpcmdline, int ncmdshow)
{
WNDCLASSEX windowclass; // Struktur für Fenstereigenschaften
HWND hWnd; // handle Window (Fenster-Handle)
MSG message; // message (Nachricht)
// Klassenname des Fensters bestimmen (frei wählbar)
const char szClassName[] = "Ein Windows-Grundgeruest";
// Struktur "windowclass" mit gewünschten Eigenschaften füllen
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 erweitertn Einstellungen
windowclass.cbClsExtra = NULL;
windowclass.cbWndExtra = NULL;
// 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;
// Menü wird nicht benötigt
windowclass.lpszMenuName = NULL;
// Klassenname angeben
windowclass.lpszClassName = szClassName; // Hier ist der Fehler
// Fensterklasse registrieren
if(!RegisterClassEx(&windowclass))
return 0;
// Das Fenster erzeugen
hWnd = CreateWindowEx (NULL, szClassName, szClassName, WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100, 100, 300, 250, NULL, NULL, hInst, NULL);
// Wenn das Fenster nicht erzeugt wurde, Programm beenden
if(hWnd == NULL)
return 0;
// "Herzschlag" des Programms, hier wrden alle Nachrichten abgeholt, übersetzt und weitergeleitet
while(GetMessage(&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
// Programm beenden
return(int)(message.wParam);
}
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// Messages auswerten
switch(message)
{
// Fentser schließen? (Auch Alt-F4)
case WM_DESTROY:
{
// Nachricht zum Beenden schicken
PostQuitMessage(0);
return 0;
}
break;
// wurde eine Taste gedrückt?
case WM_KEYDOWN:
{
// ja, also je nach Taste verzweigen
switch(wParam)
{
// wurde "Escape" gedrückt?
case VK_ESCAPE:
{
// ja, also Nachricht zum Beenden schicken
PostQuitMessage(0);
return 0;
}
}
}
break;
}
// Nachricht wurde nicht manuell verarbeitet, also von Windows verarbeiten lassen
return (DefWindowProc(hWnd, message, wParam, lParam));
}
|