Avatar billede adagio Nybegynder
12. juli 2003 - 19:47 Der er 10 kommentarer og
1 løsning

gør farve usynlig på en form?

Jeg ønsker et program, hvor der er muligt at skinne formene, hvor der også er muligt at få farven lilla til at være usynlig. Jeg har en kode, som skulle kunne gøre det, men det virker ikke. Når jeg kører koden, bliver formen klippet rigtigt ud, og objekterne på formen er også rigtige, men selve formen har den farve, som det sidste skærmbillede, som på dette billede:

http://zcollection.sytes.net/pictures/ForkertForm.jpg

I et modul har jeg dette:

Public Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Declare Function ReleaseCapture Lib "user32" () As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As Long
Public Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
Public Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Public Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Public Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Public Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As Long
Public Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long

Public Type BITMAP
    bmType As Long
    bmWidth As Long
    bmHeight As Long
    bmWidthBytes As Long
    bmPlanes As Integer
    bmBitsPixel As Integer
    bmBits As Long
End Type
'--------- CreateRectRgn ---------

'--------- CreateRectRgn ---------
Public Function GetBitmapRegion(cPicture As StdPicture, cTransparent As Long)
Dim hRgn As Long, tRgn As Long
Dim X As Integer, Y As Integer, X0 As Integer
Dim hDC As Long, BM As BITMAP

hDC = CreateCompatibleDC(0)
If hDC Then
    SelectObject hDC, cPicture

    GetObject cPicture, Len(BM), BM
    hRgn = CreateRectRgn(0, 0, BM.bmWidth, BM.bmHeight)
    For Y = 0 To BM.bmHeight
    For X = 0 To BM.bmWidth
    While X <= BM.bmWidth And GetPixel(hDC, X, Y) <> cTransparent
    X = X + 1
    Wend
    X0 = X
    While X <= BM.bmWidth And GetPixel(hDC, X, Y) = cTransparent
    X = X + 1
    Wend
    If X0 < X Then
    tRgn = CreateRectRgn(X0, Y, X, Y + 1)
    CombineRgn hRgn, hRgn, tRgn, 4
    DeleteObject tRgn
    End If
    Next X
    Next Y
    GetBitmapRegion = hRgn
    DeleteObject SelectObject(hDC, cPicture)
End If
DeleteDC hDC
End Function



Hvor i formen har jeg dette:

If hRgn Then DeleteObject hRgn
hRgn = GetBitmapRegion(Me.Picture, &HFFFFFF)
SetWindowRgn Me.hwnd, hRgn, True
Avatar billede sion Nybegynder
15. juli 2003 - 01:08 #1
Her er en, synes jeg, lidt lettere løsning som tilmed også gør det muligt at klikke igennem aplikationen.
Indsæt følgende kode i en form:

'Konstanter og API kald for trans:
Private Const LWA_COLORKEY = &H1
Private Const LWA_ALPHA = &H2
Private Const GWL_EXSTYLE = (-20)
Private Const WS_EX_LAYERED = &H80000
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

Private Sub Form_Load()
  Dim ret As Long
  'Sætter vinduet til at blive opfattet som et layer
  ret = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
  ret = ret Or WS_EX_LAYERED
  SetWindowLong Me.hwnd, GWL_EXSTYLE, ret
  'Sætter gennemsigtiheden af det layer'ede vindue (en værdi mellem 0 og 255)
 
  SetLayeredWindowAttributes Me.hwnd, vbBlue, 0, LWA_COLORKEY
End Sub

Her sættes farven blå, altså "vbBlue", til at være gennemsigtig - det kan selfølgelig ændres til at passe dine behov. Prøv at teste effekten ved at indsætte en shape og farv den blå.
Du kan også bruge effekten til at gøre din applikation gennemsigtig, altså transperant - dog kan du kun bruge én af effekterne samtidig. Kode for transperat form er:
SetLayeredWindowAttributes Me.hwnd, 0, [TransperantVærdi 0-255], LWA_ALPHA

