Style [Résolu]

Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 mars 2012
- - Dernière réponse : alabal
Messages postés
1
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
19 octobre 2007
- 19 oct. 2007 à 12:48
Bonjour,

comment doit'on faire pour affecter en code un style a un bouton ???

si je mets : Button.Style = 1
j'ai le message : impossible d'affecter une propriété en lecture seule

pour info je fais cette affectation lors de la création dynamique d'un bouton

                    Dim Button As CommandButton
                    Set Button = Controls.Add("VB.CommandButton", "cmd" & (i))
                    Button.Width = CmdModif.Width
                    Button.Height = CmdModif.Height
                    Button.Top = lblclef(i).Top
                    Button.Left = CmdModif.Left
                    Button.Picture = CmdModif.Picture
                    Button.Visible = True
                   
                    Button.Style = 1

merci d'avance pour votre aide
Afficher la suite 

17 réponses

Meilleure réponse
Messages postés
920
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
7
3
Merci
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()

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 191 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Kristof_Koder
Messages postés
920
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
7
3
Merci
hustler < Tu tournes en rond la !! Juste ca à faire :

Private Sub CmdModif_Click(Index As Integer)
MsgBox Index
End Sub

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 191 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Kristof_Koder
Messages postés
4824
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
11
0
Merci
Salut,

C'est une propriété que tu ne peux que modifier en mode dévellopement, d'ailleurs le message d'erreur est bien clair...

Tu définis d'abord ton style de boutons(1 = graphitical), puis en code tu fais :

Button.Picture = LoadPicture("C:\CheminDeTonImage")

A+
Exploreur

 Linux a un noyau, Windows un pépin

 
Commenter la réponse de cs_Exploreur
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 mars 2012
0
Merci
merci de ta reponse

oui mais la comme c'est du dynamique
je n'ai aucun moyen de le créer en mode graphique ???
Commenter la réponse de cs_hustler
Messages postés
20
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
10 octobre 2007
0
Merci
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
Commenter la réponse de xav0
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 mars 2012
0
Merci
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 !!!!!

les boutons s'affichent dans une frame !!!
Commenter la réponse de cs_hustler
Messages postés
20
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
10 octobre 2007
0
Merci
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...
Commenter la réponse de xav0
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 mars 2012
0
Merci
effectivement c'est beaucoup plus simple

de plus j'ai mis le code directement dans le bouton et il s'affect automatiquement

merci beaucoup pour votre aide

@+
Commenter la réponse de cs_hustler
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 mars 2012
0
Merci
encore un petit detail

il y a un moyen pour obtenir le numero du bouton créé ???
Commenter la réponse de cs_hustler
Messages postés
20
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
10 octobre 2007
0
Merci
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.
Commenter la réponse de xav0
Messages postés
920
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
7
0
Merci
Moi je dirais ... pas besoin de le mémoriser ! A chaque instant tu peux connaitre l'index du dernier bouton créé par btnGraphique.Count - 1.
Commenter la réponse de Kristof_Koder
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 mars 2012
0
Merci
en fait je ne cherche pas le dernier bouton créé
mais je voudrais savoir en cliquant sur un bouton quel est son index ???
Commenter la réponse de cs_hustler
Messages postés
920
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
7
0
Merci
Dans tes EVt du groupe btnGraphique, tu as un argument supplémentaire, nommé Index qui te donne cela automatiquement
Commenter la réponse de Kristof_Koder
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 mars 2012
0
Merci
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"
Commenter la réponse de cs_hustler
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 mars 2012
0
Merci
c bon j'ai trouvé

Private Sub CmdModif_Click(Index As Integer)


    MsgBox CmdModif(Index).Index


End Sub

merci beaucoup pour votre aide
Commenter la réponse de cs_hustler
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 mars 2012
0
Merci
 oui effectivement c'est beaucoup plus simple

merci pour ton aide
Commenter la réponse de cs_hustler
Messages postés
1
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
19 octobre 2007
0
Merci
J'ai une appli développée sous Windows98 avec des boutons style graphical,

Pour passer sius XP il faut le style des commandbutton à 0

Après lecture des commentaires, y-at'il une possibilté pour effectuer cette manip

au lancement de l'appli sous WinXP ; si oui y'at'il un exemple de code ?


Merci
Commenter la réponse de alabal