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 :

Problème de tracé avec la bibliothèque BGRABitMap


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut Problème de tracé avec la bibliothèque BGRABitMap
    Bonjour à toutes et à tous,

    Pour tracer un rectangle en pointillé qui se déforme avec le déplacement de la souris, j'utilise ce qui suit :

    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
    unit Unit1; 
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, LResources, Graphics, Dialogs, StdCtrls,
      ExtCtrls;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
        procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormCreate(Sender: TObject);
      private
        { private declarations }
        P0, P1: TPoint;
        PA, PB: TPoint;
      public
        { public declarations }
      end; 
     
    var
      Form1: TForm1; 
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      PA.X:= 0;
      PA.Y:= 0;
      PB.X:= 0;
      PB.Y:= 0;
    end;
     
    procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if ssLeft in Shift then
      begin
        Canvas.Pen.Style:= psDash;
        Canvas.Pen.Mode:= pmNotXor;
        P0.X:= X;
        P0.Y:= Y;
        P1.X:= X;
        P1.Y:= Y;
        if (PA.X = 0) and ( PA.Y = 0) and (PB.X = 0) and (PB.Y = 0) then
          Canvas.Rectangle(P0.X, P0.Y, P1.X, P1.Y)
        else {effacement du rectangle après le relevé de la souris}
          Canvas.Rectangle(PA.X, PA.Y, PB.X, PB.Y);
      end;
    end;
     
    procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if ssLeft in Shift then
      begin
        Canvas.Rectangle(P0.X, P0.Y, P1.X, P1.Y); {effaçage}
        P1.X:= X;
        P1.Y:= Y;
        Canvas.Rectangle(P0.X, P0.Y, P1.X, P1.Y); {Retraçage}
      end;
    end;
     
    procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      PA.X:= P0.X;
      PA.Y:= P0.Y;
      PB.X:= P1.X;
      PB.Y:= P1.Y;
    end;
     
    end.
    Je voudrais utiliser la bibliothèque BGRABitMap pour ses diverses possibilités et notamment le "Scanline".

    Pour autant, je n'arrive pas à faire ce que j'ai décrit ci-dessus car dans la bibliothèque BGRABitMap, "CanvasBGRA.Pen" ne possède pas la propriété "Mode" que je mets à "pmNotXor" qui me permet l'effacement du rectangle précédent au fur et à mesure que la souris se déplace.

    Comment faites-vous ?

    Merci de votre aide.

    Pierre

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 140
    Points : 623
    Points
    623
    Par défaut
    Je viens de trouver ce message avec google, il date un peu, mais je vais quand même y répondre.

    Ce n'est pas encouragé d'utiliser le Xor pour effacer/redessiner un rectangle de focus, parce que cela n'est pas très portable. Cela suppose un accès libre à la surface de dessin.

    Cependant, si votre code est sur une plateforme qui le permet, vous pouvez tout à fait effectuer ce dessin de rectangle temporaire en utilisant le Canvas comme vous faites d'habitude. Cela ne vous empêche pas d'autre part, quand vous effectuer vraiment le dessin, d'utiliser un objet TBGRABitmap. Vous ne pouvez pas dessiner directement sur le canvas d'une fenêtre avec CanvasBGRA, qui est le canvas d'une image.

    Si vous voulez utiliser BGRABitmap pour dessiner la sélection, il vous faut tout réafficher, en stockant par exemple le rendu sans la sélection dans une image, et lors de l'affichage, de la combiner avec la sélection.

    Le dessin en mode Xor est possible en utilisant la fonction Rectangle et en utilisant le mode dmXor. Dans ce cas, utiliser une valeur BGRA(a,b,c,0), c'est-à-dire avec alpha = 0 pour ne pas inverser le canal alpha.
    Par-delà nos conceptions du bien et du mal se trouve une prairie. Je te rencontrerai là-bas.

Discussions similaires

  1. [Lazarus] Anti-aliasing sur fond noir avec la bibliothèque BGRABitmap
    Par Roland Chastain dans le forum Lazarus
    Réponses: 10
    Dernier message: 05/07/2015, 11h02
  2. Réponses: 4
    Dernier message: 18/12/2007, 22h54
  3. Réponses: 12
    Dernier message: 27/11/2007, 16h03
  4. Problème de lien avec une bibliothèque statique
    Par streetpc dans le forum C++/CLI
    Réponses: 2
    Dernier message: 28/10/2006, 18h38
  5. Problème avec la bibliothèque glut
    Par lia dans le forum GLUT
    Réponses: 10
    Dernier message: 20/02/2006, 10h24

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