Transparenter Hintergrund einer PicBox? == Geht nicht!

daDom

Erfahrenes Mitglied
Hi!

Hänge gerade an einem Programm, wo es von Nöten ist, den Hintergrund einer PicBox auf Transparent zu stellen.

Jedoch konnte die MSDN mir da nicht weiter helfen.

Mit Backstyle klappt das ganze sowieso nicht.
Mit Drawstyle = 5 gehts auch nicht.

Habt ihr nen Tipp?


daDom
 
Die Imagebox hat das Problem, das sie eine bestimmte Eigenschaft nicht besitzt, die ich aber unbedingt brauche.
".hdc" nämlich :(

Da ich die Bilder darin drehe, geht es leider nicht so :(
 
Wenn du im Hintergrund ein Bild hast versuchs mit BitBlt.
d.h. im Definitionsteil:
Code:
Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hdcDest As _ 
Long, ByVal nXDest As Long,  ByVal nYDest As Long, ByVal  _
nWidth As Long, ByVal nHeight As Long, ByVal hdcSrc As Long, _
ByVal nXSrc As Long, ByVal nYSrc As Long, ByVal dwRop As Long) _
As Long

'Die anderen Konstanten hab' ich ausgelassen
Private Const SRCCOPY = &HCC0020
Und dann einfach für Transparenz und "Form1.Picture" als Hintergrundbild:
Code:
 BitBlt Picture1.hDC, 0, 0, Picture1.Width, Picture1.Height, Form1.hDC, Picture1.Left, Picture1.Top, SRCCOPY
Müsste funzen. Nach diesem Befehl müsste sich in der PictureBox exakt das Bild befinden, dass an dieser Stelle den Hintergrund der Form bildet. Die Eigenschaft "ScaleMode" sollte allerdings auf "Pixel" gestellt werden. (Anm. so ungefähr geht auch Masking)
Ich hoffe das löst das Problem das du hast.
 
Hi!

Ich habe zwar kein VB grade hier, aber damit wir uns nicht falsch verstehen:

Ich habe eine PicBox(picBild), in der eine weitere PicBox(picVerschieben) ist.
In der PicBox(picverschieben) befindet sich eine weitere Picbox, dessen Inhalt ich in der PicBox picVerschieben drehe und verschiebe.

Problem:
picVerschieben hat immer den Hintergrund weiss.
Wenn ich das Steuerelement verschiebe und das Bild darin gedreht worden ist, also an allen Seiten schräg ist, möchte ich drumherum alles Transparent haben.
 
Hi
Vielleicht hab ichs jetzt verstanden. Du hast 3 ineinander verschachtelte Bildfelder. Und nachdem das Bild in dem innersten Bildfeld gedreht wurde, soll an bestimmten Stellen, statt einer Hintergrundfarbe das Bil von dem 2.-innersten Bildfeld erscheinen (und wozu ist dann das ganz äussere?). Das müsste so gehen:

- Alle beteiligten Bildfelder & Formen, Eigenschaft "Scale Mode" auf "Pixel" und "AutoRedraw" auf "True"
- 3 weitere unsichtbare Bildfelder (Eigenschaften s.o.)
- Schwarz-Weiss-Maskieren der Transparent darzustellenden Grafik nach dem drehen.
Die Funktion dafür ist z.B.:
Code:
Sub MaskPic(SourceObj As PictureBox, AimObj As PictureBox)
 Dim TransCol As Long
 TransCol = &HFFFFFF 'Nr. der transparenten Farbe (hier Weiss) oder "SourceObj.Point(0, 0)"
 For X = 0 To SourceObj.Height - 1
  For Y = 0 To SourceObj.Width - 1
   If SourceObj.Point(Y, X) = TransCol Then AimObj.PSet (Y, X), &HFFFFFF Else _
    AimObj.PSet (Y, X), &H0
  Next Y
   DoEvents
 Next X
End Sub
Als "SourceObj" das Bildfeld mit dem gedrehten Bild übergeben und als "AimObj" eines der 3 leeren Bildfelder (im weiteren genannt "Mask")
Danach eine Masking Prozedur (diese wird wohl für dein Problem angemessen sein):
Der Definitionsteil der Funktion "BitBlt":
Code:
Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hdcDest As Long, ByVal nXDest As Long, _
ByVal nYDest As Long, ByVal nWidth As Long, ByVal nHeight As Long, _
ByVal hdcSrc As Long, ByVal nXSrc As Long, ByVal nYSrc As Long, _
ByVal dwRop As Long) As Long

Private Const DSTINVERT = &H550009  'Konstanten für BitBlt
Private Const SRCCOPY = &HCC0020
Private Const SRCAND = &H8800C6
Private Const SRCPAINT = &HEE0086
Private Const BLACKNESS = &H42
Private Const MERGECOPY = &HC000CA
Private Const MERGEPAINT = &HBB0226
Private Const NOTSRCCOPY = &H330008
Private Const NOTSRCERASE = &H1100A6
Private Const PATCOPY = &HF00021
Private Const PATINVERT = &H5A0049
Private Const PATPAINT = &HFB0A09
Private Const SRCERASE = &H440328
Private Const SRCINVERT = &H660046
Private Const WHITENESS = &HFF0062
und dann eine Masking Prozedur (in diesem Fall hab ich die 3 zusätzlichen Bildfelder "Mask" (is klaa), "Cut" und "Masked" genannt):
Code:
Sub Masking(SourceObj As PictureBox, Mask As PictureBox, AimObj As PictureBox, X As Integer, Y As Integer)
 'SourceObj = Hintergrund
 'AimObj = Vordergrund (Weil auf Vordergund geschrieben wird)
 Dim SrcH As Integer
 Dim SrcW As Integer
 Dim AimH As Integer
 Dim AimW As Integer
 SrcH = SourceObj.Height: SrcW = SourceObj.Width
 BitBlt Masked.hDC, 0, 0, SrcW, SrcH, Mask.hDC, 0, 0, SRCCOPY
 BitBlt Masked.hDC, 0, 0, SrcW, SrcH, AimObj.hDC, 0, 0, SRCPAINT
 BitBlt Cut.hDC, 0, 0, SrcW, SrcH, Mask.hDC, 0, 0, SRCCOPY
 BitBlt Cut.hDC, 0, 0, SrcW, SrcH, Cut.hDC, 0, 0, DSTINVERT
 BitBlt Cut.hDC, 0, 0, SrcW, SrcH, SourceObj.hDC, X, Y, SRCPAINT
 BitBlt Masked.hDC, 0, 0, SrcW, SrcH, Cut.hDC, 0, 0, SRCAND
 BitBlt AimObj.hDC, 0, 0, SrcW, SrcH, Masked.hDC, 0, 0, SRCCOPY
 Masked.Cls
 Cut.Cls
End Sub
Wenn du nun nach der Drehung sowas wie:
Code:
 MaskPic Picture3, Mask
 Masking Picture2, Mask, Picture3, Picture3.Left, Picture3.Top
wobei du wahrscheinlich die letzten beiden Argumente umbasteln musst, nähmlich bezogen auf das 2. Bildfeld und nicht auf die Form (vielleicht ist das auch egal).
In dieser Erklärung wird aber nur das Bild im Innern so maskiert, dass an den Transparenten Stellen das Bild des 2. Bildfeldes, d.h. desjenigen darunter, erscheint. Was mit dem 1. Bildfeld (des grössten drumherum nehm ich an) gemeint ist hab ich noch nicht verstanden.
Zum Rumbasteln: - SUB Masking; 1. Argument = Hintergrund
2. Argument = Maskierter Vordergrund
3. Argument = Vordergrund (wird verändert)
4./ 5. Argument = Position des Vordergrundes in Relation zum Hintergrund
Ich hoffe das bringt dir was, obwohl ich die Aufgabenstellung noch nicht ganz klar sehe. Da die Masking-Prozedur von mir für ein individuelles Programm entworfen wurde, könnte es sein das sie nicht ganz auf dein Problem anzuwenden ist.
 

Neue Beiträge

Zurück