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.
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 functionLinks:
In der MSDN:  Filled Shapes,
Filled Shapes,  CreateSolidBrush,
CreateSolidBrush,  GetSysColorBrush,
GetSysColorBrush,  GetStockObject,
GetStockObject,  Ellipse,
Ellipse,  RoundRect,
RoundRect,  Rectangle
Rectangle
In der FreeBasic-Referenz:  END,
END,  WITH
WITH
| Zusätzliche Informationen und Funktionen | |||||||
|---|---|---|---|---|---|---|---|
| 
 
 | |||||||

 Wer ist online?
 Wer ist online? Buchempfehlung
 Buchempfehlung
 FreeBASIC-Chat
 FreeBASIC-Chat
 FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!
			FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us! Gehe zu Seite
 Gehe zu Seite  
 Bearbeiten
 Bearbeiten Versionen
 Versionen