Håber du kan bruge det til noget. Skriv hvis du er i tvivl om noget ;)
-Sion
Avatar billede adagio Nybegynder
16. juli 2003 - 12:38 #2
Takker, den virker ved at bruge shapes, men ikke når jeg bruger et billede som baggrund, hvilket er det jeg ønsker at bruge.
Avatar billede adagio Nybegynder
16. juli 2003 - 12:45 #3
Eller dog... Ved at bruge den samme farve, over alle de ting jeg ønsker usynlige, så gør den kun en del af det usynligt... (For et øjeblik siden var det intet der blev usynligt...)
Avatar billede adagio Nybegynder
16. juli 2003 - 12:48 #4
nu virker det lidt bedre... :)
Avatar billede sion Nybegynder
16. juli 2003 - 13:04 #5
hmm, det burde nu også virke på billeder - husk dog på at kun én farve kan gøres "usynlig". Prøv at indsætte et billede direkte på formen (altså vha. formen picture-egenskab) og indsætte følgende kode på formen:

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Dim ret As Long
  'Sætter vinduet til at blive opfattet som et layer
  ret = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
  ret = ret Or WS_EX_LAYERED
  SetWindowLong Me.hwnd, GWL_EXSTYLE, ret
  'Sætter gennemsigtiheden af det layer'ede vindue (en værdi mellem 0 og 255)
 
  SetLayeredWindowAttributes Me.hwnd, Me.Point(X, Y), 0, LWA_COLORKEY
End Sub

Når du klikker på billedet burde den farve du klikker på blive usynlig så det er muligt at klikke igennem formen.
Jeg har lige testet koden med et billede i en picturebox hvorved det ikke virkede - dette skyldes at pictureboxen har en anden hWnd end formen, men derudover virker det ;)
Avatar billede adagio Nybegynder
16. juli 2003 - 13:09 #6
Jeg fik den til at virke. Fejlen var at jeg brugte jpg som billede, men den ødelagde farverne lidt, men da jeg skiftede om til bmp, så virkede det.

Men er bmp ikke en dum filtype at bruge her til? Hvilken type er bedst?
Avatar billede sion Nybegynder
16. juli 2003 - 13:13 #7
jo, bmp er ukomprimeret og fylder derfor meget. Dog betyder gif- og jpg-komprimationen at farverne ikke er helt præcise og derfor kan det være svært at bruge disse billedetyper til dit formål. Men prøv dig frem med jpg-komprimeringer - nok med højere kvalitet og så burde du finde et billedekvalitet/filstørrelse der er passende
Avatar billede sion Nybegynder
16. juli 2003 - 13:16 #8
nej, jeg tror faktisk at gif billedefiler passer bedre, da farverne ikke udglattes på samme måde som ved jpg-billeder ;)
Avatar billede adagio Nybegynder
16. juli 2003 - 13:16 #9
Jeg har brugt den bedste billedekvalitet, da jeg lavede den om til jpg, så den er nok ubrugelig :(
Avatar billede adagio Nybegynder
16. juli 2003 - 13:20 #10
ok, jeg prøver mig lidt frem, dog bliver det først lidt senere, da jeg snart bliv nødt til at stoppe for et stykke tid...
Avatar billede adagio Nybegynder
17. juli 2003 - 14:30 #11
Umiddelbart ser det ud til at gif billeder er gode nok :)

Så jeg takker for svaret, og lukker spørgsmålet
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

Seneste spørgsmål Seneste aktivitet
I går 10:21 Ny printer, men hvilken Af mort1 i Printere
13/0819:41 USB på Linux Af Uvanga i Linux
12/0818:26 Hvilken type mus Af mort1 i PC
11/0813:21 ms Forms Af leahcim i Andet software
10/0821:30 Blokeret på Snapchat? Af LineP i Chat & Messaging