Style

Résolu
cs_hustler
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 mars 2012
- 25 sept. 2007 à 11:14
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

17 réponses

Kristof_Koder
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
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()
3
Kristof_Koder
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
26 sept. 2007 à 14:21
hustler < Tu tournes en rond la !! Juste ca à faire :

Private Sub CmdModif_Click(Index As Integer)
MsgBox Index
End Sub
3
cs_Exploreur
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
14
25 sept. 2007 à 11:56
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

 
0
cs_hustler
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 mars 2012

25 sept. 2007 à 12:05
merci de ta reponse

oui mais la comme c'est du dynamique
je n'ai aucun moyen de le créer en mode graphique ???
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
xav0
Messages postés
20
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
10 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
0
cs_hustler
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 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 !!!!!

les boutons s'affichent dans une frame !!!
0
xav0
Messages postés
20
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
10 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...
0
cs_hustler
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 mars 2012

25 sept. 2007 à 16:49
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

@+
0
cs_hustler
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 mars 2012

25 sept. 2007 à 17:26
encore un petit detail

il y a un moyen pour obtenir le numero du bouton créé ???
0
xav0
Messages postés
20
Date d'inscription
samedi 23 septembre 2006
Statut
Membre
Dernière intervention
10 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.
0
Kristof_Koder
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
25 sept. 2007 à 22:53
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.
0
cs_hustler
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 mars 2012

25 sept. 2007 à 23:07
en fait je ne cherche pas le dernier bouton créé
mais je voudrais savoir en cliquant sur un bouton quel est son index ???
0
Kristof_Koder
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
25 sept. 2007 à 23:11
Dans tes EVt du groupe btnGraphique, tu as un argument supplémentaire, nommé Index qui te donne cela automatiquement
0
cs_hustler
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 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"
0
cs_hustler
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 mars 2012

26 sept. 2007 à 10:05
c bon j'ai trouvé

Private Sub CmdModif_Click(Index As Integer)


    MsgBox CmdModif(Index).Index


End Sub

merci beaucoup pour votre aide
0
cs_hustler
Messages postés
85
Date d'inscription
mercredi 17 septembre 2003
Statut
Membre
Dernière intervention
20 mars 2012

26 sept. 2007 à 15:43
 oui effectivement c'est beaucoup plus simple

merci pour ton aide
0
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
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
0