IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Centrer image sur userform [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut Centrer image sur userform
    Bonjour,

    Sur un classeur, j'affiche en plein écran un userform comportant un contrôle image. Concernant le plein écran, j'ai réussi à trouver un code qui récupère les variables de configuration de l'écran. En revanche, selon l'écran et sa résolution, le contrôle image a tendance à bouger ! Ou plutôt le contraire, lui ne s'adapte pas au changement d'écran. Pensez-vous qu'il soit possible de le centrer sur le userform quelque soit le type d'écran, et si oui, comment ?

    Je tiens à préciser que dans les propriétés de l'image, j'ai déjà placé fmPictureAlignmentCenter et fmPictureSizeModeZoom, mais cela ne résout pas le problème.

    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Un code ce ce style à adapter à tes noms (ici c'est les noms par défaut) devrait le faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub UserForm_Initialize()
        With Me.Image1
            .Top = (Me.InsideHeight - Me.Image1.Height) / 2
            .Left = (Me.InsideWidth - Me.Image1.Width) / 2
        End With
    End Sub
    Philippe

  3. #3
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut
    Bonjour Philippe,

    Merci pour ta réponse.
    Je viens de tester ton code, malheureusement il ne fonctionne pas du tout.. Je l'ai essayé uniquement sur mon poste pour le moment, et là l'image sur le userform est totalement décalée sur la droite, si bien qu'on ne la voit pas entièrement.

    Au besoin, je peux fournir un fichier exemple pour constater.

  4. #4
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Fait voir le code qui te permet de te-dimensioner l'userform..

  5. #5
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut
    Bonjour bbil,

    Voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub UserForm_Initialize()
     Dim hWnd As Long, exLong As Long, zFactor As Integer
     
     hWnd = FindWindowA(vbNullString, Me.Caption)
     exLong = GetWindowLongA(hWnd, -16)
     If exLong And &H880000 Then SetWindowLongA hWnd, -16, exLong And &HFF77FFFF
     Me.Width = ScreenWidth * PointsPerPixel
     Me.Height = ScreenHeight * PointsPerPixel
     
     With Me.Image1
        .Top = (Me.InsideHeight - Me.Image1.Height) / 2
        .Left = (Me.InsideWidth - Me.Image1.Width) / 2
     End With
     End Sub
    Et dans un module:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Private Declare Function GetSystemMetrics Lib "User32" (ByVal nIndex As Long) As Long
    Private Const SM_CXSCREEN = 0 'Screen width
    Private Const SM_CYSCREEN = 1 'Screen height
     
    Private Declare Function GetDC Lib "User32" (ByVal hWnd As Long) As Long
    Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, ByVal nIndex As Long) As Long
    Private Declare Function ReleaseDC Lib "User32" (ByVal hWnd As Long, ByVal hDC As Long) As Long
    '
    Private Const LOGPIXELSX = 88 'Pixels/inch in X
    '
    'A point is defined as 1/72 inches
    Private Const POINTS_PER_INCH As Long = 72
     
    'The width of the screen, in pixels
    Public Function ScreenWidth() As Long
    ScreenWidth = GetSystemMetrics(SM_CXSCREEN)
    End Function
     
    'The height of the screen, in pixels
    Public Function ScreenHeight() As Long
    ScreenHeight = GetSystemMetrics(SM_CYSCREEN)
    End Function
     
    'The size of a pixel, in points
    Public Function PointsPerPixel() As Double
    Dim hDC As Long
    Dim lDotsPerInch As Long
    hDC = GetDC(0)
    lDotsPerInch = GetDeviceCaps(hDC, LOGPIXELSX)
    PointsPerPixel = POINTS_PER_INCH / lDotsPerInch
    ReleaseDC 0, hDC
    End Function

  6. #6
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    pas de problème avec ce code ...

  7. #7
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut
    Tu obtiens bien une image centrée sur le userform ? Et ce quelque soit la résolution de l'écran ? Je confirme que pour moi ça ne passe pas, décalage sur la droite..

    Je ne te propose pas de t'envoyer le fichier, je crois que tu es de ceux qui ne les ouvre pas non ?

    Edit:

    Quelques détails complémentaires: je viens de faire un autre test, en affichant directement le userform à la fin de la procédure d'initialisation. Là, en effet, ça fonctionne, j'ai bien l'image parfaitement centrée !
    En fait, ça ne marche plus quand je clique sur la feuille graphique, sur laquelle j'ai placé le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Option Explicit
     
    Private Sub Chart_Activate()
     
    'Affichage du graphe dans une popup en plein écran
     
    Dim fname As String
    Dim ch As Chart
    Dim t As Double, h As Double, l As Double, w As Double
     
    fname = ThisWorkbook.Path & "\ Ch.bmp"
    Set ch = ActiveChart
    ch.Export fname, "Bmp"
    popupIndicateur.Image1.Picture = LoadPicture(fname)
    Kill fname
     
    Application.WindowState = xlMinimized
    Application.Visible = False
     
    popupIndicateur.Show 0
     
    End Sub
    Mais on se rapproche du résultat je pense ! Alors, curieux que ça ne passe pas comme ça non ?

    Edit 2: Je rajoute même que c'est le fait de mettre une copie image du graphe qui change la donne.. On peut contourner une partie du problème en sortant l'autosize du contrôle image, mais du coup j'obtiens un graphe image bien plus petit, et moins lisible...

  8. #8
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    ben en chargeant l'image tu modifie la taille du contrôle image .. il faut relancer le code de centrage de philippe ...

  9. #9
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut
    Pourtant, je n'ai pas l'impression:

    - Dans le code de la page graphique, je commence par charger l'image, puis je fais popupIndicateur.Show 0.

    - Et dans le code d'initialisation de popupIndicateur, j'y ai placé le code de Philippe.

    Comment tu vois les choses ?

  10. #10
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Le code d'initialisation ce fait au chargement de ton userform (load..) ce chargement est effectué automatiquement par VB lorsque tu accède au objet sur ton Userform.. (image..)

    et donc le code d'initialisation s'effectue .. puis c'est le load Picture...

    si tu ne définit pas d'image par défaut tu peu visualiser cela, tu rajoute la ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      If Me.Image1.Picture Is Nothing Then MsgBox "pas d'image de chargée dans Init" Else MsgBox "Image chargée dans Init"
     With Me.Image1
    avant le With Image ... de ton Initiate ..

    et dans activate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub UserForm_Activate()
    If Me.Image1.Picture Is Nothing Then MsgBox "pas d'image de chargée dans Activate" Else MsgBox "Image chargée dans Activage"
     With Me.Image1
        .Top = (Me.InsideHeight - Me.Image1.Height) / 2
        .Left = (Me.InsideWidth - Me.Image1.Width) / 2
     End With
    End Sub

  11. #11
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut
    Bonjour bbil,

    Ton idée de passer avec les msgbox est très bien, ça m'a en effet permis de me rendre compte que l'image n'était pas chargée alors que je faisais les réglages !

    Du coup, en suivant tes conseils, ça marche à présent parfaitement.

    Merci pour ton aide, précieuse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Centrer zoom sur image
    Par Esooo dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 08/04/2009, 00h22
  2. Mettre 2 images sur la même ligne et les centrer par rapport au texte
    Par Lonlie dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 3
    Dernier message: 04/07/2008, 15h47
  3. Centrer une image sur la hauteur de la page
    Par koKoTis dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 09/01/2008, 21h58
  4. [GD] Centrer texte sur une image
    Par maximenet dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 24/04/2007, 10h48
  5. [VBA-E] Question sur image dans userform ?
    Par damsmut dans le forum Excel
    Réponses: 3
    Dernier message: 04/04/2007, 06h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo