Tutorial 2_3

Das GDI

______________________________________________________________________
// 2_3 Das GDI

/*  Basis dieses Programmes ist das Programm 2_2. Der Übersichtlichkeit
    halber wurden dessen ganze umfangreiche Kommentare entfernt. Nur die
    neuen Codeteile haben also noch Kommentare! */



#define WIN32_LEAN_AND_MEAN
#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wparam,
                            LPARAM lparam)
{
    HDC hdc;
    RECT rect;
    const char text[] = "Hallo Welt";

    switch(message)
    {
    case WM_MOVE:
        {
            hdc = GetDC(hwnd); /* Gerätekontext (DeviceContext) für das
                                  Fenster besorgen, damit wir dort Grafik
                                  (wozu auch Text zählt) darstellen können,
                                  Windows muss schließlich wissen in welches
                                  Fenster oder ob wir gar über den Drucker
                                  zeichnen wollen */


            GetClientRect(hwnd, &rect); // den gesamten Arbeitsbereich in der
            // Koordinatenstruktur rect speichern



            // hellblaues gefülltes Rechteck über den gesamten Bildschirm

            // Pinsel auswählen, der für das Malen des Rechteckes benötigt
            // wird. Rot-Grün-Blau-Wert der Farbe zuweisen, die er haben soll
            SelectObject(hdc, CreateSolidBrush(RGB(25, 125, 225)));
            // gefülltes Rechteck der Koordinaten der Struktur rect mit
            // diesem Pinsel zeichnen
            FillRect(hdc, &rect, CreateSolidBrush(RGB(25, 125, 225)));
            // Pinsel löschen
            DeleteObject(CreateSolidBrush(RGB(25, 125, 225)));



            // rosa Text

            // SetBkMode(hdc, TRANSPARENT); // sorgt für transparenten
            // Hintergrund des Textes, wenn er erwünscht wird
            SetTextColor(hdc, RGB(255, 0, 255)); // Textfarbe ändern
            TextOut(hdc, rect.right/2 - 40, rect.bottom/2 - 10,
                    text, strlen(text)); // Text in der Mitte des Arbeits-
            // bereichs ausgeben

            /* mit CreateFont() kann man noch die Schriftart ändern, die
               Behandlung der zahlreichen Parameter dieser Funktion fällt
               aber der Konzentration auf das Wesentliche zum Opfer */



            // rotes nicht gefülltes Rechteck
            // Koordinaten von rect ändern
            rect.bottom = 150;
            rect.left = 100;
            rect.right = 300;
            rect.top = 100;
            // nicht gefülltes Rechteck mit anderem Pinsel und den neuen
            // rect-Koordinaten zeichnen
            SelectObject(hdc, CreateSolidBrush(RGB(255, 0, 0)));
            FrameRect(hdc, &rect, CreateSolidBrush(RGB(255, 0, 0)));
            DeleteObject(CreateSolidBrush(RGB(255, 0, 0)));



            // grüne dicke Linie und grüner dicker Kreis mit Lücke

            /* Statt einem Pinsel benötigen wir diesmal einen Stift
               PS_SOLID steht für eine durchgezogene Linie, Parameter 2 gibt
               deren Dicke in Pixeln an und Paramter 3 ist schon bekannt */
            SelectObject(hdc, CreatePen(PS_SOLID, 5, RGB(0,255,0)));
            // Anfangsposition für die Linie (Parameter 2 für X-Achse, 3 für
            // Y)
            MoveToEx(hdc, 50, 50, NULL);
            // Endpunkt der Linie (Gerätekontext (=DC), x, y)
            LineTo(hdc, 300, 200);
            /* ein Ellipsenbogen (DC, linke Ecke, obere, rechte, untere und 4
               Parameter für die Begrenzung) An der Stelle, wo eine gedachte
               Linie vom Kreismittelpunkt zu den Parametern 6 && 7 (x && y)
               die Ellipse schneidet, beginnt der Ellipsenbogen, an der
               Schnittstelle zwischen Ellipse und der gedachten Linie vom
               Mittelpunkt zu den Parametern 8 && 9 ändet der Ellipsenbogen.
               Eine ganze Ellipse hat man also nur, wenn die Parameter 8 && 9
               den Parametern 6 && 7 entsprechen. Mit entsprechenden
               Parametern können natürlich auch Kreis oder Kreisbogen
               gezeichnet werden, die nur Spezialfälle sind */
            Arc(hdc, 250, 0, 350, 150, 250, 300, 0, 0);
            // Stift löschen
            DeleteObject(CreatePen(PS_SOLID, 5, RGB(0,255,0)));



            // rote  gestrichelte Linie

            // PS_DASH sorgt für die Strichelung (Parameter 2 darf bei
            // Strichelung, Pünktchenlinien, etc. nur 1 sein)
            SelectObject(hdc, CreatePen(PS_DASH, 1, RGB(255,0,0)));
            /* wenn nicht durch MoveToEx() ein neuer Stertpunkt für die Linie
              gesetzt wird, wird der Endpunkt der letzten Linie als
              Startpunkt der nächsten benutzt*/ 
            LineTo(hdc, 100, 200);
            DeleteObject(CreatePen(PS_DASH, 1, RGB(255,0,0)));



            // blaue Strich-Punkt-Punkt-Linie und gleichartige Ellipse

            // PS_DASHDOTDOTDOT sogt natürlich für Strich-Punkt-Punkt
            // Es gibt auch DOT, DASHDOT und NULL (unsichtbar)
            SelectObject(hdc, CreatePen(PS_DASHDOTDOT, 1, RGB(0,0,255)));
            LineTo(hdc, 50, 50);
            Arc(hdc, 0, 225, 300, 275, 0, 0, 0, 0);
            DeleteObject(CreatePen(PS_DASHDOTDOT, 1, RGB(0,0,255)));

            ReleaseDC(hwnd, hdc);
            return(0);
        } break;

    case WM_DESTROY:
        {PostQuitMessage(0);
        return(0);
        } break;

    default:break;
    }

    return (DefWindowProc(hwnd, message, wparam, lparam));
    
}

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprevinst,
                  LPSTR lpcmdline, int ncmdshow)
{

    WNDCLASSEX winclass;
    HWND       hwnd;
    MSG        message;
    const char szclassname[] = "USF 4 ever";

    winclass.cbSize        = sizeof(WNDCLASSEX);
    winclass.style         = CS_HREDRAW | CS_VREDRAW;
    winclass.lpfnWndProc   = WindowProc;
    winclass.cbClsExtra    = 0;
    winclass.cbWndExtra    = 0;
    winclass.hInstance     = hinst;
    winclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    winclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
    winclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    winclass.lpszMenuName  = NULL;
    winclass.lpszClassName = szclassname;
    winclass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    if (!RegisterClassEx(&winclass))
        return(0);

    if (!
            (hwnd = CreateWindowEx(

                                    NULL,
                                    szclassname,
                                    "Ein Windows Fenster",
                                    WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                                    0,0,
                                    400,300,
                                    NULL,
                                    NULL,
                                    hinst,
                                    NULL
                                )
            )
        )
        return(0);

    while(GetMessage(&message,NULL,0,0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
    return message.wParam;
}
______________________________________________________________________
Zurück