Kristof_Koder
Messages postés918Date d'inscriptionvendredi 3 août 2007StatutMembreDernière intervention27 octobre 200810 25 sept. 2007 à 12:26
En mode design
1- ajoute un bouton à ta form nommé btnGraphique par exemple
2- Définit son style comme étant Graphique
3- Fixe son index à 0 pour créer un groupe de bouton btnGraphique()
4- Fixe sa propriété Visible à False
Dans le code :
Ajoute un bouton au groupe :
' Ajoute un bouton au groupe btnGraphique() en lui donnant le prochain index dispo
Load btnGraphique(btnGraphique.Count)
' Pour ce bouton créé
With btnGraphique(btnGraphique.Count-1)
' Placement sur la form
.Move ...
' Chargement de l'image
.Picture = LoadPicture("...")
' Affichage du bouton
.Visible = True
End With
Tu pourras ainsi, en plus, gérer ses EVT via les EVT du groupe de bouton BtnGraphique()
xav0
Messages postés20Date d'inscriptionsamedi 23 septembre 2006StatutMembreDernière intervention10 octobre 2007 25 sept. 2007 à 12:46
Bonjour,
tu peux aussi changer directement le style du bouton avec l'API windows :
'partie déclarations
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 LongConst BS_OWNERDRAW &HB&, GWL_STYLE -16
Private Sub CreerBouton()
Dim Button As CommandButton
Set Button = Controls.Add("VB.CommandButton", "MonBouton")
'Change le style du bouton
SetWindowLong Button.hWnd, GWL_STYLE, GetWindowLong(Button.hWnd, GWL_STYLE) Or BS_OWNERDRAW
'Définit une image (obligatoire, sinon le bouton est mal dessiné)
Set Button.Picture = CmdModif.Picture
Button.Visible = True
End Sub
cs_hustler
Messages postés85Date d'inscriptionmercredi 17 septembre 2003StatutMembreDernière intervention20 mars 2012 25 sept. 2007 à 13:30
merci beaucoup pour votre aide
voila le code que j'ai utilisé
Set ButModif = Controls.Add("VB.CommandButton", "cmd" & (i))
With ButModif
.Width = CmdModif.Width
.Height = CmdModif.Height
.Top = lblclef(i).Top
.Left = CmdModif.Left
SetWindowLong ButModif.hWnd, GWL_STYLE, GetWindowLong(ButModif.hWnd, GWL_STYLE) Or BS_OWNERDRAW
.Picture = CmdModif.Picture
.ToolTipText = CmdModif.ToolTipText
'.Style = msoButtonCaption
.Visible = True
End With
Set ButModif.Container = fraPlanning
cela fonctionne bien
en effet lorsque j'ouvre le formulaire j'ai bien tous mes boutons avec l'image que j'ai selectionnée
cependant lorsque je clique sur un bouton celui-ci disparait !!!!!
xav0
Messages postés20Date d'inscriptionsamedi 23 septembre 2006StatutMembreDernière intervention10 octobre 2007 25 sept. 2007 à 15:03
Oui, c'est vrai, avec plusieurs boutons ça ne marche pas C'est possible de contourner le problème avec du subclassing (pour empêcher VB de recevoir l'événement LostFocus). Rajoute un module standard avec ce code :
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 GetProp Lib "user32" Alias "GetPropA" (ByVal hwnd As Long, ByVal lpString As String) As Long
Private Declare Function SetProp Lib "user32" Alias "SetPropA" (ByVal hwnd As Long, ByVal lpString As String, ByVal hData As Long) As Long
Private Declare Function RemoveProp Lib "user32" Alias "RemovePropA" (ByVal hwnd As Long, ByVal lpString As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongConst GWL_WNDPROC -4, WM_DESTROY &H2, WM_SETFOCUS = &H7
Public Sub Subclass(hwnd As Long)
Dim OldProc As Long
'Capture tous les événements reçus par le bouton
OldProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WinProc)
SetProp hwnd, "OLDWPROC", OldProc
End Sub
Private Function WinProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim OldProc As Long
OldProc = GetProp(hwnd, "OLDWPROC")
If uMsg = WM_DESTROY Then 'Fait le ménage avant la fermeture
SetWindowLong hwnd, GWL_WNDPROC, OldProc
RemoveProp hwnd, "OLDWPROC"
End If
'Tous les événements sont transmis à vb sauf WM_SETFOCUS
If uMsg <> WM_SETFOCUS Then WinProc = CallWindowProc(OldProc, hwnd, uMsg, wParam, lParam)
End Function
Puis dans le code de création du bouton
With ButModif
...
Subclass .hwnd
End With
Bon, finalement, la solution de Kristof_Koder avec les groupes de contrôles était beaucoup plus simple...
xav0
Messages postés20Date d'inscriptionsamedi 23 septembre 2006StatutMembreDernière intervention10 octobre 2007 25 sept. 2007 à 20:54
Pour obtenir le numéro du nouveau bouton avec le code de Kristof_Koder ? Juste après l'instruction Load btnGraphique(...), il faut mémoriser btnGraphique.Count-1 (quantité qui augmente à chaque nouveau bouton). J'espère que ça répond à la question, sinon je ne vois pas de quoi il s'agit.
cs_hustler
Messages postés85Date d'inscriptionmercredi 17 septembre 2003StatutMembreDernière intervention20 mars 2012 26 sept. 2007 à 09:54
oui ça je connais
mais en fait pour expliquer ce que je cherche je fais l'affichage d'une table grace a des groupes. J'ai donc un bouton pour chaque ligne affichée (grace a toi ).
en fait je voudrais qu'a chaque fois que je clique sur un bouton créé dynamiquement il me donne son "index"