Tutorial
Lutz Ifers WinAPI Tutorial
von MOD | Seite 5 von 16 |
Kapitel 2.2: Filled Shapes
Die WinApi-Befehle für die Freebasic-Funktionen line(...),BF und circle unterscheiden sich von denen aus letztem Kapitel dadurch, dass sie für Windows eine "Fläche" darstellen, und daher nicht mit einem Pen (Stift) sondern Brush (Pinsel) gezeichnet werden. Ein solcher Brush kann eine einfache Farbe, ein Farbverlauf, ein Muster oder eine Bitmap sein. Aus Einfachheitsgründen beschäftigen wir uns hier nur mit einfachen Farben, Bitmaps werden in Kapitel 2.4 behandelt.
Das Hauptprogramm ist wie üblich das Selbe:
''' Lutz Ifers WinAPI-Tutorial
''' Lizenz: WTFPL
'''
''' Kapitel 2.2 - "Filled Shapes"
#include "windows.bi"
const ProgrammName = "Filled Shapes"
declare function Fenster(byval hWnd as HWND, byval message as UINTEGER,_
byval wParam as WPARAM, byval lParam as LPARAM) as LRESULT
dim as WNDCLASS wcMeinFenster
with wcMeinFenster
.style = CS_HREDRAW or CS_VREDRAW
.lpfnWndProc = ProcPtr(Fenster)
.cbClsExtra = 0
.cbWndExtra = 0
.hInstance = GetModuleHandle(NULL)
.hCursor = LoadCursor(NULL, IDC_ARROW)
.hIcon = LoadIcon(NULL, IDI_APPLICATION)
.hbrBackground = GetStockObject(WHITE_BRUSH)
.lpszClassName = StrPtr(ProgrammName)
.lpszMenuName = NULL
end with
RegisterClass @wcMeinFenster
dim as HWND hMeinFenster = CreateWindow(_
ProgrammName, "Titelzeile", WS_OVERLAPPEDWINDOW,_
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,_
NULL, NULL, GetModuleHandle(NULL), NULL)
ShowWindow hMeinFenster, SW_NORMAL
UpdateWindow hMeinFenster
dim as MSG msg
do while getmessage(@msg, NULL, 0, 0) <> 0
DispatchMessage @msg
loop
end msg.wParam
In der Callback-Funktion definieren wir nun statt der Pens Brushes (Wie erwähnt, vorerst mal nur "solid", also einfarbige Brushes). Dies können wir entweder durch direktes Eingeben des 24Bit-Wertes der Farbe tun, oder das rgb-Makro verwenden, bei dem allerdings beachtet werden sollte, das Windows kein rgb sondern bgr-Format verwendet. In neuen FreeBasic-Versionen muss hier allerdings das rgba-Makro verwendet und der Alphachannel auf 0 gesetzt werden. Die restlichen Angaben im bgr-Format bleiben gleich.
function Fenster(byval hWnd as HWND, byval message as UINTEGER,_
byval wParam as WPARAM, byval lParam as LPARAM) as LRESULT
select case message
case WM_DESTROY
PostQuitMessage 0
return 0
case WM_PAINT
dim as PAINTSTRUCT pnt
dim as HDC hDC = BeginPaint(hWnd, @pnt)
dim as HBRUSH hbrushRot = CreateSolidBrush(RGBA(0,0,255,0))
dim as HBRUSH hbrushBlau = CreateSolidBrush(RGBA(255,0,0,0))
dim as HBRUSH hbrushBGR = GetSysColorBrush(COLOR_BACKGROUND)
Für den dritten Brush haben wir eine Funktion verwendet, die uns die Farbe des Desktophintergrundes zurückgibt. Weitere vordefinierte Werte sind zum Beispiel die Farbe des Fensterhintergrundes (COLOR_WINDOW) oder die Farbe des Fenstertextes (COLOR_WINDOWTEXT). Die Funktion Rectangle ist, denke ich, selbsterklärend.
SelectObject hDC, hbrushRot
Rectangle hDC, 10, 10, 300, 300
SelectObject hDC, hbrushBlau
Rectangle hDC, 20, 20, 200, 200
SelectObject hDC, hbrushBGR
Rectangle hDC, 100, 100, 280, 280
SelectObject hDC, GetStockObject(LTGRAY_BRUSH)
Rectangle hDC, 150, 150, 250, 250
Für das letzte Rechteck verwenden wir einen vordefinierten Brush, den wir nicht löschen brauchen. Die beiden anderen Formen, die ich hier besprechen möchten, sind Ellipse und RoundRect, die eine Ellipse samt der Sonderform Kreis und ein Rechteckt mit abgerundeten Ecken zeichnet. Die Deklarationen lauten:
declare function Ellipse(hDC, nLeft, nTop, nRight, nBottom) as BOOL
declare function RoundRect(hDC, nLeft, nTop, nRight, nBottom, nWidth, nHeight) as BOOL
Wobei nWidth und nHeight der Breite und Höhe der Ellipsen in den Ecken entsprechen. Diese Formen (neben denen es noch eine Reihe weitere, wie Tortenstücke oder Sekanten gibt) zeichnen wir ohne Füllung, daher mit dem Null-Brush. Nach dem wir fertig sind, löschen wir wie üblich alle erstellten Objekte:
SelectObject hDC, GetStockObject(NULL_BRUSH)
Ellipse hDC, 20, 210, 90, 280
RoundRect hDC, 210, 20, 290, 90, 16, 16
DeleteObject hbrushBGR
DeleteObject hbrushRot
DeleteObject hbrushBlau
EndPaint(hWnd, @pnt)
return 0
end select
return DefWindowProc(hWnd, message, wParam, lParam)
end function
Links:
In der MSDN: Filled Shapes, CreateSolidBrush, GetSysColorBrush, GetStockObject, Ellipse, RoundRect, Rectangle
In der FreeBasic-Referenz: END, WITH
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|