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

Lazarus Pascal Discussion :

[Lazarus] Iconisation de programme


Sujet :

Lazarus Pascal

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 192
    Par défaut [Lazarus] Iconisation de programme
    Bonjour,

    j'ai un créé un petit programme en Lazarus et quand je l'iconise pour qu'il se mette dans la barre de tâches, cela se passe en plusieurs étapes..

    1) il s'iconise au dessus de Démarrer

    2) ensuite il se met bien dans la barre de tâches... et ce en revenant du haut de l'écran...

    en clair ça zigzag sur l'écran ...

    NB je suis en windows 2000 et c'est un vieux promgamme que j'avais compilié en decembre 2005 (je ne sais plus la version du comilateur employé)

    une chose est sûre ça ne fait pas très joli... ni professionnel ...

    merci si vous avez une astuce

    JoseF

  2. #2
    Membre chevronné

    Inscrit en
    Avril 2003
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 284
    Par défaut
    L'executable créé par lazarus par défaut contient en fait deux fenetres...

    Une fenetre du projet invisible, de style popup qui est placée en 0,0 et qui fait 0 pixels de large par 0 pixel de haut.

    La fenetre que tu définis dans l'IDE...

    Lors de la minimisation de l'appli, l'exe met ta fenetre en bas à gauche, puis minimise la fenetre cachée...

    Pour t'en convaincre, voici un moyen de 'voir' la fenetre cachée (sous windows):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Button1Click(Sender: TObject);
    var
    HandleOfHiddenWindow : HWND;
    begin
    HandleOfHiddenWindow := FindWindow(NIL, PChar('project1'));
    setwindowpos(HandleOfHiddenWindow,-1,0,0,100,100,$40);
    end;
    Je commance par chercher la fenetre en connaissant son titre, puis je lui donne une taille de 100*100
    le parametre -1 signifie HWND_TOPMOST et $40 remplace SWP_SHOWWINDOW

    Un test rapide montre que l'utilisation de la commande :
    Application.minimize reduit en une fois le tout, mais depuis la position de la fenetre principale (normalement cachée).

    Setwindowpos permettant de deplacer une fenetre, une solution pour eviter ce bug visuel sous windows est de touver cette fenetre, la déplacer à chaque déplacement de notre form, pour qu'elle reste derrière, et utiliser la commande Application.minimize lorsqu'on veut reduire notre fenetre.

    Ce qui peu etre ecrit ainsi :
    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
    54
    55
    56
    unit Unit1; 
     
    {$mode delphi}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons, windows;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        // fonction personnalisée lors du deplacement de la fenetre
        procedure WMMOVE (var Msg : TMessage); message WM_MOVE;
      private
        { private declarations }
      public
        { public declarations }
      end; 
     
    var
      Form1: TForm1; 
      HandleOfHiddenWindow : HWND;
     
    implementation
     
    { TForm1 }
     
    // A la creation de l'appli, on cherche le handle de la fenetre
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      HandleOfHiddenWindow := FindWindow(NIL, PChar('project1'));
    end;
     
    // Quand on a bougé notre fenetre, on bouge l'autre
    procedure TForm1.WMMOVE (var Msg : TMessage);
    begin
      setwindowpos(HandleOfHiddenWindow,-1,msg.lparamlo,msg.lparamhi,0,0,$40);
    inherited;
    end;
     
    // Voilà une reduction propre..
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Application.minimize;
    end;
     
    initialization
      {$I unit1.lrs}
     
    end.
    Il faudrait pour faire mieux, intercepter la reduction de la fenêtre via le sysmenu, ce que je n'ai pas reussi à faire ce soir... Si quelqu'un se tente de chercher...

    Bonne programmation

    Clandestino

Discussions similaires

  1. [Lazarus / Linux] Invoquer un programme depuis Lazarus
    Par sarapis dans le forum Lazarus
    Réponses: 2
    Dernier message: 05/03/2008, 19h11
  2. [Lazarus] Les bases de programmation
    Par twisterpcnet dans le forum Lazarus
    Réponses: 1
    Dernier message: 30/01/2007, 21h46
  3. [c#] Peut on iconiser un programme
    Par wayak3 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/01/2007, 09h18
  4. Réponses: 6
    Dernier message: 04/07/2006, 10h36
  5. [Lazarus] Transposition d'un programme Delphi 3
    Par alberth dans le forum Lazarus
    Réponses: 3
    Dernier message: 15/06/2006, 18h49

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