Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Kuinka muuttaa _frame_ läpinäkyväksi?

Quirzo [02.09.2006 09:45:45]

#

Eli, oon kyllä saanut läpinäkyväks yhdellä .ocx:llä. Mutta siinä on sellainen vika, että jos laittaa 2 läpinäkyvää framea päällekkäin, ne ei suostu piilottumaan (frame.visible = false)
Eli miten saisin ihan vb:n oman framen taustan läpinäkyväksi, tai onko joku toimiva .ocx tai usercontrol yms?


EDIT: Löysin vihdoinkin jonkun koodin saksankieliseltä sivulta. Jos saan kunnolla toimimaan, editoin tähän :)
PS:Auttakaa kuitenkin!

Jonkinlainen objecti -transparent koodi

MODULE

Option Explicit

Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) _
      As Long

Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject _
      As Long) 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 GetPixel Lib "gdi32" (ByVal hDC As Long, _
      ByVal x As Long, ByVal y As Long) As Long

Public Declare Function SetWindowRgn Lib "user32" (ByVal hwnd _
      As Long, ByVal hRgn As Long, ByVal bRedraw As Long) As Long

Public CtrlDc As Long

Public Function FrameTranz(Ctrl As Object) As Long
  Dim lHoch As Long
  Dim lBreit As Long
  Dim lTemp As Long
  Dim lSkin As Long
  Dim lStart As Long
  Dim lZeile As Long
  Dim lSpalte As Long
  Dim lBackColor As Long

lSkin = CreateRectRgn(0, 0, 0, 0)

  With Ctrl
'   bei Form.ScaleMode = vbTwips
    lHoch = .Height / Screen.TwipsPerPixelY
    lBreit = .Width / Screen.TwipsPerPixelX

'   bei Form.ScaleMode = vbPixels
'   lHoch = .Height
'   lBreit = .Width

    CtrlDc = GetDC(.hwnd)
    lBackColor = Ctrl.BackColor

    For lZeile = 0 To lHoch - 1
      lSpalte = 0
      Do While lSpalte < lBreit
        Do While lSpalte < lBreit And GetPixel(CtrlDc, lSpalte, lZeile) = lBackColor
          lSpalte = lSpalte + 1
        Loop

        If lSpalte < lBreit Then
          lStart = lSpalte
          Do While lSpalte < lBreit And GetPixel(CtrlDc, lSpalte, lZeile) <> lBackColor
            lSpalte = lSpalte + 1
          Loop

          If lSpalte > lBreit Then lSpalte = lBreit
          lTemp = CreateRectRgn(lStart, lZeile, lSpalte, lZeile + 1)
          Call CombineRgn(lSkin, lSkin, lTemp, 2)
          Call DeleteObject(lTemp)
        End If
      Loop
    Next lZeile
  End With

FrameTranz = lSkin
End Function

Public Sub FrameTransparent(Ctrl As Object)
Dim lSkin As Long
    'Ctrl.Visible = True
    lSkin = FrameTranz(Ctrl)
    Call SetWindowRgn(Ctrl.hwnd, lSkin, True)
End Sub

KOODI

Private Sub Form_Load()
Frame1.BackColor = &HFF&
End Sub

Private Sub NaytaValikko_Click(Index As Integer)
If Index = 1 Then

Frame1.Visible = True
transparent_timer.Enabled = True

ElseIf Index = 2 Then


End If
End Sub
'Timer (AUTTAKAA TÄSSÄ)
'Eli en saanut toimimaan tätä niin, että kun painaa nappia,
'se laittaa visible = true ja pistää transparentiksi.
'Sen takia laitoin timerin, jonka interval = 1

Private Sub transparent_timer_Timer()
FrameTransparent Frame1
transparent_timer.Enabled = False
End Sub

Ainoa ongelma tässä on siis se, että kun framen backcolor pitää olla
&HFF& (Tai sitten joku muu yksivärinen) että se toimii, niin formi "vilahtaa" kun painaa nappia. Miten saisin toimimaan ilman "vilahdusta"?
(Jos ette ymmärrä, suosittelen koittaan)

Quirzo [02.09.2006 11:01:22]

#

Alkuperäisen koodin löydätte tosta.
http://www.activevb.de/tipps/vb6tipps/tipp0575.html
Hyvin toimii siinä mallissa, niinkuin ohjelmassanikin, jos painaa nappia. Mutta kun haluasin visiblen true ja samalla transparentiksi :/

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta