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

Access Discussion :

[API] Equivalent de la méthode Move


Sujet :

Access

  1. #1
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut [API] Equivalent de la méthode Move
    Bonjour,

    J'aurais besoin d'un équivalent de la méthode Move qui permet de déplacer/redimensionner une fenêtre de form ou d'état.

    J'ai déjà fait quelques essais, aussi bien en m'inspirant de code fournit par tofalu dans les sources, que celui d'Argy dans son tuto sur le positionnement d'un form, ou que celui du roi des API, Arkham :
    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
    Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
    Public Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
     
    Public Const LOGPIXELSX = 88
    Public Const LOGPIXELSY = 90
     
    Public Function GetXPixelsPerTwip() As Long
     
        Dim NbPointParPouceX As Long
        NbPointParPouceX = GetDeviceCaps(GetDC(0), LOGPIXELSX)
        GetXPixelsPerTwip = NbPointParPouceX
    End Function
     
    Public Function GetYPixelsPerTwip() As Long
     
        Dim NbPointParPouceY As Long
        NbPointParPouceY = GetDeviceCaps(GetDC(0), LOGPIXELSY)
        GetYPixelsPerTwip = NbPointParPouceY
    End Function
    Mais pour l'instant j'ai surtout réussi à faire planter Access.

    Donc si quelqu'un a déjà ça sous la main, ou se sent capable de faire ça, je suis preneur.

    Sinon je posterai ma soluce, dès que j'aurai le temps de me pencher sur la question.

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

    Pourquoi n'utilises-tu pas : DoCmd.MoveSize , cela ferait la même chose et ne plantera pas Access

    Starec

  3. #3
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    Tu as raison, des fois je me complique la vie pour ien. Cependant il faudra que je teste, car utilisant des fenêtres indépendante et/ou modale, ce n'est pas toujours simple d'activer la bonne fenêtre via l'objet DoCmd...

    J'essaierai, mais si quelqu'un a les API, ça me tente toujours.

    EDIT : Activer un objet via Docmd est encore plus compliqué si plusieurs instances d'un même form ou report existent. Je dois absolument passer par des API's.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Re

    le docmd est à mettre dans le load de ton formulaire, et et effectivement si tu as plusieurs instances de la même form il vont se mettre l'un sur l'autre

    Starec

  5. #5
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    J'ai plusieurs instances, et je ne veux pas mettre de code dans le Load car cet événement se produit dès le New, ce qui ne va ps du tout pour ce que je veux faire.

    Donc, des API's, des API's...

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Par défaut
    bonjour,

    il y a peut être votre bonheur ici :
    http://docvb.free.fr/apidetail.php?idapi=146

    Cordialement,

    Philippe

  7. #7
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    Je tague résolu dès que j'aurais testé, mais ça a l'air tout bon.

    Merci beaucoup Philippe.

  8. #8
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    Pour l'instant, j'ai ça :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Option Compare Database
    Option Explicit
     
    Private Const HWND_BOTTOM = 1 'Place la fenêtre en dessous de toutes les autres.
    Private Const HWND_NOTOPMOST = -2 'Place la fenêtre au dessus de toutes les fenêtres qui n'ont pas l'attribut "TOPMOST" (et en dessous de ces dernières).
    Private Const HWND_TOP = 0 'Place la fenêtre au premier niveau.
    Private Const HWND_TOPMOST = -1 'Place la fenêtre au premier niveau, celle-ci conserve cet attribut même lorsqu'elle perd le focus.
    Private Const SWP_HIDEWINDOW = &H80 'Cache la fenêtre.
    Private Const SWP_NOACTIVATE = &H10 'N'active pas la fenêtre.
    Private Const SWP_NOMOVE = &H2 'Garde la même position (les paramètres X et Y ne sont pas pris en compte).
    Private Const SWP_NOSIZE = &H1 'Conserve les dimensions courantes (paramètres cx et cy pas pris en compte).
    Private Const SWP_SHOWWINDOW = &H40 'Affiche la fenêtre.
     
    Private Declare Function SetWindowPos Lib "user32" ( _
                     ByVal hwnd As Long, _
                     ByVal hWndInsertAfter As Long, _
                     ByVal X As Long, _
                     ByVal Y As Long, _
                     ByVal cx As Long, _
                     ByVal cy As Long, _
                     ByVal wFlags As Long) As Long
     
    Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
    Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
     
    Private Const HWND_DESKTOP As Long = 0
    Private Const LOGPIXELSX As Long = 88
    Private Const LOGPIXELSY As Long = 90
     
    Function TwipsPerPixelX() As Single
    Dim lngDC As Long
        lngDC = GetDC(HWND_DESKTOP)
        TwipsPerPixelX = 1440& / GetDeviceCaps(lngDC, LOGPIXELSX)
        ReleaseDC HWND_DESKTOP, lngDC
    End Function
     
    Function TwipsPerPixelY() As Single
    Dim lngDC As Long
        lngDC = GetDC(HWND_DESKTOP)
        TwipsPerPixelY = 1440& / GetDeviceCaps(lngDC, LOGPIXELSY)
        ReleaseDC HWND_DESKTOP, lngDC
    End Function
     
     
    Public Sub Move2K(ByVal hwnd As Long, ByVal Left As Long, ByVal Top As Long, ByVal Width As Long, ByVal Height As Long)
     
        SetWindowPos hwnd, HWND_NOTOPMOST, _
                    Left \ TwipsPerPixelX, _
                    Top \ TwipsPerPixelY, _
                    Width \ TwipsPerPixelX, _
                    Height \ TwipsPerPixelY, 0
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Commande0_Click()
     
        Move2K Me.hwnd, Me.WindowLeft, Me.WindowTop, Me.WindowWidth, Me.WindowHeight
    End Sub
    Théoriquement avec ce code, le formulaire ne devrait pas bouger lorsqu'on clique sur son bouton Commande0.
    Mais en fait, il remonte. Je ne sais pas pourquoi.

  9. #9
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    salut,

    regarde les API GetWindowPlacement et SetWindowPlacement, elles pourraient t'aider

  10. #10
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonsoir,
    Citation Envoyé par FRED.G
    Théoriquement avec ce code, le formulaire ne devrait pas bouger lorsqu'on clique sur son bouton Commande0.
    Mais en fait, il remonte. Je ne sais pas pourquoi.
    Ca ne viendrait pas de ce que SetWindowPos fonctionne en coordonnées relatives au coin supérieur gauche de l'écran,
    alors que Me.WindowLeft et Me.WindowTop seraient relatifs au coin supérieur gauche de la zone client de la fenêtre Access ?

    Est-ce que WindowLeft et WindowTop sont des nouvelles propriétés (je suis en 2000) ?

    Bon courage

  11. #11
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    Citation Envoyé par LedZeppII
    Ca ne viendrait pas de ce que SetWindowPos fonctionne en coordonnées relatives au coin supérieur gauche de l'écran,
    alors que Me.WindowLeft et Me.WindowTop seraient relatifs au coin supérieur gauche de la zone client de la fenêtre Access ?
    Non il s'agit bien de la position par rapport à l'écran :
    Citation Envoyé par Aide Access
    L'exemple suivant renvoie la position à l'écran du bord supérieur et du bord gauche du premier formulaire du projet en cours.
    Est-ce que WindowLeft et WindowTop sont des nouvelles propriétés (je suis en 2000) ?
    Je ne pense pas. Mais tu pourrais facilement nous le dire avec un petit coup de F2.

  12. #12
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Par défaut
    bonjour,

    LedZeppII a écrit :
    ...alors que Me.WindowLeft et Me.WindowTop seraient relatifs au coin supérieur gauche de la zone client de la fenêtre Access ?
    L'aide d'Access 2003 confirme :
    WindowLeft :
    Renvoie une valeur de type Integer qui indique la position à l'écran, en twips, du bord gauche d'un formulaire ou d'un état par rapport au bord gauche de la fenêtre de Microsoft Access. Lecture seule.
    Les Api donnent des coordonnées absolues alors que les propriétés Me.Window... donnent des coordonnées relatives.

    Comme il n'existe pas de pendant de SetWindowPos, le mieux est d'utiliser, comme le dit Arkham46, set et getwindowplacement ce qui permet de ne travailler qu'avec des coordonnées absolues :
    http://support.microsoft.com/kb/455204/fr

    Cordialement,

    Philippe

  13. #13
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    L'aide que j'ia cité n'est pas assez précise, c'est celle d'XP.

    En tout cas vous avez raison. J'en profite pour remercier Arkham.

Discussions similaires

  1. Equivalent de la méthode onTextChange
    Par étudiante_info dans le forum Android
    Réponses: 1
    Dernier message: 14/04/2011, 18h28
  2. Equivalent de la méthode EnsureVisible
    Par FRED.G dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 12/10/2008, 19h14
  3. [VB]déplacement d'un controle image avec la méthode move
    Par marco62118 dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 22/03/2006, 19h03
  4. [C#] Equivalent méthode RGB de Visual Basic
    Par frechy dans le forum C#
    Réponses: 11
    Dernier message: 13/11/2005, 01h13
  5. [C#] Equivalence des API java en C# en ligne
    Par totoranky dans le forum Windows Forms
    Réponses: 6
    Dernier message: 15/02/2005, 01h16

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