Win32-Programmierung mit VC++ und der Win-Api

2.0 - Buttons

Im letzten Kapitel haben wir uns ja ein einfaches Konstrukt gebaut. Sicherlich ist Euch auch das Ressourcenfeld aufgefallen. Unter diesem Feld können wir alle unsere Dialoge, Icons, Menüs und sonstiges erreichen.

Nun wollen wir aber ein wenig Interaktion hinzufügen. Dazu öffnen wir unter Ressourcen unseren Dialog. Nun fügen wir mit Hilfe der Steuerelemente eine Schaltfläche (Button) hinzu und platzieren diese auf unser Dialogfeld. Öffnet noch die Eigenschaften und passt die Einstellungen des Buttons so an, wie sie im Bild zu erkennen sind.

IDC_MELDEN ist der Handler des Buttons. Mit diesem werden wir die ganze Zeit arbeiten. Um nun ein wenig Spannung zu unserem Programm hinzuzufügen, wollen wir unser Programm so erweitern, dass wenn wir auf den Knopf drücken, eine Messagebox erscheint. Das reicht erstmal für den Anfang…

Wir erweitern unseren Quellcode folgendermaßen:

#include <windows.h>
#include <commctrl.h>

#include "resource.h"

LRESULT CALLBACK WindProc (HWND, UINT, WPARAM, LPARAM) ;
BOOL CALLBACK HelpProc(HWND hwnd,UINT Message,WPARAM wParam,LPARAM lParam);

HINSTANCE hInstance;
HDC hdc;

//---------------------------------------------------------------------------
// HAUPTFENSTER
//---------------------------------------------------------------------------
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT ("DIALOG01") ;

    HWND hwnd ; //HWND für Hauptfenster
    MSG msg ; // das message handling heist msg
    WNDCLASS windclass ; //das Hauptfenster gehört zu windclass - Klasse

    windclass.style = CS_HREDRAW | CS_VREDRAW;
    windclass.lpfnWndProc = WindProc ;
    windclass.cbClsExtra = 0 ;
    windclass.cbWndExtra = DLGWINDOWEXTRA ;
    windclass.hInstance = hInstance ;
    windclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON));
    windclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
    windclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
    windclass.lpszMenuName = "IDM_MENU";
    windclass.lpszClassName = szAppName ;

    if (!RegisterClass (&windclass))
    {
        return 0 ;
    }

    hwnd = CreateDialog (hInstance, szAppName, 0, NULL) ;

    InitCommonControls();
    ShowWindow (hwnd, iCmdShow);
    UpdateWindow(hwnd);
    PostMessage(hwnd, WM_COMMAND, IDC_INIT,0); //rufe diese funktion auf -> init()
    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage (&msg) ;
        DispatchMessage (&msg) ;
    }
    return msg.wParam ;
}

void Init ( HWND hwnd)
{
}

//Abfragen zum im Hauptfenster befindlichen Knöpfe + Buttons etc. ...
LRESULT CALLBACK WindProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_CREATE:
        break;

        case WM_DESTROY:
            PostQuitMessage(0);
        break;

        case WM_COMMAND:
        {
            switch( LOWORD( wParam ) )
            {
                case IDC_INIT:
                {
                    Init(hwnd);
                }
                break;

                case IDC_MELDEN:
                {
                    MessageBox(hwnd, "Ich bin eine wichtige Meldung!!!", "Wichtig!",
                    MB_ICONINFORMATION);
                }
                break;
            }
        }
        return 0 ;
    }

    return DefWindowProc (hwnd, message, wParam, lParam) ;
}

Wie zu sehen, wurde der Code ein wenig erweitert. In der Funktion

LRESULT CALLBACK WindProc (...)

taucht ein neuer Eintrag auf:

case IDC_MELDEN:
{
    MessageBox(hwnd, "Ich bin eine wichtige Meldung!!!", "Wichtig!", MB_ICONINFORMATION);
}
break;

Erklärung: “case IDC_MELDEN:” wird aktiviert, wenn der Handle “IDC_MELDEN”, also unser Button, betätigt wurde. Der Rest wird schon bald Routine werden. Jetzt noch die Erklärung der Parameter der MessageBox:

MessageBox(hwnd, "Ich bin eine wichtige Meldung!!!", "Wichtig!", MB_ICONINFORMATION);

hwnd - das handle zum Hauptfenster. Wozu gehört die MessageBox? Das macht jetzt noch wenig Sinn, wird aber umso wichtiger, wenn mehrere Dialogfenster zusammenarbeiten sollen.

Der 1. und 2. String in “ eingefasst, wird in der Box dargestellt. Der 1. String beschreibt den Inhalt in der Box, der 2. String ist der Text in der Titelleiste der Box. Als Strings/Texte können auch wie bei printf das für Zeilenumbrüche oder usw. verwendet werden.

Das MB_ICONINFORMATION bezeichnet das kleine i als Icon in der MessageBox. Eine Liste aller Icons/Bilder für eine MessageBox gibts hier. Dort sind auch noch weiterführende Informationen zur Messagebox. Die schauen wir uns aber später noch an.