| |
Visual-Basic EinsteigerDrehbare und transparente Grafik über zweite Grafik in PictureBox | | | Autor: Michael_HU | Datum: 27.03.13 06:56 |
| Hallo liebe Leute!
Möchte wieder mal Eure Hilfe bzw. Vorschläge haben.
Ich lege ein BMP Grafikbild in eine PictureBox1.
Diese Grafik ist boxfüllend, 8600x8600 Pixel.
Nun möchte ich eine zweite Grafik (ebenfalls BMP), die um ein drittel kleiner ist als die PictureBox1, über das erste Grafikbild zentriert und transparent legen.
Diese zweite Grafik möchte ich um die Zentrierung herum nach Winkeleingabe in einer TextBox entw. nach links (180°) bzw. nach rechts (-180°) drehen.
Wobei mein Nullpunkt ist unten
Den ersten Schritt habe ich bereits, aber wie lege ich eine zweite Grafik transparent über die erste und wie lässt sich dann die zweite drehen?
Programm in VB6.
Hier meine Anfänge, die funktioniert:
'Inhalt: PictureBox1, Slider, ChekBox, TextBox, 2 Buttons
Option Explicit
Dim OrigoX As Long
Dim OrigoY As Long
Dim KompassX As Double
Dim KompassY As Double
'Private Pi As Double
Public Orientierung As Single
Private mMeinSlider As SliderToolTip
Const Pi = 3.14159265358979 'Pi = Atn(1) * 4
Const RAD = 1.74532925199433E-02 'Pi/180
Const Leitlinie = 260
Private Sub Form_Load()
Picture1.Cls
Picture1.AutoRedraw = True
Picture1.ScaleMode = 3 'in pixel
Picture1.Width = 8600 '5055
Picture1.Height = Picture1.Width 'Quadratisches Bildfeld
Picture1.DrawWidth = 2
Picture1.ForeColor = vbBlue
Set mMeinSlider = New SliderToolTip
mMeinSlider.Init MeinSlider ‘in Eigenschaft wird aber unsichtbar gestellt
mMeinSlider.Enabled = CBool(chkMeinSlider.Value) 'Werte am Slider anzeigen oder nicht
OrigoX = Picture1.ScaleHeight / 2 + 18 'Nullpunkt der Leitlinie
OrigoY = Picture1.ScaleWidth / 2 - 28
KompassX = OrigoX - Leitlinie * Sin(Orientierung * RAD) 'Koordinaten der Leitlinie
KompassY = OrigoY + Leitlinie * Cos(Orientierung * RAD) 'zu Beginn ist auf Null "=SÜD" gestellt
Picture1.Line (OrigoX, OrigoY)-(KompassX, KompassY) ', vbRed 'Leitlinie ziehen
End Sub
Private Sub MeinSlider_Click()
Picture1.Cls
'** Vorzeichen umkehren: S/W=+, S/O=-
Me.txtOrientierung_Abweichung_Grad.Text = MeinSlider.Value * -1
Orientierung = Me.txtOrientierung_Abweichung_Grad.Text
KompassX = OrigoX - Leitlinie * Sin(Orientierung * RAD)
KompassY = OrigoY + Leitlinie * Cos(Orientierung * RAD)
Picture1.Line (OrigoX, OrigoY)-(KompassX, KompassY) ', vbRed
End Sub
Private Sub txtOrientierung_Abweichung_Grad_Change()
'Möglichkeit Winkel selber in die TextBox zu schreiben
Picture1.Cls 'die vorherige Leitlinie löschen
If Me.txtOrientierung_Abweichung_Grad.Text = "" Then 'womit beim löschen nicht abbricht
Me.txtOrientierung_Abweichung_Grad.Text = 0
Orientierung = 0
End If
If IsNumeric(Me.txtOrientierung_Abweichung_Grad.Text) Then 'Nur - ist nicht numerisch -n ist numerisch
Orientierung = Me.txtOrientierung_Abweichung_Grad.Text 'Neuen Winkelwert merken
KompassX = OrigoX - Leitlinie * Sin(Orientierung * RAD) 'die gerichtete Leitlinie zeichnen
KompassY = OrigoY + Leitlinie * Cos(Orientierung * RAD)
Picture1.Line (OrigoX, OrigoY)-(KompassX, KompassY) ', vbRed 'Neue Richtung zeichnen
MeinSlider.Value = -Me.txtOrientierung_Abweichung_Grad.Text 'auch den Slider dazustellen
End If
End Sub
Private Sub txtOrientierung_Abweichung_Grad_LostFocus()
cmdOrientierung_Speichern.SetFocus
End Sub
Private Sub cmdOrientierung_Abbrechen_Click()
Picture1.Cls
Me.txtOrientierung_Abweichung_Grad.Text = 0
Orientierung = 0
Unload Me
End Sub
Private Sub cmdOrientierung_Speichern_Click()
Orientierung = Me.txtOrientierung_Abweichung_Grad.Text
'MsgBox Orientierung
Unload Me
End Sub
'********** | |
Re: Drehbare und transparente Grafik über zweite Grafik in PictureBox | | | Autor: Zardoz | Datum: 27.03.13 16:02 |
| Hallo Michael_HU,
zum Posten von Code bitte den entsprechenden Button
verwenden. Drehen von Grafiken geht mit der Api PlgBlt.
Siehe dazu:
http://www.activevb.de/tipps/vb6tipps/tipp0619.html
Stimmen deine Grössenangaben? Die Api PlgBlt hat mit
grossen Bildern ihre Probleme (über 3000 Pixel). Wenn
der Scalemode der Form auf Twips steht und du die Breite
der Picturebox auf 8600 setzt, hat die Picturebox ca.
573 Pixel. Beim Drehen um exakt ± 180° verwendest du
besser die Api-Funktion StretchBlt. Die ist schneller
und genauer. Für grössere Bilder gibt es noch Alternativen.
Gruss,
Zardoz
Beitrag wurde zuletzt am 27.03.13 um 16:05:47 editiert. | |
Re: Drehbare und transparente Grafik über zweite Grafik in PictureBox | | | Autor: Michael_HU | Datum: 27.03.13 17:44 |
| Hallo Zardoz,
die Pixelgrößen stimmen. Es hat sich so ergeben, weil ich den Kompass zuerst im AutoCAD gezeichnet und von -180°/+180° skaliert und mit Screencopy in BMP umgewandelt habe.
Wenn diese Pixelgröße Probleme beim drehen vorbereitet, dann kann ich das Original selbstverständlich unter 3000 Pixel machen.
Die ScaleMode vom Picture1 ist jetzt auf 0-User.
Werde jetzt beide API-Funktionen testen.
Danke für den Tipp.
Ich möchte das bisherige "Modullayout_Zeichnungsfläche" in rar hier beilegen, womit Du alles siehst.
Weiß nicht, ob das so geht.
Kannst Du bitte deine Meinung dazu äußern?
gruß
Michael | |
Re: Drehbare und transparente Grafik über zweite Grafik in PictureBox | | | Autor: Zardoz | Datum: 27.03.13 20:52 |
| Hallo Michael,
Michael_HU schrieb:
Zitat: | |
Wenn diese Pixelgröße Probleme beim drehen vorbereitet, dann
kann ich das Original selbstverständlich unter 3000 Pixel
machen.
| |
3000 Pixel sind ein Schätzwert. Du musst mal testen, was
möglich ist. Aber wie schon geschrieben, es gibt auch andere
Möglichkeiten.
Michael_HU schrieb:
Zitat: | |
Die ScaleMode vom Picture1 ist jetzt auf 0-User.
| |
Unabhängig vom ScaleMode der Picturebox arbeiten die Api-Funktionen
immer mit Pixeln.
Michael_HU schrieb:
Zitat: | |
Ich möchte das bisherige
"Modullayout_Zeichnungsfläche" in rar hier
beilegen, womit Du alles siehst.
Weiß nicht, ob das so geht.
| |
Das geht so nicht. Du kannst das Projekt bei einem Webhoster
hochladen und es dann hier verlinken, oder es mir per e-mail
schicken.
Hier ein Beispiel für Drehen um 180°:
' Controls: CommandButton, PictureBox
Private Declare Function SetStretchBltMode Lib "gdi32" (ByVal hdc As Long, _
ByVal nStretchMode As Long) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc 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 nSrcWidth As _
Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Private Const COLORONCOLOR = 3
Private Breite&, Hoehe&
Private Sub Form_Load()
Dim Dat1$, TmpPic As StdPicture
Me.ScaleMode = vbPixels
Me.WindowState = vbMaximized
Command1.Move 2, 2
Dat1 = "C:\EinBild.jpeg" ' <- Pfad eines Bildes
Set TmpPic = LoadPicture(Dat1)
With Picture1
.BorderStyle = vbBSNone
.ScaleMode = vbPixels
Breite = Int(0.5 + .ScaleX(TmpPic.Width, vbHimetric))
Hoehe = Int(0.5 + .ScaleY(TmpPic.Height, vbHimetric))
.Move 2, Command1.Height + 4, Breite, Hoehe
.AutoRedraw = True
.PaintPicture TmpPic, 0, 0
End With
Set TmpPic = LoadPicture()
End Sub
Private Sub Command1_Click()
Dim OldMode&
With Picture1
OldMode = SetStretchBltMode(.hdc, COLORONCOLOR)
Call StretchBlt(.hdc, Breite - 1, Hoehe - 1, -Breite, -Hoehe, _
.hdc, 0, 0, Breite, Hoehe, vbSrcCopy)
Call SetStretchBltMode(.hdc, OldMode)
.Refresh
End With
End Sub Quelle und Ziel können bei SetStretchBlt verschieden sein.
Gruss,
Zardoz | |
Re: Drehbare und transparente Grafik über zweite Grafik in PictureBox | | | Autor: Michael_HU | Datum: 27.03.13 21:13 |
| Hallo Zardoz,
habe getestet. Gedreht wird i.d. Tat. Jedoch stimmen die Bildmitten nicht überein.
Ich würde Dir gerne mein bisheriges Programm zusenden, wie ich das vorhabe.
Kann ich es auf die jetzige E-Mail-Adresse schicken?
Gruß
Michael | |
Re: Drehbare und transparente Grafik über zweite Grafik in PictureBox | | | Autor: Michael_HU | Datum: 27.03.13 21:19 |
| Entschuldige bitte!
Die Mitten stimmen überein. Mein Bild war nicht symmetrisch! Deshalb die Verschiebungen! | |
Re: Drehbare und transparente Grafik über zweite Grafik in PictureBox | | | Autor: Michael_HU | Datum: 07.04.13 09:28 |
| Hallo Zardoz,
ich habe deinen Gedankengang weitergebaut, d.h. ich bin gerade dabei.
Hast viel geholfen.
Freue mich drüber.
Gruß
Michael
| |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevDTA 3.0 Pro
SEPA mit Kontonummernprüfung
Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Weitere Infos
|