GDI-Aufruf

Schnelle Grafikroutinen des GDI (Graphics Device Interface) von Windows sind ohne größeren Aufwand in VB aufrufbar. Diese Routinen befinden sich in Bibliotheksdateien (Kennung .dll), die zu Windows gehören. Bevor sie genutzt werden können, müssen sie in dem VB-Programm deklariert werden. Dabei leistet die Entwicklungsumgebung Unterstützung.

Deklaration und Aufruf

  •  Das Programmprojekt muß einen "Modul" enthalten, der, wenn noch nicht vorhanden über "Projekt" / "Modul hinzufügen" geladen wird. Module sind für Deklarationen bestimmt, wie die der Windows GDI, für die Deklaration von Variablen, die im ganzen Projekt gelten sollen, für Sub's und Funktionen, die von unterschiedlichen Formularen eines Projektes aufgerufen werden sollen. Wenn ein Modul eingefügt worden ist, sollte der Programmstart über dieses Modul erfolgen. Dazu dient ein Sub Main, das sich auf dem Modul befindet und beispielsweise die Werte wichtiger Parameter setzt und das Startformular aufruft.
  •  Die Deklaration einer Windows-Funktion muß den Namen und die Aufrufparameter enthalten. Man kann sie, wenn bekannt, im Deklarationsteil des Moduls eintragen, bequemer ist jedoch die Nutzung eines einzubindenden Katalogs: Unter "Add-Inns" wird mit dem "Add-Inn-Manager" der "VB API-Viewer" geladen. (API = Application Interface, die Gesamtheit der für den Anwender verfügbaren Windows-Funktionen).
  • Dieser Vorgang führt dazu, daß am Ende des "Add-Inn"-Menüs dieser "API-Viewer" ( = API-Angucker) angeboten wird. Öffnen dieses Viewers ergibt ein zunächst leeres Fenster. Unter "Öffnen" wähle man "Textdatei laden", im Ordner "VB5" / "Winapi" / "Win32Api.txt". Dazu die Option "Deklarationen". Es erscheinen einige hundert Windows-Funktionen, unter denen man die gesuchte auswählt. Mit "Kopieren" wird die Deklaration in die Zwischenablage übernommen. Man fügt nach Schließen des API-Viewers in den Deklarationsteil des Moduls ein und hat damit die Windowsroutine zur Verfügung.
  • Der Aufruf kann in zwei Formen erfolgen: a. mit einer Hilfsvariablen, die nach dem Aufruf meist eine Erfolgskennung (=1) oder Meldung eines Fehlers (=0) enthält. Es folgt die zuweisende Funktion mit den Aufrufparametern.
  • Beipiel: HilfsVar = GDI_Funktion( Par1,Par2, ...) oder b. mit Call GDI_Funktion (Par1, Par2, ...)
  • Etwa 1500 API-Funktionen sind verfügbar. Einige wichtige GDI-Funktionen: Chord (malt Kreisabschnitte), FloodFill (füllt beliebig berandete Flächen farbig oder mit Mustern), Pie (malt Kreisausschnitte / "Tortenstücke"), Polygon (Vielecke), Polyline (Linienzug aus Geradenstücken), Roundrect (Rechteck mit gerundeten Ecken). Für schnelle Verlagerung von Bildschirmausschnitten gibt es BitBlt (siehe Beispiel), StretchBlt verzerrt Bildbereichen.


  • Beispiel 1: BitBlitter

    Zur Windows-Funktion "BitBlt" (BitBlitter - Verschiebung von Bildbereichen) wird die folgende Deklaration kopiert und eingefügt:
     
    Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

    Das Schlüsselwort ByVal bedeutet, daß jeweils nur die Zahlenwerte, nicht die Variablenadressen übergeben werden. Es bedeuten die Konstanten in der Reihenfolge des Aufrufes: Windows-Handle des Zielbereiches, x- und y-Koordinate, Breite und Höhe des Zielbereiches, Windows-Handle des Quellbereiches, x- und y-Koordinate des Quellbereiches, Verknüpfungskonstante (Davon gibt es 255, nur wenige sind sinnvoll. VB kennt etwa 10. Am häufigsten dürfte "vbSrcCopy" verwendet werden, welche die einfache Kopie des Ursprungsbereiches auf den neuen bedeutet.
    Windows-Handles sind Objektnummern, die von Windows selbst vergeben und verwaltet werden und hier nur mit ihrer Bezeichnung auftauchen. Alle Variablen sind vom Typ Long und müssen für den Aufruf entsprechend bereitgestellt werden. Als Koordinateneinheit setzt Windows immer Pixel voraus, die deshalb entsprechend bestimmt werden müssen. Bequemer ist es, Windows-Routinen gleich im Grafikmodus 3 ( = vbPixels) einzubinden.
    Der Aufruf einer in Picture1 von x1, y1 nach x2, y2 zu verschiebenden Bildfläche der Breite dx und der Höhe dy lautet:
     
    BitBlt Picture1.hdc, x2, x2, dx, dy, Picture1.hdc, x1,y1, vbSrcCopy


    Beipiel 2: FloodFill

    Die farbige Füllung von Bildbereichen gelingt mit offiziellen VB-Befehlen nur dann, wenn der Bildbereich durch einen Line- oder Circle-Befehl gemalt wird oder aus einem Shape besteht. Damit sind nur wenige geometrische Flächen füllbar (z.B. keine Dreiecke). Hier hilft FloodFill. Deklaration erfolgt im Modul wie beschrieben:
     
    Declare Function FloodFill Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long

    Der Aufruf erfolgt wie meist mit dem "handle", der von Windows verwalteten Nummer des Steuerelemnts, das betroffen ist. Diese steht in der Variablen SteuerelementName.hdc stets zur Verfügung. Dann folgen die Koordinaten eines beliebigen Pixels im Inneren der zu füllenden Fläche. Hierzu vergleiche man das vorige Beispiel, der letzte Parameter verlangt die Farbe der Flächenberandung, an der der Füllvorgang enden soll. Gefüllt wird mit FillColor und in der Art, die FillStyle (8 Möglichkeiten) festlegen.
    Aufrufbeispiel: Glatte Füllung einer schwarz berandeten Fläche, die sich auf Picture1 befindet und die Pixelkoordinaten X,Y enthält, mit hellem Rot:
     
    ...
    Picture1.FillColor = QBColor(12)
    Picture1.FillStyle = 0
    Call FloodFill(Form1.Picture1.hdc, X, Y, QBColor(0))