ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 24.03.2000

Diese Seite wurde zuletzt aktualisiert am 24.03.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Moderne Malerei

Zurück...


Anzeige

(-hg) mailto:hg_ucldraw@aboutvb.de

Sicher kennen Sie die "uralten" Basic-Methoden zum Zeichnen von Linien, Rechtecken, Ellipsen und Punkten: Line, Circle und PSet. Mit diesen Methoden und deren für das heutige Visual Basic recht befremdlich wirkenden Syntax können Sie jedoch nach wie vor in Forms, PictureBoxen, UserControls, PropertyPages und UserDocumenten "herummalen".

Allerdings scheinen sich diese Methoden einer "vernünftigen" programmgesteuerten Handhabung zu entziehen. Vor allem die optionalen Steps-Schlüsselwörter vor den in Klammern gesetzten Koordinaten-Angaben, aber auch die Kennungen B und BF für ein Rechteck bzw. ein gefülltes Rechteck bei der Line-Methode können Sie nicht per Code über Variablen kontrollieren. Da zudem bei einem UserControl diese Methoden nicht öffentlich sind, und für den Fall, dass Sie eine Komponente schreiben möchten, die solche Zeichen-Methoden zur Verfügung stellt, bietet es sich an, die Syntax aus der Basic-Steinzeit auf "moderne" Weise umzuformulieren:

Public Enum StepsConstants
  cpsAbsolute
  cpsSteps
End Enum

Public Enum LineBoxConstants
  lbLine
  lbBox
  lbBoxFilled
End Enum

Public Sub DrawCircle( _
 Optional ByVal Steps As StepsConstants, _
 Optional ByVal X As Single, Optional ByVal Y As Single, _
 Optional ByVal Radius As Single, _
 Optional ByVal Color As Long = -1, _
 Optional ByVal RStart As Single, Optional ByVal REnd As Single, _
 Optional ByVal Aspect As Single)

Public Sub DrawLine(Optional ByVal Steps1 As StepsConstants, _
 Optional ByVal X1 As Single, _
 Optional ByVal Y1 As Single, _
 Optional ByVal Steps2 As StepsConstants, _
 Optional ByVal X2 As Single, Optional ByVal Y2 As Single, _
 Optional ByVal Color As OLE_COLOR = -1, _
 Optional ByVal Box As LineBoxConstants)

Public Sub DrawPoint(Optional ByVal Steps As StepsConstants, _
 Optional ByVal X As Single, Optional ByVal Y As Single, _
 Optional ByVal Color As OLE_COLOR = -1)

Soweit bereitet dies keine Schwierigkeiten - die Parameter und deren Reihung sieht einigermaßen vertraut aus. Und da sie alle optional sind, können Sie sich wohl auch vorstellen, dass alle bisher gewohnten Kombinationen damit möglich sind. Lediglich eine kleine Inkonsequenz in Visual Basic zwingt uns dazu, die Methoden-Namen zu ändern. Bei der Line-Methode wäre es zwar nicht notwendig - "Line" als Methoden-Name würde von VB akzeptiert. Wahrscheinlich wurde dafür schon wegen des Line-Steuerelements gesorgt, während man die Freigabe der Schlüsselwörter "Circle" und "PSet" für überflüssig gehalten hat. Die Methoden lauten also DrawCircle, DrawPoint und der Einheitlichkeit halber eben DrawLine. Natürlich können Sie die Methoden auch anders taufen, ganz nach Ihrem Geschmack... Außerdem ist es selbstverständlich nicht möglich einen Parameter "End" zu nennen, wie es bei der Circle-Methode angefallen wäre, um den Bezeichnungen der alten Parameter in der Dokumentation zu entsprechen. Der End-Parameter wird somit "REnd" genannt, und analog dazu der Start-Parameter "RStart", da wir es hier mit Radians-Werten zu tun haben.

Innerhalb der Prozeduren zu diesen Methoden könnten Sie jetzt in diversen If...Then- oder Select...Case-Verzweigungen die Parameter-Kombinationen auswerten und je nach dem Code-Zeilen in der alten Syntax schreiben. Aber das wird eine ziemlich vertrackte Angelegenheit - ich habe das vor etlichen Jahren schon einmal durchgespielt und schon längst dem großen Code-Mülleimer überantwortet. Denn immerhin haben sich die VB-Fortentwickler doch bemüht, die alten Zeichen-Methoden auf die heutige Prozedur- und damit COM-Basis zu stellen. Doch ist das erstens nirgendwo kommentiert - Sie werden nur in den Kurzbeschreibungen der Methoden im Objekt-Katalog über die ungewohnt aussehenden Deklarationen stolpern.

