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

 Delphi Discussion :

Positionner sa fiche dans le bas de l'écran !


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 427
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut Positionner sa fiche dans le bas de l'écran !
    Bonjour à toutes et à tous,

    J'aimerai positionner ma fiche dans le bas de l'écran, je détecte donc la résolution de mon écran et la hauteur de ma TaskBar, cela fonctionne, mais si la TaskBar est en mode masqué, la forme se place dans le bas de l'écran et si elle est en mode visible, la forme se place au dessus de la TaskBar ce qui est correct.

    En sachant que ma TaskBar à une hauteur détectée de 40 en mode visible et 0 en mode masqué, ce code fonctionne en mode masqué en renseignant la hauteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var 
        r : TRect;
        hauteur:integer;
    begin
      SystemParametersInfo(SPI_GETWORKAREA,0,@r,0);
    
      hauteur:=screen.height - r.bottom;
    
      label1.caption := inttostr(hauteur);
    
      Form1.Left := edlargeur.value Div 2 - Form1.width div 2;
      Form1.Top := Edhauteur.value - form1.height -40 ;
    Le but est naturellement d'éviter de renseigner cette hauteur car je suppose que cette hauteur varie d'un écran à l'autre et de placer ma fiche au dessus de cette taskBar comme si elle était en mode visible !

    Merci éventuellement de l'aide.

    @+,

    Cincap

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 74
    Points : 76
    Points
    76
    Par défaut
    Bonjour,

    Regardes du coté de Screen.WorkAreaRect ou WorkAreaHeight, cela renvoie la zone de l'écran utilisable sans la barre de tâches, donc à priori :
    Screen.height - screen.WorkAreaHeight devrait te donner la hauteur de la barre de tâches

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 131
    Points
    13 131
    Par défaut
    Quelques remarques:

    1. Il faut penser que la barre de tâches peut être positionnée sur n'importe quelle bord de l'écran. La considérer systématiquement en bas est une erreur.
    2. La hauteur de la barre varie en fonction de l'OS, de la hauteur définie par l'utilisateur (1 ligne, 2 lignes, etc.) et des DPI choisis. Fixer 40 est pour le moins aléatoire !
    3. Qui te dit que ton application sera lancée sur le moniteur principal ? Les secondaires n'auront pas (forcément) de barre de tâches.
    4. Qui te dit qu'il n'y a pas d'autres barres de tâches (plus précisément barres d'application ou AppBar en anglais) ? Par exemple celle d'Office.
    5. Si la barre est masquée, avoir ta fenêtre flottant à 40 pixels du bord sera du plus mauvais effet !

    A noter encore que la zone de travail peut être récupérée par Screen.WorkAreaRect pour le moniteur principal et par Screen.Monitors[x].WorkAreaRect pour les secondaires.

    EDIT:
    Fini de manger, quelques remarques supplémentaires
    Pour récupérer le rectangle utilisé par la barre de tâches, il est possible d'utiliser la fonction SHAppBarMessage avec en paramètre ABM_GETTASKBARPOS. Les différents contrôles et réglages possibles sont listés ici.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 427
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    @ Andnotor, merci de ta réponse, mes applications tournent sur mon Pc ou dans la famille donc pas de problème pour la définir en bas;

    en suivant ta suggestion, avec ceci, je détermine sa position, si elle est masquée ou pas.

    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
     
    Var
    AppData: TAppBarData;
    PosString: string;
    begin
      AppData.cbSize := sizeof(AppData);
      AppData.hWnd := FindWindow('Shell_TrayWnd', nil);
      SHAppBarMessage(ABM_GETTASKBARPOS, AppData);
     
      With AppData.rc do
        PosString := Format(' [%d, %d];[%d, %d] ', [Left, Top, Right, Bottom]);
     
      If SHAppBarMessage(ABM_GETAUTOHIDEBAR, AppData) = AppData.hWnd Then
        PosString := PosString + 'AutoHide' Else
        PosString := PosString + 'NonAutoHide';
      case AppData.uEdge of
        ABE_LEFT: ShowMessage('Left Position' + PosString);
        ABE_TOP: ShowMessage('Top Position' + PosString);
        ABE_RIGHT: ShowMessage('Right Position' + PosString);
        ABE_BOTTOM: ShowMessage('Bottom Position' + PosString);
     
      end;
    La hauteur est définie à 860 ce qui correspond à la hauteur de mon écran 900 - la hauteur de ma TaskBar 40.

    Comment récupérer cette hauteur pour placer ma fiche ?

    @+,

    Cincap

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 131
    Points
    13 131
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Top := Screen.Height -(AppData.rc.Bottom -AppData.rc.Top) -Height;

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 427
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    @ Andnotor, c'est effectivement la bonne solution et je t'en remercie vivement.

    J'ai donc procédé comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.FormActivate(Sender: TObject);
    var
     AppData: TAppBarData;
    begin
      AppData.cbSize := sizeof(AppData);
      AppData.hWnd := FindWindow('Shell_TrayWnd', nil);
      SHAppBarMessage(ABM_GETTASKBARPOS, AppData);
     
    Top := Screen.Height -(AppData.rc.Bottom -AppData.rc.Top) -Height;
     
    end;
    Question parfaitement résolue.

    @+,

    Cincap

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/05/2010, 10h55
  2. Comment afficher chaque fiche dans la barre des taches ?
    Par HASSANAIT dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/08/2005, 03h13
  3. Positionnement de ligne dans un TMemo
    Par tixu dans le forum Composants VCL
    Réponses: 4
    Dernier message: 18/12/2004, 11h45
  4. Réponses: 6
    Dernier message: 06/05/2004, 09h05
  5. [Drag & Drop] Mettre une fiche dans un panel
    Par corwin_d_ambre dans le forum Composants VCL
    Réponses: 5
    Dernier message: 12/01/2004, 10h46

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