begin process at 2008 08 29 20:10:35
1 233 870 membres
392 nouveaux aujourd'hui
14 294 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : ClipRect et Paint [ Mutimédia / Image & Vidéo ] (barbichette)

ClipRect et Paint le 04/07/2008 14:01:36

barbichette
Membre Club
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

Re : ClipRect et Paint le 04/07/2008 15:18:53

florenth
Membre Club
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

Re : ClipRect et Paint le 04/07/2008 15:27:49

barbichette
Membre Club
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...

Re : ClipRect et Paint le 04/07/2008 18:19:23

barbichette
Membre Club
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.

Re : ClipRect et Paint le 05/07/2008 09:24:42

florenth
Membre Club
Ouais, ben là, par contre, ça me dépasse
Désolé mais je ne sais rien d'autre... [ Lien ]

Re : ClipRect et Paint le 05/07/2008 20:15:22

f0xi
Membre Club
(Admin CS)

mmm pourquoi ne pas deriver TGraphicControl plutot que TCustomControl ?

c'est beaucoups mieux pour les control graphique.




Re : ClipRect et Paint le 05/07/2008 22:22:39

barbichette
Membre Club
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...


Re : ClipRect et Paint le 06/07/2008 12:06:47

florenth
Membre Club
"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.net [ Lien ]

Re : ClipRect et Paint le 07/07/2008 19:56:37

barbichette
Membre Club
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.


Re : ClipRect et Paint le 07/07/2008 21:36:45

florenth
Membre Club
Alors bonnes vacances !
Moi c'est dans 5 jours ! (autant prévenir)

A+


Classé sous : gros, paint, canvas, redessiner, cliprect

Participer à cet échange

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS