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. |