OVH Cloud OVH Cloud

appliquer une fonction sur optionbutton

5 réponses
Avatar
michael
Bonjour j'ai trouvé un code qui rend transparent un Frame, c'est très
pratique, malheureusement mes optionButton ne le son pas et je n'arrive pas a
les rendre transparent même en modifiant la fonction "Function
FrameTranz(Ctrl As Frame)" en "Function ButtonTranz(Ctrl As OptionButton)"
mais peut etre n'est ce pas possible, il ne plante pourtant pas...
J'ai: - une form avec une image en fond
- un frame dessus
- un OptionButton a rendre transparent
- un cmd pour lancer le tout
si qqn peux me dire ou ça cloche... peut etre qu'il n'y a pas moyen de
modifier la fonction pour un OptionButton

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 Lon
------------------------------------------------------------------------------------------------
Public Function FrameTranz(Ctrl As Frame) 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 Functio
------------------------------------------------------------------------------------------------
Public Sub FrameTransparent(Ctrl As Frame)
Dim lSkin As Long
Ctrl.Visible = True
lSkin = FrameTranz(Ctrl)
Call SetWindowRgn(Ctrl.hwnd, lSkin, True)
End Su
------------------------------------------------------------------------------------------------
Public Function ButtonTranz(Ctrl As OptionButton) 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

ButtonTranz = lSkin
End Function
------------------------------------------------------------------------------------------------
Public Sub ButtonTransparent(Ctrl As OptionButton)
Dim lSkin As Long
Ctrl.Visible = True
lSkin = ButtonTranz(Ctrl)
Call SetWindowRgn(Ctrl.hwnd, lSkin, True)
End Sub

5 réponses

Avatar
Jacques93
Bonjour michael,
michael a écrit :
Bonjour j'ai trouvé un code qui rend transparent un Frame, c'est très
pratique, malheureusement mes optionButton ne le son pas et je n'arrive pas a
les rendre transparent même en modifiant la fonction "Function
FrameTranz(Ctrl As Frame)" en "Function ButtonTranz(Ctrl As OptionButton)"
mais peut etre n'est ce pas possible, il ne plante pourtant pas...
J'ai: - une form avec une image en fond
- un frame dessus
- un OptionButton a rendre transparent
- un cmd pour lancer le tout
si qqn peux me dire ou ça cloche... peut etre qu'il n'y a pas moyen de
modifier la fonction pour un OptionButton



Essaie avec, dans le code de feuille :
'---------------------------------------
Option Explicit

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

Private Sub Command1_Click()
FrameTransparent Me.Option1
FrameTransparent Me.Frame1
End Sub
'----------------------------------------

Dans le 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

--
Cordialement,

Jacques.
Avatar
michael
merci ca marche!!! j'avais bien remplacé frame par object mais ca faisait des
trucs un peu bizarre
Tant que j'y suis j'essaie de lancer ça lors de l'ouverture de la forme ,ce
qui est plus logique, mais là il fais les fonction mais il ne se passe rien...
le 'Me' ou pourrais je trouver un explication complete sur son utilisation??
merci infiniment vous m'etes d'une aide précieuse

"Jacques93" a écrit :

Bonjour michael,
michael a écrit :
> Bonjour j'ai trouvé un code qui rend transparent un Frame, c'est très
> pratique, malheureusement mes optionButton ne le son pas et je n'arrive pas a
> les rendre transparent même en modifiant la fonction "Function
> FrameTranz(Ctrl As Frame)" en "Function ButtonTranz(Ctrl As OptionButton)"
> mais peut etre n'est ce pas possible, il ne plante pourtant pas...
> J'ai: - une form avec une image en fond
> - un frame dessus
> - un OptionButton a rendre transparent
> - un cmd pour lancer le tout
> si qqn peux me dire ou ça cloche... peut etre qu'il n'y a pas moyen de
> modifier la fonction pour un OptionButton

Essaie avec, dans le code de feuille :
'---------------------------------------
Option Explicit

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

Private Sub Command1_Click()
FrameTransparent Me.Option1
FrameTransparent Me.Frame1
End Sub
'----------------------------------------

Dans le 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

--
Cordialement,

Jacques.



Avatar
Jacques93
Bonjour michael,
michael a écrit :
merci ca marche!!! j'avais bien remplacé frame par object mais ca faisait des
trucs un peu bizarre
Tant que j'y suis j'essaie de lancer ça lors de l'ouverture de la forme ,ce
qui est plus logique, mais là il fais les fonction mais il ne se passe rien...
le 'Me' ou pourrais je trouver un explication complete sur son utilisation??
merci infiniment vous m'etes d'une aide précieuse




