VB 5/6-Tipp 0426: Dreiecke gefüllt und ungefüllt schnell zeichnen
von Klaus Langbein
Beschreibung
VB kennt keine Dreiecke, schade, muss man doch hier eigens die APIs bemühen. Die Eckpunkte des Dreiecks sind dabei beliebig wählbar, genauso wie Füll- und Rahmenfarbe. Prinzipiell läßt sich dieses Beispiel auf ein beliebiggroßes Vieleck erweitern, auch Parallelogramme, sowie im Raum gedrehte Rechtecke sind denkbar.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektdatei Project1.vbp ------------- '--------- Anfang Formular "Form1" alias FORM1.FRM --------- ' Steuerelement: Textfeld "txtKoord" (Index von 1 bis 6) ' Steuerelement: Schaltfläche "Command1" ' Steuerelement: Bildfeld-Steuerelement "Picture1" ' Steuerelement: Beschriftungsfeld "Label1" (Index von 1 bis 6) 'Autor: K. Langbein 'E-Mail: Klaus@activevb.de Private Type pointapi X As Long Y As Long End Type Private Declare Function Polygon Lib "gdi32" (ByVal hdc As _ Long, lpPoint As pointapi, ByVal nCount As Long) As Long Private Declare Function Polyline Lib "gdi32" (ByVal hdc As _ Long, lpPoint As pointapi, ByVal nCount As Long) As Long Private Sub Form_Load() Picture1.ForeColor = vbRed Picture1.FillColor = vbBlue End Sub Private Sub Command1_Click() Dim x1 As Long, y1 As Long Dim x2 As Long, y2 As Long Dim x3 As Long, y3 As Long 'die Werte aus den Eingabefeldern werden uebergeben. x1 = Val(txtKoord(1)) y1 = Val(txtKoord(2)) x2 = Val(txtKoord(3)) y2 = Val(txtKoord(4)) x3 = Val(txtKoord(5)) y3 = Val(txtKoord(6)) 'Man koennte natuerlich auch ein Feld dimensionieren um 'die Koordinaten zu uebergeben. Dieses Beispiel ist 'jedoch bewußt einfach gehalten, um auch für Anfänger 'verständlich zu sein. Picture1.Cls Call Draw_Triangle(Picture1, x1, y1, x2, y2, x3, y3, True) 'zum Vergleich auch mit False versuchen: 'Call Draw_Triangle(Picture1, x1, y1, x2, y2, x3, y3, False) End Sub Sub Draw_Triangle(ByRef pict As Control, x1 As Long, y1 As Long, _ x2 As Long, y2 As Long, x3 As Long, y3 As Long, filled As Boolean) Dim ret As Long Dim pt(1 To 3) As pointapi pt(1).X = x1 pt(1).Y = y1 pt(2).X = x2 pt(2).Y = y2 pt(3).X = x3 pt(3).Y = y3 If filled = True Then ret = Polygon(pict.hdc, pt(1), 3) Else ret = Polyline(pict.hdc, pt(1), 3) End If pict.Refresh End Sub '---------- Ende Formular "Form1" alias FORM1.FRM ---------- '-------------- Ende Projektdatei Project1.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 7 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von lars sasse am 30.09.2010 um 17:40
ich weis es kommt spät, aber ich hab mein fehler damals selbst gefunden. ich hab das refresh vergessen XD
die api zeichnet das bild mit autoredraw im speicher aber aktualisirt ja selber nicht die ausgabe.
Kommentar von Cromit am 04.02.2008 um 15:02
Hallo Lars,
vergiss nicht die AutoDraw-Eigenschaft auf True zu setzen.
Auch sollte das Hintergrundobjekt (Form, UserControl, ...) auf "Undurchsichtig" gesetzt sein!
Gruß
Cromit
Kommentar von lars sasse am 25.12.2007 um 23:41
ich weis nicht warum, aber bei mir funktioniert es nicht. ich hab visualbasic 6, und winxp. er meldet zwar kein fehler, und führt den gesamten code aus, aber von den dreieck fehlt jede spur.
Kommentar von Graf Zahl am 30.07.2003 um 14:35
Hallo Klaus Langbein,
das Beispiel zum Zeichnen von Dreiecken funktioniert nur, wenn das
Dreieck ausgefüllt ist. Will man ein nicht ausgefülltes Dreieck
zeichnen, werden nur zwei Linien ausgegeben. Der Grund liegt in der
Verwendung der Api Polyline. Diese zeichnet nicht zwingend geschlossene
Figuren. Will man das mit Polyline erreichen, muß man einen Punkt mehr
angeben und diesem die Koordinaten des Startpunktes übergeben. Für ein
Dreieck muß man also vier Punkte angeben. Einfacher ist aber die Ver-
wendung der Api Polygon mit der Einstellung Fillstyle = 1 (Transparent),
da man hier mit drei Punkten auskommt. Ein Geschwindigkeitsunterschied
zwischen den beiden Verfahren ist kaum auszumachen.
Gruß
Graf Zahl
Kommentar von irq14 am 19.05.2002 um 23:17
Hallo ich habe eine Frage? Sorry ich kenne mich noch nicht so gut aus. Also ich habe 2 Textfelder und möchte 2 Werte in diese Felder schreiben. Dann soll es nach dem klick auf einen Button eine Grafik(Kuchendiagramm) ausgeben das Prozentual zu diesen Werten steht. Also 80 zu 20 aufgeteilt. Das wäre echt super nett wenn du mir helfen könntest.
mfg irq14
Kommentar von Hermann Bürkle am 01.03.2002 um 14:05
funktioniert alles am Bildschirm, aber wenn man sowas auch drucken will, gibt es größere Probleme (jedenfalls bei mir (VB6)). Gedruckt wird nur, wenn auch eine "normale" (also nicht-GDI) VB-Zeichenfunktion (z.B. line) dabei ist. Füllen, Füllfarbe setzen geht nicht.
Vielleicht hat jemand Erfahrung mit dem Ausdruck von GDI-Zeichenfunktionen?
Kommentar von sven brodowski am 17.01.2002 um 00:09
folgendes
ich möchte dynamische textfelder erstellen
danach möchte ich n xy Koordinaten einlesen und danach dann die fläche des entstandenen n Eck berechnen wer gibt mir den code in vb dazu