Sub Circle(Step As Integer, X As Single, Y As Single, _
 Radius As Single, Color As Long, Start As Single, End As Single, _
 Aspect As Single)

Sub Line(Flags As Integer, X1 As Single, Y1 As Single, _
 X2 As Single, Y2 As Single, Color As Long)

Sub PSet(Step As Integer, X As Single, Y As Single, Color As Long)

Sieht doch schon ganz ordentlich aus, meinen Sie? Nun, probieren Sie diese Methoden-Aufrufe doch einmal aus. Sie werden sich wundern, warum Sie als Farbe angeben können, was Sie wollen - es wird stur in der voreingestellten Vordergundfarbe gezeichnet. Bei Circle und PSet ist der Steps-Parameter ja noch naheliegend - die Übergabe einer 1 entspricht der früheren Angabe des Schlüsselworts Steps. Aber was hat es mit dem Flags-Parameter der Line-Methode auf sich? Sie werden schon ganz richtig vermuten, dass hier mit irgendwelchen Werten sowohl die beiden Steps-Schlüsselwörter als auch die Rechteck-Flags der Line-Methode nachgebildet werden. Und sicher werden Sie auch relativ schnell herausgefunden haben, dass ein Wert, dessen 5. Bit (= 16) gesetzt ist, ein offenes Rechteck zeichnen lässt, wie ebenso der das 6.Bit (= 32) für ein gefülltes Rechteck zuständig ist. Aber über das Spiel der übrigen Bits und deren Auswirkungen auf das Steps-Verhalten der beiden Koordinaten-Paare X1/Y1 und X2/Y2 werden Sie wohl auch erst einmal den Kopf schütteln.

Ich mache es kurz, ohne Sie mit meinen Versuchsreihen und dem mir davon bereiteten Kopfzerbrechen zu behelligen. Grundsätzlich sollte das 3. Bit (= 4) gesetzt sein - dann werden die beiden Koordinaten als absolute Angaben angesehen. Das 1. Bit (= 1) macht das erste Koordinaten-Paar relativ zur aktuellen CurrentX-/CurrentY-Position - entspricht also dem Steps-Schlüsselwort. Das 4. Bit (= 8) entspricht dem Steps-Schlüsselwort vor dem zweiten Koordinaten-Paar. Damit ergibt sich:

Absolut X1/Y1 - Absolut X2/Y2 =  4
  Steps X1/Y1 - Absolut X2/Y2 =  5
Absolut X1/Y2 -   Steps X2/Y2 = 12
  Steps X1/Y1 -   Steps X2/Y2 = 13

Das sieht zwar etwas seltsam aus, funktioniert aber. Bleibt nur die Frage, wie die VB-Fortentwickler auf diese Bitfolgen gekommen sind, und es bleibt weiterhin die Frage, wie sie (zunächst einmal) die Line-Methode dazu bringen, in der gewünschten, angegebenen Farbe zu zeichnen.

Als Antwort auf die erste Frage kann ich Ihnen nur meine Vermutungen anbieten, die sich aus der Antwort auf die zweite Frage ergeben. Diese lautet nämlich: Das Geheimnis der Farbe versteckt sich in dem übersprungenen 2. Bit (= 2). Ist dieses gesetzt, wird die angegebene Farbe verwendet. Da dies auch das Farb-Problem bei der Circle- und bei der PSet-Methode löst, während auch dort das erste Bit, also die 1, für die Steps-Angabe zuständig ist, ergibt sich die Vermutung: Das erste Bit ist vergeben für die Steps-Angabe des (ersten) Koordinaten-Paares; das zweite Bit wird für die Farbe benötigt; da im Gegensatz zu Circle und PSet die Line-Methode über zwei Koordinaten-Paare verfügt, also ein nicht gesetztes 1. Bit nicht als Angabe der absoluten Position für beide Paare gleichzeitig dienen kann, werden (zwar von der Logik her gegensinnig, aber immerhin) die nächsten Bits, das 3. und 4., hierfür verwendet . Die Rechteck-Flags finden dann eben ihren Platz im 5. und 6. Bit.

Meine obenstehenden Neuformulierungen der Zeichen-Methoden verzichten auf eine derartige Bit-Schusterei. Sie enthalten dort entsprechende Parameter, wo Sie sie auch aus Gewohnheit erwarten, und die obskuren Flags werden daraus erst in den Prozeduren zusammen gesetzt.

Schauen wir uns zuerst die Ausfürhung der DrawCircle-Methode näher an:

Public Sub DrawCircle( _
 Optional ByVal Steps As StepsConstants, _
 Optional ByVal X As Single, Optional ByVal Y As Single, _
 Optional ByVal Radius As Single, _
 Optional ByVal Color As Long = -1, _
 Optional ByVal RStart As Single, Optional ByVal REnd As Single, _
 Optional ByVal Aspect As Single)

  Dim nFlags As Integer
  
  nFlags = Abs(CBool(Steps))
  If Color = -1 Then
    nFlags = nFlags
  Else
    nFlags = nFlags Or 2
  End If
  With UserControl
    .Circle nFlags, X, Y, Radius, Color, RStart, REnd, Aspect
  End With
End Sub

Die Enumerationen haben Sie bereits oben bei der Vorstellung der Methoden-Formulierungen gesehen. Die DrawCircle-Methode ist tolerant und wertet jeden Wert ungleich 0 als Steps-Angabe. Ist eine Farbe übergeben worden, d.h. die Voreinstellung -1 ist überschrieben worden, wird das zweite Bit gesetzt - die Farbe wird verwendet.

Dass Sie die alten Methoden-Aufrufe nicht in einem With...End With-Konstrukt verwenden können, werden Sie wissen (und sich wohl wie jeder hin und wieder darüber ein wenig geärgert haben) - in der VB-Hilfe steht das auch ausdrücklich. Doch genau so, wie die VB-Hilfe uns die alternativen Methoden unterschlägt, unterschlägt sie uns natürlich auch, dass diese neuen Methoden eben nur (!) in einem With...End With-Konstrukt verwendet werden können. Nur so kann wohl VB unterscheiden, welche Art des Aufrufs gemeint ist.

Die DrawPoint-Methode als Ersatz für PSet sieht im Prinzip genau so aus, wie DrawCircle:

Public Sub DrawPoint(Optional ByVal Steps As StepsConstants, _
 Optional ByVal X As Single, Optional ByVal Y As Single, _
 Optional ByVal Color As OLE_COLOR = -1)

  Dim nFlags As Integer

  nFlags = Abs(CBool(Steps))
  If Color = -1 Then
    nFlags = nFlags
  Else
    nFlags = nFlags Or 2
  End If
  With UserControl
    .PSet nFlags, X, Y, Color
  End With
End Sub

Bei der DrawLine-Methode kommt noch die Rechteck-Flag-Auswertung hinzu und die Steps-Auswertung ist ein wenig vertrackter.

Public Sub DrawLine(Optional ByVal Steps1 As StepsConstants, _
 Optional ByVal X1 As Single, _
 Optional ByVal Y1 As Single, _
 Optional ByVal Steps2 As StepsConstants, _
 Optional ByVal X2 As Single, Optional ByVal Y2 As Single, _
 Optional ByVal Color As OLE_COLOR = -1, _
 Optional ByVal Box As LineBoxConstants)

  Dim nFlags As Integer
  
  nFlags = Abs(CBool(Steps1)) + (((Abs(CBool(Steps2)) * 2) + 1) * 4)
  If Color >= 0 Then
    nFlags = nFlags Or 2
  End If
  Select Case Box
    Case lbBox
      nFlags = nFlags Or 16
    Case lbBoxFilled
      nFlags = nFlags Or 32
  End Select
  With UserControl
    .Line nFlags, X1, Y1, X2, Y2, Color
  End With
End Sub

Die Zeile der Steps-Auswertung errechnet aus den (ebenfalls tolerant gehabten) beiden Steps-Parametern den benötigten der 4 Bit-Kombinationswerte 4, 5, 12 oder 13 - das Knacken der Funktionsweise überlasse ich Ihnen allerdings als kleine Knobelaufgabe...


Beispiel-Projekt UserControlDraw (ucldraw.zip - ca. 3,8 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikel

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer