Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » FAQ C / C++ (WinAPI, Konsole) » Gdi Programmierung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.01.2003, 16:12 Uhr
void*
Generic Pointer
(Operator)


Erstellt von Uwe
Bevor in einem API-Programm unter Windows Funktionen zum Zeichnen ausgeführt werden können, muß das Programm einen Gerätekontext DC = Device Context

für das jeweilige Ausgabegerät (Bildschirm oder Drucker) anfordern. Nach erfolgter Ausgabe muß der Grätekontext wieder freigegeben werden. Zum Ermitteln eines Kontextes gibt es 3 Möglichkeiten BeginPaint/EndPaint, GetDC/ReleaseDC und GetWindowDC/ReleaseDC.

Die nachfolgenden Ausführungen beschäftigen sich mit den ersten beiden Möglichkeiten. BeginPaint/EndPaint:

Diese Methode wird in der WM_PAINT

Nachricht verwendet. GetDC/ReleaseDC:

Diese Methode wird dort verwendet, wo nicht BeginPaint/EndPaint zum Einsatz kommt. Wir übernehmen aus dem ersten Beispiel die WinMain

und die CALLBACK

Funktionen. Die CALLBACK

Funktion ändern wir wie folgt um:

C++:
#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        PSTR szCmdLine,
                        int iCmdShow)
        {
                MSG msg;

                WNDCLASSEX wc={0};

                wc.cbSize= sizeof (WNDCLASSEX);
                static char szAppName[]= "GDI-Programmierung";
                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 = szAppName;
                wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

                RegisterClassEx(&wc);

                HWND hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,
                                           szAppName,
                                           "GDI-Programmierung",
                                           WS_OVERLAPPEDWINDOW,
                                           CW_USEDEFAULT,
                                           CW_USEDEFAULT,
                                           CW_USEDEFAULT,
                                           CW_USEDEFAULT,
                                           NULL,
                                           NULL,
                                           hInstance,
                                           NULL);

                ShowWindow(hWnd, iCmdShow);
                UpdateWindow(hWnd);

                while (GetMessage(&msg, NULL, 0, 0)== TRUE)
                {
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }

                return msg.wParam;
        }

LRESULT CALLBACK WndProc (HWND hwnd,
                          UINT message,
                          WPARAM wParam,
                          LPARAM lParam)

{
        HDC hdc;
        PAINTSTRUCT paintstruct;
        static int xCoordinate,yCoordinate;

        switch(message)
         {
                // Hier wird der Zeichenbreich festgelegt
                case WM_SIZE:

                        xCoordinate = LOWORD(lParam);
                        yCoordinate = HIWORD(lParam);
                        return 0;

                case WM_PAINT:

                        hdc = BeginPaint(hwnd, &paintstruct);

                        // umschließendes Rechteck

                        Rectangle(hdc,
                                  xCoordinate / 8,
                                  yCoordinate / 8,
                                  7 * xCoordinate / 8,
                                  7 * yCoordinate / 8);

                        // Ausgangspunkt für die Linie

                        MoveToEx(hdc, 0, 0, NULL);

                        // Linie zeichen

                        LineTo(hdc, xCoordinate, yCoordinate);

                        // nochmals

                        MoveToEx(hdc,0,yCoordinate,NULL);

                        LineTo(hdc,xCoordinate,yCoordinate);

                        // Rechteck mit runden Ecken

                        RoundRect(hdc,
                                  xCoordinate /8,
                                  yCoordinate /8,
                                  7 * xCoordinate / 8,
                                  7 * yCoordinate / 8,
                                  xCoordinate / 8,
                                  yCoordinate / 8);
                        EndPaint(hwnd, &paintstruct);
                        return 0;

                 case WM_DESTROY:

                         PostQuitMessage(0);
                         return 0;
                }

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




Bei der Größenänderung des Fensters wird die Figur neu berechnet. Verantwortlich hierfür ist die Windowsnachricht WM_SIZE .

Folgende GDI Funktionen wurden verwendet:
MoveToEx

Diese Funktion legt den Ausgangspunkt für das Zeichnen einer Linie fest. Syntax: MoveToEx(Gerätekontext, x-Wert, y-Wert, NULL)

Parameter vier stammt aus 16-Bit Zeiten wird vernachlässigt also auf "NULL" gesetzt. LineTo

Zeichnet die eigentliche Linie Syntax: LineTo(Gerätekontext, x-Wert, y-Wert)

Rectangle

Zeichnet ein umschließendes Rechteck mit den der Koordinaten zweier Punkte. Syntax: Rectangle(Gerätekontext, x-Wert links, y-Wert oben, x-Wert rechts, y-Wert unten)

RoundRect
Zeichnet ein umschließendes Rechteck mit runden Ecken. Zum Abrunden wird die Größe einer Ellipse verwendet. Syntax: RoundRect(Gerätekontext, x-Wert links, y-Wert oben, x-Wert rechts, y-Wert unten, Breite der Ellipse, Höhe der Ellipse)

Weitere GDI-Funktionen Ellipse

Zeichnet eine Ellipse, genauso wie bei Rectangle. Syntax: Ellipse(Gerätekontext, x-Wert links, y-Wert oben, x-Wert rechts, y-Wert unten)

SetPixel

Die Funktion färbt ein einzelnes Pixel in der als Parameter übergebenen Farbe ein. Syntax: SetPixel(Gerätekontext, x-Wert, y-Wert, Farbe)

Der Parameter Farbe ist eine Variable des Typs COLORREF. Dies ist ein 32-Bit-Wert vom Typ Integer. Zur Festlegung der Farbe wird das Macro RGB(r,g,b) genutzt. COLORREF rot = RGB(255,0,0);
SetPixel(hdc, 0,0, rot);

Zum Abfragen eines Farbwertes kann folgende Funktion genutzt werden: COLORREF color;
color = GetPixel(hdc, 0, 0);


Arc,
Chord,
Pie

Die Arc - Funktionen zeichnet eine Kreisbogen, Chord - ein Kreissegment und Pie - einen Kreissektor . Der Syntax ist bei allen 3 Funktionen gleich: Die ersten Parameter 2,3,4 und 5 legen eine Ellipse fest. Der 6. und 7. Parameter legt den Startpunkt für eine Linie fest, die zum Mittelpunkt der Ellipse führt, die letzten 2 Parameter legen den Endpunkt einer weiteren Linie fest, welche sich vom Mittelpunkt entfernt. Arc(hdc, xBereich / 8,
yBereich / 8, 7 * xBereich / 8,
7 * yBereich / 8, xBereich / 2,
0, 0, yBereich / 2);


Soweit zum Thema Zeichenfunktionen

-- edit: Pablo. Unnötige [ /cpp ] tags entfernt --
--
Gruß
void*

Dieser Post wurde am 06.08.2003 um 16:54 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ FAQ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: