Degeim Skrevet 9. april 2005 Del Skrevet 9. april 2005 Hvordan får jeg bakgrunnesfargen i en picturebox til å bli transparent? Lenke til kommentar
aadnk Skrevet 9. april 2005 Del Skrevet 9. april 2005 Denne metoden vil dessverre ikke fungere med påtegnede kontroller som labeller og liknende - til det må du finne på noe annet. Men jeg henviser til den likevel: Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRECT As RECT) As Long Private Declare Function GetClientRect Lib "user32" (ByVal hWnd As Long, lpRECT As RECT) As Long Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long Private Declare Function ScreenToClient Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Private Const RGN_AND = 1 Private Const RGN_COPY = 5 Private Const RGN_DIFF = 4 Private Const RGN_OR = 2 Private Const RGN_XOR = 3 Private Type POINTAPI X As Long Y As Long End Type Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Public Sub MakeTransparent(oControl As Control) On Error Resume Next Dim rctClient As RECT, rctFrame As RECT Dim hClient As Long, hFrame As Long, hTemp As Long Dim lpTL As POINTAPI, lpBR As POINTAPI Dim Control As Control, hWnd As Long GetWindowRect oControl.hWnd, rctFrame GetClientRect oControl.hWnd, rctClient lpTL.X = rctFrame.Left lpTL.Y = rctFrame.Top lpBR.X = rctFrame.Right lpBR.Y = rctFrame.Bottom ScreenToClient oControl.hWnd, lpTL ScreenToClient oControl.hWnd, lpBR ' Rammen With rctFrame rctFrame.Left = lpTL.X rctFrame.Top = lpTL.Y rctFrame.Right = lpBR.X rctFrame.Bottom = lpBR.Y End With ' Selve klientområdet With rctClient .Left = Abs(rctFrame.Left) .Top = Abs(rctFrame.Top) .Right = rctClient.Right + Abs(rctFrame.Left) .Bottom = rctClient.Bottom + Abs(rctFrame.Top) End With ' Rammeposisjon og -størrelse With rctFrame rctFrame.Right = rctFrame.Right + Abs(rctFrame.Left) rctFrame.Bottom = rctFrame.Bottom + Abs(rctFrame.Top) End With ' For å ikke gjøre rammen gjennomsiktig, må vi gjøre følgende hClient = CreateRectRgn(rctClient.Left, rctClient.Top, rctClient.Right, rctClient.Bottom) hFrame = CreateRectRgn(rctFrame.Left, rctFrame.Top, rctFrame.Right, rctFrame.Bottom) CombineRgn hFrame, hClient, hFrame, RGN_XOR ' Vis alle kontroller i den omliggende formen For Each Control In oControl.Parent ' Fortsett kun dersom dette ikke der den kontrollen vi ønsker å gjøre gjennomsiktig If Not Control Is oControl Then ' Create the region of this control hTemp = CreateRectRgn(ConvertPixels(oControl, Control.Left) + rctClient.Left, ConvertPixels(oControl, Control.Top) + rctClient.Top, _ ConvertPixels(oControl, Control.Left + Control.Width) + rctClient.Left, ConvertPixels(oControl, Control.Top + Control.Height) + rctClient.Left) ' Make the region visible CombineRgn hFrame, hTemp, hFrame, RGN_XOR ' Delete region DeleteObject hTemp End If Next ' Set regionen til denne kontrollen SetWindowRgn oControl.hWnd, hFrame, True End Sub Public Function ConvertPixels(objSource As Object, lngValue As Single) As Single ' Konverter til pixels ConvertPixels = objSource.ScaleX(lngValue, objSource.ScaleMode, vbPixels) End Function For å gjøre en kontroll gjennomsiktig, eksempelvis picTest, gjør du som følger: MakeTransparent picTest Lenke til kommentar
Degeim Skrevet 9. april 2005 Forfatter Del Skrevet 9. april 2005 oioioi... kan du kanskje forklare litt om bruken? Hvor skal jeg putte hva, og MÅ jeg ha med ALT det der? Lenke til kommentar
aadnk Skrevet 10. april 2005 Del Skrevet 10. april 2005 Du må ha med alt etsteds tilgjengelig. Inkluder koden i formen din, eller legg det eventuelt inn i en modul; legg dernest til følgende: Private Sub Form_Load() MakeTransparent picTest End Sub Dette vil gjøre bildeboksen picTest gjennomsiktig ved oppstart av formen. Verre er det ikke. Lenke til kommentar
RuZleBIFf Skrevet 11. april 2005 Del Skrevet 11. april 2005 Hva er forskjellen på om den er gjennomsiktig, og om den "ikke er der"?? Slik jeg tolket det vil du bare ha et picturebox som ikke synes, og da kan du jo bare sette .Visible = false eller er jeg på feil gjorde her? Lenke til kommentar
Degeim Skrevet 11. april 2005 Forfatter Del Skrevet 11. april 2005 Takk, Ruzlbiffen, men det var ikke det jeg mente. Når jeg ahr en picurebox, så er det en stygg fikant bak bilde, en som ikke er der når jeg har bildet i en annen ting (jeg husker ikke navnet). Denne vil jeg ha bort. Lenke til kommentar
aadnk Skrevet 11. april 2005 Del Skrevet 11. april 2005 Sikter du til rammen rundt bildeboksen? I så fall kan du fjerne den som følger: picTest.BorderStyle = 0 Lenke til kommentar
Degeim Skrevet 14. april 2005 Forfatter Del Skrevet 14. april 2005 Nei, det jeg vil ha bort er denne sjenerende boksen som er rundt bildet, i dette eksempelet har jeg farget den rød. Lenke til kommentar
aadnk Skrevet 14. april 2005 Del Skrevet 14. april 2005 Kan du ikke heller benytte deg av en Image-kontroll istedenfor? I så fall kan du simpelthen lagre bildet som en gjennomsiktig GIF-fil (I IrfanView, sett Save transparent color), hvorpå du legger til denne filen i Picture-egenskapen til kontrollen. Dette skulle i hvert fall være meget lettere enn å rote rundt med avanserte API-kall for å gjøre likeledes med en bildeboks. Lenke til kommentar
Degeim Skrevet 14. april 2005 Forfatter Del Skrevet 14. april 2005 Det er allerede en gif med transp. bakgrunn. Grunnen til at jeg vil har picturebox og ikke imagebox er fordi når denne beveger seg, så flimrer den. det gjør ikke en picturebox. Lenke til kommentar
aadnk Skrevet 14. april 2005 Del Skrevet 14. april 2005 Aha, du har til hensikt å lage animasjoner. Til et spill, formoder jeg? I så fall bør du IKKE benytte kontroller til dette formålet. Forsøk heller å ta i bruk GDI-funksjonen BitBlt eller, dersom du vil være riktig sofistikert, DirectX. Lenke til kommentar
Jonas Skrevet 14. april 2005 Del Skrevet 14. april 2005 (endret) Da må jeg få annbefale BitBlt til en nybegynner!! Har drevet med DirectX en liten stund nå, og kan fastslå at det IKKE er lett. (Startet forøvrig selv med BitBlt.) Edit: Forklaring av jonask her. Endret 14. april 2005 av Jonas Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå