______________________________________________________________________
// 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
|