ClipRect et Paint

cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013 - 4 juil. 2008 à 14:01
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 - 7 juil. 2008 à 21:36
j'ai un gros souci...
j'ai une class dérivé de TCustomControl.
Evidemment, j'utilise la procedure Paint pour redessiner mon control, mais voilà, ça marche pas...

En gros, quand il y a besoin de redessiner, il y a bien un appel à Paint, mais :
1 - la propriété cliprect de mon canvas contient toujours ClientRect. mais pas seulement la zone à redessiner.
2 - dans ma procédure, j'appelle une fonction d'un autre objet, avec un BitBlt. Et là il copie tout, sauf la zone qui est sencé être redessinée... Comme si il inversait les deux zones (celle à redessiner et celle à excule).

Je suis désolé, mais il ne sert à rien de donner le bout de code, mais en gros :
quand je fait
procedure gnagnagna.paint;
var
r:trect;
begin
r:=canvas.cliprect; //<- ici, r=BoundsRect;
canvas.rectangle(r);
end;

Quelqu'un aurait-il une solution, une explication, ou quelqu'un a-t'il déjà eu le cas...

Merci

9 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
4 juil. 2008 à 15:18
Salut !

Pour ta question "2" je ne vois absolument pas d'où ça peut venir mais ce problème ne m'est jamais arrivé. Mais pourrait-on voir plus ? comme par exemple le code appelant BitBlt ?

Pour la "1", c'est tout à fait normal. Tant que tu n'appelles pas InvalidateRect() en spécifiant un nouveau rectangle, tu aura sle rectangle englobant ton contrôle.

A+
Flo
0
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
4 juil. 2008 à 15:27
alors, pour la 2 :
 BitBlt(FParentDc,FDecalDraw.x,FDecalDraw.y, FBitmap.Width, FBitmap.Height,
        FBitmap.Canvas.Handle,0,0,SRCCOPY);

FParentDc étant justement de HDC du contrôle qui reçoit me pose problème dans la procédure Paint.

Quand à Paint, il me semble (et je l'ai vérifier dans un programme vierge) qu'il peut recevoir des rectangles plus petits quand par exemple, une autre fenêtre, qui cachait mon contrôle, vient à disparaitre ou  se déplace.
Dans ce cas, windows envoie à mon application et ensuite à mon contrôle juste le rectangle à redessiner.
D'ailleurs, dans ce cas, si je demande à faire :
canvas.brush.color:=random(99999);
canvas.rectangle(clientrect);
j'ai bien seulement la zone à redessiner qui se redessine. Donc la région à redessiner est ok, mais pas canvas.cliprect...

Bizarre non...
0
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
4 juil. 2008 à 18:19
rebonjour,
en fait, j'ai trouvé une partie du problème :
le handle du canvas de l'objet TCustomObject n'est pas le même que le canvas renvoyé par getdc(TCustomObject.handle).
Je cherche donc comment faire correspondre les deux.
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
5 juil. 2008 à 09:24
Ouais, ben là, par contre, ça me dépasse
Désolé mais je ne sais rien d'autre...http://www.mx-dev.net
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
5 juil. 2008 à 20:15
mmm pourquoi ne pas deriver TGraphicControl plutot que TCustomControl ?

c'est beaucoups mieux pour les control graphique.

0
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
5 juil. 2008 à 22:22
ben en fait, il faut que mon contrôle intercepte les évènements claviers, le focus, les scrollbars...
Il ne me semble pas que les TGraphicControl le font.

Par contre, j'ai toujours pas trouvé pourquoi GetDc(TCustomControl) ne donne pas la même chose que TCustomControl.canvas.handle.
Je ne connais pas trop le fonctionnement des contrôles de delphi,...
Donc, en fait, quand j'essaie de dessiner dans le canvas via getdc, et ben en fait, je dessine dans un canvas qui est identique à canvas.handle, mais c'est pas le même... Donc, il marche pas pareil, et entre autre pour le ClipRect, qui reste toujours à Clientrect via getdc et getcliprect, mais qui correspond bien à la zone à redessiner dans canvas.cliprect...
Vraiment, je suis perdu.. Pourquoi 2 handle pour un même composant...
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
6 juil. 2008 à 12:06
"pourquoi ne pas deriver TGraphicControl plutot que TCustomControl ?

c'est beaucoups mieux pour les control graphique"

=> Sans relancer le débat ici inutilement, je n'ai que des problèmes avec les TGraphicControl. Certes ils sont biens pour coder des boutons, etc.. mais dès qu'il faut faire mieux c'est TCustomControl qu'il faut privilégier.
Certes ils consomment plus de mémoire et de ressources, mais au moins ce sont de vrais contrôles Windows et non pas une pseudo-implémentation faite par les dev de Borland.
[et puis t'a le doublebuffer natif au moins... ^^]

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
0
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
7 juil. 2008 à 19:56
Tu fais bien de soulever ce point sur le doublebuffer. C'est peut-être de là que résite l'astuce entre canvas.handle et getdc.
Je pense que getdc donne le handle direct à l'écran alors que canvas.handle va donner le handle du bitmap pour le doublebuffer...

Je part en vacances mais dès mon retour, je me replonge dedans.
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
7 juil. 2008 à 21:36
Alors bonnes vacances !
Moi c'est dans 5 jours ! (autant prévenir)

A+
0
Rejoignez-nous