Um mit Hilfe von C und der Win32-API eine erste Fenster-Anwendung zu erstellen und innerhalb des
Clientbereichs der Anwendung eine Nachricht auszugeben, sind zwei für Windows-Anwendungen typische Funktionen erforderlich, die
wiederum weitere Funktionen enthalten. Es sei angemerkt, mit Windows-Anwendungen sind in diesem Zusammenhang Fenster-Anwendungen
gemeint und keine fensterlosen, für das Betriebssystem von Windows programmierten Anwendungen.
Die erste und wichtigste Funktion ist die WinMain Funktion, die auch als Einsprungsfunktion bezeichnet wird, da ohne eine
WinMain Funktion weder ein Stammfenster als Hauptfenster für Windows-Anwendungen, noch ein Dialogfenster oder dergleichen
erzeugt werden könnte. Allein für ein Dialogfenster würde eine WinMain-Funktion bereits ausreichen, wie die Beispiele unter
Einstieg "Hallo Welt" verdeutlichen. Doch da ein Dialogfenster allein noch keine eigenständige Anwendung verkörpert,
ist zur Erstellung eines Stammfensters noch eine zweite Funktion erforderlich, die auch als Windows-Prozedur bezeichnet wird und
die der Bearbeitung von Nachrichten dient.
Nachfolgend ein erstes Listing für die Erstellung eines Fensters, aus dem die Verwendung der WinMain Funktion und der
Windows-Prozedur ersichtlich wird.
/* Erstes Listing eines Fenster im Januar 2012 */ #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { static TCHAR const szAppFeName[] = TEXT("JanuarApp"); HWND hWnd; MSG msg; WNDCLASSEX wc; wc.cbSize = sizeof (WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = &WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szAppFeName; wc.hIconSm = wc.hIcon; if (RegisterClassEx(&wc) == 0){ MessageBox(NULL, TEXT("Ein Fehler trat ein!"), szAppFeName, MB_OK | MB_ICONERROR); return -1; } hWnd = CreateWindow( szAppFeName, // Name der FensterApp TEXT("Erstes Fenster"), // Titel des Fensters WS_OVERLAPPEDWINDOW, // Stil des Fensters CW_USEDEFAULT, // X-Position des Fensters CW_USEDEFAULT, // Y-Position des Fensters 406, 200, // Breite und Höhe des Fenstes NULL, NULL, // weitere Fenster und Menü hInstance, // Instanz des FensterApp NULL); // reserviert für weitere Parameter if (hWnd == NULL) return 0; ShowWindow(hWnd, nShowCmd); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)){ TranslateMessage(&msg); DispatchMessage(&msg); } UnregisterClass(szAppFeName, hInstance); return (int)msg.wParam; } /* Windows-Prozedur zur Bearbeitung von Nachrichten */ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch (message){ case WM_PAINT: hdc = BeginPaint(hWnd, &ps); SetTextColor( hdc, RGB( 220, 100, 0)); TextOut(hdc, 10, 10, TEXT("Hallo Welt,"), 11); SetTextColor( hdc, RGB( 0, 0, 0)); TextOut(hdc, 10, 40, TEXT("ein erstes Fenster wurde erstellt."), 34); TextOut(hdc, 10, 58, TEXT("Wie geht es nun weiter?"), 23); EndPaint(hWnd, &ps); return 0; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, message, wParam, lParam); }
Nach dem Kompilieren würde sich bei einem Aufruf der datei.exe ein Fenster wie das folgende öffnen.
Ein erstes Fenster wurde erstellt
Win32-API
Einstieg in C/C++
NET Framework