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

API, COM et SDKs Delphi Discussion :

Problème d'API SetWindowPos


Sujet :

API, COM et SDKs Delphi

  1. #1
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut Problème d'API SetWindowPos
    Salut

    Je sais d'avance que vous allez trouver ça c.. mais j'ai un problème pour utiliser les API dans un programme Delphi (suis loin d'être l'experte qu'on a pourtant confirmé).

    J'ai coutume d'utiliser les API Windows dans des programmes VB6... d'où ma difficulté. Le problème c'est que c'est sans doute trop simple...

    (de plus, il me semble avoir déjà posé la question, mais je ne trouve plus la discussion... sans doute qu'elle aura été flushée)

    Voici

    Il s'agit de la fonction SetWindowPos. Je l'ai déjà utilisé en VB pour faire en sorte qu'un fenêtre reste au dessus des autres sans empêcher celles-ci d'avoir le focus.

    En VB, il faut déclarer une fonction de l'api (dans la section des déclaration) avant de pouvoir l'utiliser.

    En Delphi, apparemment, non. A moins que je ne me sois gourée.

    So (comme disent les angliches), j'ai un checkBox que s'il est coché cette fonction est activée, sinon la fenêtre se comporte normalement. Du moins, c'est ce qui devrait se passer.

    Le code :
    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
    procedure TFrmColorSelector.chbAuDessusClick(Sender: TObject);
    begin
    if chbAuDessus.Checked then
        begin
        SetWindowPos (handle, HWND_TOPMOST, Left, Top, Width, Height,0);
        // Et pour s'amuser...
        BorderStyle     := bsNone;
        Height          := lgHautMin;
        Color           := clActiveCaption;
        AlphaBlend      := true;
        AlphaBlendValue := 160
        end
      else
        begin
        SetWindowPos (handle, HWND_NOTOPMOST, Left, Top, Width, Height,0);   
        // Un peu de sérieux, tout de même...
        BorderStyle     := bsSingle;
        Height          := lgHautMax;
        Color           := clBtnFace;
        AlphaBlend      := true;
        AlphaBlendValue := 255
        end
    end;
    De plus, en VB, il faut explicitement déclarer les constantes HWND_TOPMOST et HWND_NOTOPMOST. J'ai donc essayé avec une déclaration de constante, et sans la déclaration. Avec, j'ai un message d'erreur. J'ai aussi essayé avec la syntaxe MajMin (Hwnd_TopMost, par exemple), et là non plus, pas de résultat...

    Alors, là, vraiment, je sais plus..


    À titre indicatif, le code VB qui marche :
    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
     
    Option Explicit
     
    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 Const HWND_TOPMOST = -1
    Private Const HWND_NOTOPMOST = -2
    //'*** Fin des déclaration niveau module ***
     
    Private Function PositionForm(ByVal Feuille As Form, Optional PrePlan As Boolean = True) As Long
        Dim lgConst As Long
        If PrePlan Then
            lgConst = HWND_TOPMOST
          Else
            lgConst = HWND_NOTOPMOST
        End If
        PositionForm = SetWindowPos(Feuille.hwnd, lgConst, Feuille.Left \ Screen.TwipsPerPixelX, _
                        Feuille.Top \ Screen.TwipsPerPixelY, _
                        Feuille.Width \ Screen.TwipsPerPixelX, _
                        Feuille.Height \ Screen.TwipsPerPixelY, 0)
    End Function
     
    Private Sub Check1_Click()
        If Check1 Then
            PositionForm Form1, True
          Else
            PositionForm Form1, False
        End If
    End Sub
    Oui, c'est vrai, il y a une différence.

    J'avais essayé aussi, en Delphi, de procéder de cette façon. Vu qu'un fonction, par définition, ça retourne une valeur. Évidemment, d'une modification à l'autre, je n'ai plus le code que j'avais alors tapé... et qui de toutes façons ne fonctionnait pas non plus.

    Alors, si vous avez quelques pistes. Histoire de me désembrouiller.

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Yep !

    J'utilise la même chose que toi (avec des truc en moins, et des trucs en plus : c'est ptêt' les trucs en plus qui font la différence), ce qui est dommage c'est que tu ne nous dis pas ce qui ne fonctionne pas...

    Bon, mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TMainForm.ckb_OnTopClick(Sender: TObject);
    begin
      if ckb_OnTop.Checked
      then
        SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
          SWP_NOMOVE + SWP_NOSIZE)
      else
        SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0,
          SWP_NOMOVE + SWP_NOSIZE);
    end;
    Valà,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Ha! Tiens donc! Il y a dans ton code deux constantes en plus que je ne connaissais pas. Mais la fenêtre est déjà configurée pour ne pas être redimensionnée. Alors je n'avais pas pensé chercher à trouver quelque chose dans ce genre là.

    Donc, j'essaie avec les constante en question (dans le prog en Delphi, parce qu'en VB, il marche) et, le cas échéant, j'explique ce qui ne marche pas, en long, en large et même en travers s'il le faut.

    Merci de m'encourager!

    [Edit : Ajout]
    Bon... c'est presque gênant de l'admettre mais en enlevant les bouts de code que j'avais ajouté pour m'amuser (color, alphaBlend, etc.) et en ajoutant les constantes sus mentionnées, tout va pour le mieux dans le meilleur des mondes possible.)

    C'est donc résolu mais c'est une petite application à suivre de près car elle permet d'ajouter un code de couleur dans le code HTML, Java, C, VB ou Delphi autre que les couleurs prédéfinies.

    Comme le montre l'image jointe, la fenêtre flotte au dessus de celle qui a le focus.

    La prochaine étape :
    Faire en sorte que mon application place le code directement dans l'éditeur au point d'insertion. Là, je sens que je vais avoir du boulot!

    Merci encore pour le tuyau.

    [Re-Edit : autre ajout]
    Comme je voulais m'amuser, j'ai remis le code amusant, puis le code sérieux après. Comme ça, personne ne nuit à personne.

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

Discussions similaires

  1. Problème avec API GetDlgItem
    Par crazyman8 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 02/01/2008, 23h38
  2. problème tracbar API windows
    Par moustick1991 dans le forum C
    Réponses: 13
    Dernier message: 12/12/2007, 11h43
  3. Problème utilisation API MySQL
    Par naiko dans le forum C
    Réponses: 4
    Dernier message: 11/05/2006, 09h55
  4. problème avec "API Windows en C"
    Par Vince-le-fou dans le forum Windows
    Réponses: 2
    Dernier message: 23/11/2005, 15h22
  5. API SetWindowPos
    Par Philton dans le forum Windows
    Réponses: 3
    Dernier message: 27/09/2005, 09h21

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