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 :

Créer un contrôle non rectangulaire


Sujet :

Lazarus Pascal

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 71
    Points : 60
    Points
    60
    Par défaut Créer un contrôle non rectangulaire
    Bonjour,

    j'ai besoin de créer un contrôle qui ne soit pas de forme rectangulaire, surtout en ce qui concerne sa réaction à la souris. Dessiner une forme quelconque, avec transparence, sur un rectangle ne pose guère de problème, mais faire en sorte que la zone transparente le soit aussi à la souris est hors de ma portée.

    Je veux en fait créer un connecteur entre deux contrôles, comme celui qu'on trouve dans OpenOffice Draw et il ne doit réagir que lorsqu'on clique sur le trait et en dehors la réaction doit être faite par le contrôle qui se trouve en dessous.

    Est-il possible de définir une zone ou une région active ? J'ai vu CreatePolygonRgn mais je ne sais pas comment l'utiliser ni avec quel contrôle. Une autre approche serait de garder le rectangle transparent et de pouvoir transférer le clic à un autre contrôle, par exemple à l'aide du conteneur de ces contrôles.



    Comment procéderiez-vous ou utiliseriez-vous la définition de région ?

    Merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    je ne sais pas si cela peut vous aider :
    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
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
      LCLType, //HRGN
      LCLIntf; //CreatePolygonRgn
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormPaint(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
    function PointInPolygon(Point: TPoint; const Polygon: array of TPoint): Boolean;
    var
      rgn: HRGN;
    begin
      rgn    := CreatePolygonRgn(Polygon, Length(Polygon), WINDING);
      Result := PtInRegion(rgn, Point.X, Point.Y);
      DeleteObject(rgn);
    end;
     
    procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
       aPoint : Tpoint;
    begin
      aPoint.X := X;
      aPoint.Y := Y;
      if PointInPolygon(aPoint, [Point(10, 10), Point(30, 30), Point(50, 70),
                                 Point(70, 120), Point(60, 180)])
      then showmessage('In');
    end;
     
    procedure TForm1.FormPaint(Sender: TObject);
    begin
      with Canvas do begin
        Brush.Color := clOlive;
        Polygon([Point(10, 10), Point(30, 30), Point(50, 70),
                 Point(70, 120), Point(60, 180)]);
      end;
    end;
     
    end.
    Réf. :


    Citation Envoyé par FlorentA Voir le message
    [...] et il ne doit réagir que lorsqu'on clique sur le trait et en dehors la réaction doit être faite par le contrôle qui se trouve en dessous.
    ... "par le contrôle qui se trouve en dessous." Ce qui nécessite à mon avis de passer d'abord par la Form, parce que comment identifiez-vous à partir de votre contrôle-trait, l'"objet" qui est en dessous ? Seule la Form détient cette information. Non ?

    Bonne continuation. Cordialement. Gilles
    Réalisé avec Lazarus-1.1-42508-fpc-2.7.1-20130828-win64 - Non testé sous Nux
    Dernière modification par Invité ; 09/10/2013 à 15h10.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 71
    Points : 60
    Points
    60
    Par défaut
    Merci pour cet exemple, je vais l'essayer.

    Quant au passage à un autre composant, c'est bien ce genre d'idée : le form ou le composant parent (dans mon cas un TPanel), n'a-t-il pas un moyen de transmettre cette information à ses enfants ?

    Lorsqu'un évènement àlieu surun composant, est-ce que le composant est directement averti, ce qui oblige tous les composants à être à l'écoute, ou est-ce que c'est l'application qui reçoit et transmet en descendant dans ses branches aux conteneurs concernés ? Dans ce derniercas le mécanisme que j'évoque doit exister.

    Au minimum il me faudrait savoir comment envoyer un signal à un composant pour lancer un évènement dessus. En passant par le conteneur commun (mon TPanel), j'arriverai à simuler ce comportement. Mais comment envoyer ou créer un évènement ?

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/01/2006, 16h13
  2. Texture non rectangulaire
    Par GoldenEye dans le forum OpenGL
    Réponses: 9
    Dernier message: 06/10/2004, 16h54
  3. Réponses: 7
    Dernier message: 21/05/2004, 17h13
  4. [API Windows] Créer un contrôle image
    Par Zazeglu dans le forum Windows
    Réponses: 14
    Dernier message: 03/02/2004, 22h42
  5. Comment faire un panel non rectangulaire?
    Par grincheux dans le forum C++Builder
    Réponses: 4
    Dernier message: 11/05/2003, 15h47

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