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 Ein­sprungsfunktion 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 Anwen­dung verkörpert, ist zur Erstellung eines Stammfensters noch eine zweite Funktion erforderlich, die auch als Windows-Prozedur bezeichnet wird und die der Be­arbeitung 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