Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Lutz Ifers WinAPI Tutorial

von RedakteurMODSeite 5 von 16

Kapitel 2.2: Filled Shapes
Kap2.2

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 Befehlsreferenzeintragrgba-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: Externer Link!Filled Shapes, Externer Link!CreateSolidBrush, Externer Link!GetSysColorBrush, Externer Link!GetStockObject, Externer Link!Ellipse, Externer Link!RoundRect, Externer Link!Rectangle
In der FreeBasic-Referenz: BefehlsreferenzeintragEND, BefehlsreferenzeintragWITH

 

Gehe zu Seite Gehe zu Seite  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 17.09.2009 von RedakteurMOD angelegt.
  • Die aktuellste Version wurde am 17.07.2013 von AdministratorSebastian gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen