Home
Navigation
Impressum
Coder Welten - Programmierung und Optimierung
Coder Welten
 
 

 

 

Ein erstes Fenster mit Hilfe der Win32-API erstellen

WinMain und die Windows Prozedur

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
Ein erstes Fenster wurde erstellt

 

Copyright © Verlag Horst Müller - Stendal - 2006 - Impressum - Datenschutz - Nutzungsbedingungen