Extrait de l'aide :
-----------------------------------------------------------------------
Le mot clé Me se comporte comme une variable déclarée de façon
implicite. Il est automatiquement disponible pour toutes les procédures
d'un module de classe. Lorsqu'une classe peut comporter plusieurs
instances, le mot clé Me offre la possibilité de faire référence à
l'instance de la classe dans laquelle le code est exécuté. Il s'avère
particulièrement utile pour passer les informations concernant
l'instance d'une classe en cours d'exécution à une procédure d'un autre
module. Par exemple, supposez que la procédure suivante se présente dans
un module :

Sub ChangeFormColor(FormName As Form)
FormName.BackColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)
End Sub

Vous pouvez appeler cette procédure et passer l'instance en cours de la
classe Form comme un argument à l'aide de l'instruction suivante :

ChangeFormColor Me
------------------------------------------------------------------------

Un autre intérêt du mot clé Me est l'aide à la saisie, quand tu tapes :

Me.

une liste affiche toutes les propriétés, méthodes, et contrôles disponible.


Quand à rendre les contrôles transparents au lancement, cela me semble
difficile. Les API utilisées par FrameTranz supposent que la feuille est
activée. Au mieux, tu peux éviter l'emploi du bouton, a moins que
quelqu'un aie une meilleure idée ?

--
Cordialement,

Jacques.
Avatar
michael
merci des infos, c'est dommage que vb soit quand même un peu limité sur le
graphisme...
Si d'autre personnes ont des idées merci d'avance

"Jacques93" a écrit :

Bonjour michael,
michael a écrit :
> merci ca marche!!! j'avais bien remplacé frame par object mais ca faisait des
> trucs un peu bizarre
> Tant que j'y suis j'essaie de lancer ça lors de l'ouverture de la forme ,ce
> qui est plus logique, mais là il fais les fonction mais il ne se passe rien...
> le 'Me' ou pourrais je trouver un explication complete sur son utilisation??
> merci infiniment vous m'etes d'une aide précieuse
>

Extrait de l'aide :
-----------------------------------------------------------------------
Le mot clé Me se comporte comme une variable déclarée de façon
implicite. Il est automatiquement disponible pour toutes les procédures
d'un module de classe. Lorsqu'une classe peut comporter plusieurs
instances, le mot clé Me offre la possibilité de faire référence à
l'instance de la classe dans laquelle le code est exécuté. Il s'avère
particulièrement utile pour passer les informations concernant
l'instance d'une classe en cours d'exécution à une procédure d'un autre
module. Par exemple, supposez que la procédure suivante se présente dans
un module :

Sub ChangeFormColor(FormName As Form)
FormName.BackColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)
End Sub

Vous pouvez appeler cette procédure et passer l'instance en cours de la
classe Form comme un argument à l'aide de l'instruction suivante :

ChangeFormColor Me
------------------------------------------------------------------------

Un autre intérêt du mot clé Me est l'aide à la saisie, quand tu tapes :

Me.

une liste affiche toutes les propriétés, méthodes, et contrôles disponible.


Quand à rendre les contrôles transparents au lancement, cela me semble
difficile. Les API utilisées par FrameTranz supposent que la feuille est
activée. Au mieux, tu peux éviter l'emploi du bouton, a moins que
quelqu'un aie une meilleure idée ?

--
Cordialement,

Jacques.



Avatar
michael
"Jacques93" a écrit :

Bonjour michael,
michael a écrit :
> merci ca marche!!! j'avais bien remplacé frame par object mais ca faisait des
> trucs un peu bizarre
> Tant que j'y suis j'essaie de lancer ça lors de l'ouverture de la forme ,ce
> qui est plus logique, mais là il fais les fonction mais il ne se passe rien...
> le 'Me' ou pourrais je trouver un explication complete sur son utilisation??
> merci infiniment vous m'etes d'une aide précieuse
>

Extrait de l'aide :
-----------------------------------------------------------------------
Le mot clé Me se comporte comme une variable déclarée de façon
implicite. Il est automatiquement disponible pour toutes les procédures
d'un module de classe. Lorsqu'une classe peut comporter plusieurs
instances, le mot clé Me offre la possibilité de faire référence à
l'instance de la classe dans laquelle le code est exécuté. Il s'avère
particulièrement utile pour passer les informations concernant
l'instance d'une classe en cours d'exécution à une procédure d'un autre
module. Par exemple, supposez que la procédure suivante se présente dans
un module :

Sub ChangeFormColor(FormName As Form)
FormName.BackColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)
End Sub

Vous pouvez appeler cette procédure et passer l'instance en cours de la
classe Form comme un argument à l'aide de l'instruction suivante :

ChangeFormColor Me
------------------------------------------------------------------------

Un autre intérêt du mot clé Me est l'aide à la saisie, quand tu tapes :

Me.

une liste affiche toutes les propriétés, méthodes, et contrôles disponible.


Quand à rendre les contrôles transparents au lancement, cela me semble
difficile. Les API utilisées par FrameTranz supposent que la feuille est
activée. Au mieux, tu peux éviter l'emploi du bouton, a moins que
quelqu'un aie une meilleure idée ?

--
Cordialement,

Jacques.