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

Composants VCL Delphi Discussion :

Composant graphic "transparent" aux événements sou


Sujet :

Composants VCL Delphi

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2004
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Composant graphic "transparent" aux événements sou
    Bonjour,

    Voici une explication plus détaillée:
    Est-il possible de créer un composant de type TGraphicControl, qui offre la possibilité de passer les événements souris (OnClick par exemple) au composant qui se trouve en dessous ? (Une sorte de transparence aux événements souris).
    Ceci sans devoir le faire manuellement en câblant chaque événement. Ce qui revient à dire, que mon composant ne répond pas aux événements souris, c'est le composant qui est dessous qui les reçoit.

    Le but de ce composant est le suivant, dessiner des flèches par dessus des TImage, lorsque que l'on click sur une de ces images, c'est cette image qui reçoit l'événement OnClick peut importe qu'une flèche soit dessinée ou non par dessus cette image.
    Le but de passer par un composant, est évident, car si je dessine des flèches "à la volée" celles ci sont effacées partiellement lors des manipulations sur les images, et il faut sans arrêts redessiner les flèches. En utilisant un composant, la méthode Paint redessine automatiquement ce qui est nécessaire.

    Voila, c'est pas très simple à expliquer !
    Si une esquisse de solution existe, je réponds aux questions pour de meilleures explications !

    A+

    Jean-Marc

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut et bienvenue sur DVP.com
    Tu peux faire un composant qui intecepte les évènements click et qui les envoie (PostMessage) à son Parent...
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  3. #3
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    comment réaliser un composant qui hérite de TGraphicControl et qui a une forme non rectangulaire ?

    si c'est ça ta question alors regardes comment tu doit faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TMonComposantFleche = Class(TGraphicControl)
    privates
      procedure CMHitTest(var Message: TCMHitTest); message CM_HITTEST;
    protected
      procedure HitTest(P:Point; var TestResult:Boolean); virtual;
    public
      ....
    end;
    Implementation des deux procedures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure CMHitTest(var Message: TCMHitTest); message CM_HITTEST;
    var
      Atouche:Boolean;
    begin
      HitTest(Point(Message.XPos, Message.YPos), Atouche);
      if Atouche then
        Message.Result := HTCLIENT // le point est dans la zone client
      else
        Message.Result := HTNOWHERE; // le point est ailleur
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure HitTest(P:Point; var TestResult:Boolean);
    begin
      // Tu testes si le Point P a touché ta fleche (s'il est dans la region)
      // si c'est bon tu met TestResult a True
      // sinon tu met TestResult a False
    end;
    le principe c'est d'intercepter le message CM_HITTEST (version borland du WM_NCHITTEST) et decider s'il doit etre pris en charge par ton composant ou pas; cette decision est justement prise par la procedure HitTest (qui est declarée virtuelle pour etre surchargée et pouvoir definir un squelette de composant)
    ==============================================
    "The WM_NCHITTEST message is sent to a window when the cursor moves, or when a mouse button is pressed or released" souce MSDN

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    Je cherche à faire exactement la même chose : rendre le composant transparent aux événements d'entrées (souris, clavier...).
    Faut-il obligatoirement rebalancer manuellement tout les événements au parent ? n'existe-t-il pas une propriété sur le composant qui permet de le rendre "transparent" aux événements d'entrées ? J'ai cherché sur le ComponentStyle mais sans succés, cela me permettait juste de désactiver le traitement sur les entrées, sans toutefois les renvoyer au parent.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    Personne n'a une idée ? :o
    merci d'avance.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    Je viens de réaliser que la réponse a déjà été donnée par chebreg.
    Mais je vais y apporter des informations complémentaires sur le type de résultat attendu par HitTest :

    HTERROR (-2)
    HTTRANSPARENT (-1)
    HTNOWHERE 0
    HTCLIENT 1
    HTCAPTION 2
    HTSYSMENU 3
    HTGROWBOX 4
    HTMENU 5
    HTHSCROLL 6
    HTVSCROLL 7
    HTMINBUTTON 8
    HTMAXBUTTON 9
    HTLEFT 10
    HTRIGHT 11
    HTTOP 12
    HTTOPLEFT 13
    HTTOPRIGHT 14
    HTBOTTOM 15
    HTBOTTOMLEFT 16
    HTBOTTOMRIGHT 17
    HTBORDER 18
    HTOBJECT 19
    HTCLOSE 20
    HTHELP 21

    Ainsi on peut définir quelle partie du composant a été touchée pour avoir le comportement attendu (déplacement, redimensionnement, fermeture...)

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/05/2007, 19h51
  2. Réponses: 7
    Dernier message: 25/01/2006, 13h33

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