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 :

Copie d'une partie masquée de l'écran


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Mars 2007
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 205
    Par défaut Copie d'une partie masquée de l'écran
    Bonjour,

    La question est compliquée à formuler clairement. Je vais essayer, mais cela risque d'être un peu long, excusez-moi pour cela.
    Premièrement, il y a sur l'écran une ou des fenètre(s) ouverte(s) d'application(s) quelconque(s) (par exemple Internet Exploreur et autres). Le contenu affiché dans cette (ou ces) fenêtre(s) change de temps en temps sans intervention de l'utilisateur (par exemple des messages ou des images qui se réactualisent périodiquement). Désignons cette (ou ces) première(s) fenêtre(s) par "Fenêtre(s) changeante(s)".
    Deuxièmement, l'utilisateur travaille avec une application (crée avec Delphi) qui ouvre sur l'écran une fenêtre désignée par "Fenêtre utilisateur".
    - Je sais comment faire une copie des pixels d'une région choisie de l'écran qui comprend en totalité, ou en partie, les "fenêtre(s) changeante(s)", la "fenêtre utilisateur" étant en dehors de cette région à copier. Cette copie (un bitmap) constitue la mémorisation de l'image des "fenêtre(s) chageante(s)" à l'instant où j'ai cliqué sur le bouton.
    - Par contre, si la "fenêtre utilisateur" masque partiellement ou totalement la partie de l'écran que l'on veut copier, la copie n'est pas correcte : elle ne copie pas les pixels des "fenêtre(s) chageante(s)" masqués par la "fenêtre utilisateur" et copie à la place les pixels correspondants de "fenêtre utilisateur".
    - Il y a moyen d'éviter ce défaut en procédant ainsi : avec des temporisations convenables, la "fenêtre utilisateur" est fermée et disparait de l'écran. Les "fenêtre(s) chageante(s)" réaparaissent alors entièrement et la copie est faite à ce moment là. Puis la "fenêtre utilisateur" est réouverte.
    Malheureusement cette opération est très désagréable pour l'utilisateur, surtout lorsque des copies sont faites successivement à intervalles faibles.
    Je souhaiterais savoir s'il y a un moyen de réaliser cette opération ( c'est à dire : une copie (ou des copies successives) de la partie voulue de l'écran comportant les "fenêtre(s) changeante(s)" qui est partiellement ou totalement masquée par la "fenêtre utilisateur", sans que la "fenêtre utilisateur" ne soit ocultée transitoirement).
    Merci par avance pour votre opinion sur la faisabilité et pour vos conseils.

  2. #2
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Par défaut
    Salut

    Tu pourrais par exemple mettre la fenetre qui t'interresse au premier plan, et tu simules l'appui des touches Alt+ImprimEcran. Tu remets tes applications dans l'ordre que tu veux. Avec Alt+ImprimEcran, tu met dans le presse papier l'image de la fenetre qui a le focus. Ensuite, tu traites cette image !

    Si je n'ai pas bien compris, dis le moi

    Bonne chance !

  3. #3
    Membre très actif
    Inscrit en
    Mars 2007
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 205
    Par défaut
    Salut mick605,

    merci de répondre, mais ce n'est pas exactement cela.
    Actuellement, l'application qui ouvre la "fenêtre utilisateur" fait une copie des pixels d'une région rectangulaire de l'écran (région rectangulaire définie à l'avance). Donc elle copie tout ce qu'il y a sur cette région, quelles que soient les fenêtres qui s'y trouvent, entièrement ou partiellement, ainsi que ce qu'il y a éventuellement en fond d'écran et qui est apparent entre les fenêtes, ceci en une seule image bitmap : c'est exactement ce qui est voulu et on ne souhaite pas autre chose.
    Ceci est réalisé par un seul click sur un bouton et on ne veut pas de manipulation supplémentaire (d'autant plus que, parfois et selon les cas, le programme lui-même doit déclancher des copies à intervalles réguliers sans intervention de l'utilisateur)
    Cela marche comme cela de façon satisfaisante, à la seule condition que la "fenêtre utilisateur" soit en dehors de la partie rectanglulaire de l'écran qui a été prédéfinie pour la copie à faire.
    Ainsi que j'ai essayé de l'expliquer dans mon message précédent, c'est la difficulté de faire la même chose lorsque la "fenêtre utilisateur" masque entièrement ou partiellement la région à copier. L'usage qui est fait de ce programme impose parfois cette situation de masquage total ou partiel et dans ce cas, on ne doit pas déplacer la "fenêtre utilisateur" de façon à ce qu'elle sorte de la région à copier (il serait trop long et compliqué d'expliquer pourquoi compte-tenu du contexte).
    J'ai également indiqué qu'une méthode existe déjà pour répondre à ce problème, mais que cette méthode a, en pratique, un gros défaut que j'ai indiqué.
    La motivation de la question que je pose est plus précisément décrite dans mon post précédent. Bien évidemment j'essayerai de mieux expliquer si ce n'est pas encore assez clair.

  4. #4
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut


    Bien que je n'aime pas trop le but de ce programme... je peux tout de même apporter mon grain de sel.

    A part cloner un fureteur dans un folder hide, et bien entendu de trouver un moyen via son handle, de lancer en parallèle les copies d'URL je ne vois pas grand chose d'autre de valable.

    @+

  5. #5
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Par défaut
    A ok, je viens de comprendre ...

    Donc, tu pourrais masquer ton application (mais ca a l'air de te gener)
    Ou déplacer automatiquement ton application en dehors du rectangle ...
    Ou rendre ta form invisible par endroits ...
    Mais ton programme est treeeeees bizarre ... Si tu nous explique pourquoi tu veux faire ca, on peut peut-être trouver un moyen different pour ton probleme ... C'est toi qui voit

    Bonne chance !

  6. #6
    Membre très actif
    Inscrit en
    Mars 2007
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 205
    Par défaut
    En fait, je n'ai pas grand espoir. Malgré tout, pour poser plus concrètement ma question, j'ai écris un programme très réduit et ultra-simple qui réalise la fonction essentielle en cause.
    Il faut mettre sur Form1 :
    - Button1 et Button2
    - Image1 (vide au départ)
    - Timer1.
    La région de l'écran prédéfinie pour être copiée est un carré 100x100 pixels, dans l'angle supérieur gauche de l'écran. (on voit dans le code comment on pourrait choisir une région différente).
    Lorsqu'on clique sur Button1, Form1 disparait un très court instant, défini par timer1.
    Les pixels de la région prédéfinie de l'écran sont copiés dans CopieBitMap, puis dans Image1 avec un grossissement ( taille doublée par exemple).
    Avant de cliquer sur Button1, on peut faire glisser Form1 vers le coin supérieur gauche de l'écran, de façon à masquer la région qui devra être copiée. On vérifie alors que la copie de l'écran se fait bien malgré ce masquage.
    Le procédé fonctionne donc, mais on observe un clignotement de Form1, puisqu'elle disparait une fraction de seconde avant de réapparaitre. Ce défaut est sans importance sur un petit programme de démonstration tel que celui là.
    Par contre ce défaut est très gènant pour le programme véritable compte-tenu des condidions réelles d'utilisation.
    Ma question est d'avoir votre opinion sur la faisabilité (ou non) d'une autre méthode (si elle existe) et qui n'obligerait pas à oculter Form1 pendant une fraction de seconde.
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,menus,
      StdCtrls, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Image1: TImage;
        Button2: TButton;
        Timer1: TTimer;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
      private
        { Déclarations privées}
      public
        { Déclarations publiques}
      end;
     
    var
      Form1: TForm1;
      CopieLeft, CopieTop, CopieWidth, CopieHeight:integer;
     
    implementation
     
    {$R *.DFM}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
         Form1.width:=500;
         Form1.height:=300;
         Form1.color:=clwhite;
         BorderStyle:=(bsToolWindow);
     
         Button1.caption:='Copier';
         Button1.left:=0;
         Button1.top:=0;
         Button1.width:=100;
         Button1.height:=30;
         Button1.visible:=true;
     
         Button2.caption:='Effacer';
         Button2.left:=110;
         Button2.top:=0;
         Button2.width:=100;
         Button2.height:=30;
         Button2.visible:=true;
     
         Image1.width:=200;
         Image1.height:=200;
         Image1.left:=150;
         Image1.top:=50;
         Image1.visible:=true;
         Image1.stretch:=true;
     
         timer1.interval:=100;
         timer1.enabled:=false;
     
         { Ceci défini la partie de l''écran qui sera copiée : }
         CopieLeft:=0;
         CopieTop:=0;
         CopieWidth:=100;
         CopieHeight:=100;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
         Form1.visible:=false;
         timer1.enabled:=true;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
         Form1.Image1.canvas.Brush.Color := clwhite;
         Form1.Image1.canvas.fillRect(Rect(0,0,CopieWidth,CopieHeight));
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
         CL,CT:integer;
         CopieBitMap:TBitMap;
    begin
         timer1.enabled:=false;
         CL:=CopieLeft-Form1.left-4;
         CT:=CopieTop-Form1.top-26;
         CopieBitMap:= TBitmap.Create;
         CopieBitMap.Width:=CopieWidth;
         CopieBitMap.Height:=CopieHeight;
         CopieBitMap.Canvas.CopyRect(rect(0,0,CopieWidth,CopieHeight),canvas,rect(CL,CT,CL+CopieWidth,CT+CopieHeight));
         Form1.Image1.Picture.Bitmap:=CopieBitMap;
         CopieBitMap.free;
         Form1.visible:=true;
    end;
     
    end.

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/10/2014, 10h23
  2. [XL-2007] problème de codage en vba ("copie d'une partie d'une cellule dans une cellule vide")
    Par skipeemed dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/10/2010, 17h01
  3. Réponses: 14
    Dernier message: 20/04/2010, 10h56
  4. Réponses: 2
    Dernier message: 10/03/2009, 12h45
  5. Copie d'une partie de colonne en fonction d'un critère
    Par Cadenwarr dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/02/2008, 00h01

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