cs_barbichette
Messages postés220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 juillet 2013
-
4 juil. 2008 à 14:01
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 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...
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 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.
cs_barbichette
Messages postés220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 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...
cs_barbichette
Messages postés220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 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.
cs_barbichette
Messages postés220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 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...
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 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... ^^]
cs_barbichette
Messages postés220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 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.