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 :

Clipping sur Canvas d'un TCustomGrid


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Clipping sur Canvas d'un TCustomGrid
    Bonjour,

    Je suis en train de créer un composant dérivé de TCustomGrid. Comme je veux qu'il ait un aspect différent, je suis en train de dériver la méthode DrawCell.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        procedure DrawCell(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState); override;
    Par défaut, la méthode DrawCell limite le dessin à la case en cours. C'est a dire que, si on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TMyGrid.DrawCell(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState);
    begin
      Canvas.Brush.Color:=clBlue;
      Canvas.FillRect(Rect(0,0,500,500));
    end;
    ... et que l'on invalide seulement une cellule, seule celle ci sera bleue, alors que le code dessine sur tout le canvas. Si on récupere la valeur de Canvas.ClipRect, elle correspond a la cellule.

    Ma question est : Comment faire pour dessiner hors de la case concernée par le DrawCell ?

    Je pense qu'il faut modifier le ClipRect, mais je n'y parviens pas. Dans l'aide Delphi, il est marqué :
    Citation Envoyé par docwiki.embarcadero.com
    Note:ClipRect can be modified using the SelectClipRgn Win32 API.
    http://docwiki.embarcadero.com/Libra...anvas.ClipRect

    Malheureusement, ce code ne fonctionne pas non plus comme souhaité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      V:=CreateEllipticRgn(0,0,500,500);
      SelectClipRgn(Canvas.Handle,V);
      Canvas.Brush.Color:=clBlue;
      if (ACol=1) and (ARow=1) then Canvas.FillRect(Rect(0,0,500,500));
      DeleteObject(V);
    Avec ce code, en invalidant les cellules 1,1 et 3,3, on obtient :


    Avez vous des idées pour pouvoir dessiner sur les autres cellules ? Je sèche depuis plusieurs heures ...

    Merci d'avance
    Images attachées Images attachées  

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    ton dessin n'est pas associé à une cellule ? pourquoi ne surcharges-tu pas la méthode Paint ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    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

    Je ne surcharge pas Paint car je veux profiter des avantages de surcharger DrawCell, a savoir avoir les arguments ARect et AState déja "prêts".

    Il est vrai que dans cet exemple c'est inutile, mais c'est juste pour montrer que ca ne marche pas. Le soucis serait en fait de dessiner un rectangle de sélection plus grand qu'une case de la cellule. C'est pourquoi, dans la méthode DrawCell, je veux pouvoir dessiner ce rectangle, si gdSelected in AState

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par mick605 Voir le message
    Salut

    Je ne surcharge pas Paint car je veux profiter des avantages de surcharger DrawCell, a savoir avoir les arguments ARect et AState déja "prêts".

    Il est vrai que dans cet exemple c'est inutile, mais c'est juste pour montrer que ca ne marche pas. Le soucis serait en fait de dessiner un rectangle de sélection plus grand qu'une case de la cellule. C'est pourquoi, dans la méthode DrawCell, je veux pouvoir dessiner ce rectangle, si gdSelected in AState
    le problème c'est que la grille va se redessiner par portion et tu vas laisser des "traces" à l'écran en changeant de case.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 104
    Par défaut
    Penses que même si ton dessin est effectué, il y a le dessin des autres cellules qui doit effacer ton ellipse par leur propre dessin !
    Tu as la limitation par ClipRect qui doit ignorer ce qui déborde car de toute façon, il sera difficile de gérer la conservation de ce qui déborde dans le DrawCell des autres Cellules !

    Comment fais-tu pour "invalider" seulement certaines cellules ?

    Sinon, que renvoie SelectClipRgn, je dirais COMPLEXREGION dans le cas d'un succès !

    As-tu essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     SelectClipRgn(Canvas.Handle, nil); // doit renvoyer NULLREGION	
     SelectClipRgn(Canvas.Handle, V); // doit renvoyer COMPLEXREGION
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    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
    Merci pour vos réponses

    Citation Envoyé par Paul TOTH Voir le message
    le problème c'est que la grille va se redessiner par portion et tu vas laisser des "traces" à l'écran en changeant de case.
    Citation Envoyé par ShaiLeTroll Voir le message
    Penses que même si ton dessin est effectué, il y a le dessin des autres cellules qui doit effacer ton ellipse par leur propre dessin !
    C'est vrai qu'il faudra faire attention a ne pas perdre de dessin, ou a ne pas redessiner par dessus. Mais ca c'est bon, normalement je m'en débrouillerai.

    Citation Envoyé par ShaiLeTroll Voir le message
    Tu as la limitation par ClipRect qui doit ignorer ce qui déborde car de toute façon, il sera difficile de gérer la conservation de ce qui déborde dans le DrawCell des autres Cellules !
    Oui, c'est ce ClipRect que j'aimerais modifier ... Seulement je n'y parviens pas.

    Citation Envoyé par ShaiLeTroll Voir le message
    Comment fais-tu pour "invalider" seulement certaines cellules ?
    Apres le dessin entier de ma grille, je clique sur un bouton pour activer ma procedure, puis je change la sélection de ma grille. Ca invalide a la fois l'ancienne selection et la nouvelle. Dans un mémo sont listés toutes les cellules appelées par mon DrawCell.

    Citation Envoyé par ShaiLeTroll Voir le message
    Sinon, que renvoie SelectClipRgn, je dirais COMPLEXREGION dans le cas d'un succès !

    As-tu essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     SelectClipRgn(Canvas.Handle, nil); // doit renvoyer NULLREGION
     SelectClipRgn(Canvas.Handle, V); // doit renvoyer COMPLEXREGION
    Oui, il me renvoie bien COMPLEXREGION. J'ai déja testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     SelectClipRgn(Canvas.Handle, 0); // renvoie COMPLEXREGION	
     SelectClipRgn(Canvas.Handle, V); // renvoie COMPLEXREGION
    Mais avec ces 2 lignes, le résultat est le même. J'avoue que le résultat de la premiere ligne me dérange un peu, je m'attendais a un NULLREGION ...

    Sinon, j'ai aussi essayé de récupérer la région avec GetClipBox, qui me renvoie COMPLEXREGION quand les cellules invalidées sont éloignées, et SIMPLEREGION quand elles sont a coté. Ca, c'est OK.

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 104
    Par défaut
    Avec GetClipBox ou GetClipRgn, récupère la région déjà affectée, au lieu de récréer une région et de lui affecter, essaye de combiner celle déjà en cours avec les nouvelles zones avec CombineRgn avec le hrgnDest égale à hrgnSrc1 qui est la région déjà affectée.

    Tu ne devrais pas avoir besoin de refaire un SelectClipRgn puis le handle de hrgnSrc1 ne change pas, peut-être cela fonctionnera mieux !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/08/2006, 20h43
  2. clip sur un autre
    Par aleksandre dans le forum Flash
    Réponses: 14
    Dernier message: 17/06/2006, 14h02
  3. Réponses: 2
    Dernier message: 22/02/2006, 11h15
  4. Réponses: 2
    Dernier message: 02/02/2006, 09h07
  5. [FLASH MX] Clip sur bouton
    Par Destiny dans le forum Flash
    Réponses: 3
    Dernier message: 19/08/2005, 14h12

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