OVH Cloud OVH Cloud

DrawFrameControl

20 réponses
Avatar
Bonjour,

Auriez vous un exemple d'utilisation de cette fonction ? (j'utilise delphi)

msdn :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/pantdra
w_18ds.asp

mon essai :

var
tagPAINTSTRUCT : Record
hdc : THandle;
fErase : Boolean;
rcPaint : TRect;
fRestore : Boolean;
fIncUpdate : Boolean;
rgbReserved[32] : Byte;
End;
begin { Essai }

BeginPaint(Cnv.Handle, tagPAINTSTRUCT);
DrawFrameControl(Cnv.Handle, SaisieTrait1.ReadRect, DFC_BUTTON,
DFCS_BUTTON3STATE);
// HDC hdc, // handle to device context
// LPRECT lprc, // pointer to bounding rectangle
// UINT uType, // frame-control type
// UINT uState // frame-control state
EndPaint(Cnv.Handle, tagPAINTSTRUCT);

end;

10 réponses

1 2
Avatar
Christian ASTOR
@rennes wrote:

Auriez vous un exemple d'utilisation de cette fonction ? (j'utilise delphi)



http://groups.google.fr/groups?hl=fr&lr=&selm;27685F.8F778E83%40pegtop.de&rnum=5
Avatar
Merci, le cas d'utilisation est intéressant.
Cependant, je ne comprend pas le fonctionnement.
En effet, si je vois comment coder cette fonction, je suis
censé créer un frame, un bouton, un caption ou une scrollbox.
Je la crée sur le desktop mais ce n'est qu'un dessin. Ce n'est pas
persistent. Dès qu'on affiche quelquechose au dessus, ce dessin disparait.
Comment on l'utilise correctement (dans quel contexte) afin d'avoir de vrai
frame ou bouton, ... qui peuvent eux même contenir frame, bouton, ...


"Christian ASTOR" a écrit dans le message de
news: 41af72c1$0$19101$
@rennes wrote:

> Auriez vous un exemple d'utilisation de cette fonction ? (j'utilise


delphi)




http://groups.google.fr/groups?hl=fr&lr=&selm;27685F.8F778E83%40pegtop.de&
rnum=5
Avatar
BlueR
Bonjour

Un petit extrait de code en C++ sous Builder, pour dessiner une case à
cocher dans une StringGrid :

// taille de la checkbox
RECT RCell = static_cast<RECT>(Rect);
RCell.left += (RCell.right - RCell.left -
GetSystemMetrics(SM_CXMENUCHECK))/2; // pour centrer
RCell.right = RCell.left + GetSystemMetrics(SM_CXMENUCHECK);
RCell.top += 1 + (RCell.bottom - RCell.top -
GetSystemMetrics(SM_CYMENUCHECK))/2; // pour centrer
RCell.bottom = RCell.top + GetSystemMetrics(SM_CYMENUCHECK);
// dessin de la checkbox
DrawFrameControl(StringGrid->Canvas->Handle, &RCell, DFC_BUTTON,
DFCS_BUTTONCHECK | DFCS_CHECKED; // pour la
case à cocher

Cela donne les cases à cocher dans la colonne Rdv sur cet écran
http://rdvpro.free.fr/Demandes%20Parents.gif

--
BlueR
Avatar
Cet exemple ne résoud pas mon problème
qui reste le maintiens de l'affichage du composant
généré quand on redessine l'écran.

Merci cependant.


"BlueR" a écrit dans le message de news:

Bonjour

Un petit extrait de code en C++ sous Builder, pour dessiner une case à
cocher dans une StringGrid :

// taille de la checkbox
RECT RCell = static_cast<RECT>(Rect);
RCell.left += (RCell.right - RCell.left -
GetSystemMetrics(SM_CXMENUCHECK))/2; // pour centrer
RCell.right = RCell.left + GetSystemMetrics(SM_CXMENUCHECK);
RCell.top += 1 + (RCell.bottom - RCell.top -
GetSystemMetrics(SM_CYMENUCHECK))/2; // pour centrer
RCell.bottom = RCell.top + GetSystemMetrics(SM_CYMENUCHECK);
// dessin de la checkbox
DrawFrameControl(StringGrid->Canvas->Handle, &RCell, DFC_BUTTON,
DFCS_BUTTONCHECK | DFCS_CHECKED; // pour la
case à cocher

Cela donne les cases à cocher dans la colonne Rdv sur cet écran
http://rdvpro.free.fr/Demandes%20Parents.gif

--
BlueR


Avatar
Aurélien REGAT-BARREL
> Cet exemple ne résoud pas mon problème
qui reste le maintiens de l'affichage du composant
généré quand on redessine l'écran.



Ah... tu veux dessiner ça directement sur le desktop. Ben faut créer une
fenêtre pour être informé quand elle est effacée. Les menus que tu vois sous
XP (fais un clic droit sur le bureau) ou sur les tooltips balloon, y'a une
petite zone d'ombre sur le bord droit, ben c'est plusieurs fenêtres qui
dessinent juste un trait d'épaisseur 1 en semi-transparence! Donc fait
pareil, crée une fenêtre dont tu détermines la région visible en fonction de
ce que tu veux dessiner et dessines y dessus lors de WM_PAINT.

--
Aurélien REGAT-BARREL
Avatar
Christian ASTOR
@rennes wrote:
Merci, le cas d'utilisation est intéressant.
Cependant, je ne comprend pas le fonctionnement.
En effet, si je vois comment coder cette fonction, je suis
censé créer un frame, un bouton, un caption ou une scrollbox.
Je la crée sur le desktop mais ce n'est qu'un dessin. Ce n'est pas
persistent.



Comme tout dessin sous Windows, on dessine tjrs ds WM_PAINT (ou
WM_NCPAINT, WM_ERASEBKGND)
On l'utilise par ex pour dessiner des pseudo-boutons ds la caption.
Windows l'utilise entre autres pour dessiner des check boxes.
Avatar
Aurelien REGAT-BARREL
> Comme tout dessin sous Windows, on dessine tjrs ds WM_PAINT (ou
WM_NCPAINT, WM_ERASEBKGND)
On l'utilise par ex pour dessiner des pseudo-boutons ds la caption.
Windows l'utilise entre autres pour dessiner des check boxes.



Tiens, j'y pense. J'ai jamais essayé de subclasser le fenêtre du bureau...

--
Aurélien REGAT-BARREL
Avatar
Ben si je dessine sur la fenêtre, je dessine pas sur le bureau.
Ce qui pose pas mal de problème pour la mise en premier plan.
Je vais voir du coté des hooks si je peux pas raffraichir ma fenêtre.
Mais je pensais qu'il existait un évènement de bureau type WM_Paint
que l'on pouvait utiliser pour redessiner.


"Aurélien REGAT-BARREL" a écrit dans le
message de news: 41b080bb$0$1871$
> Cet exemple ne résoud pas mon problème
> qui reste le maintiens de l'affichage du composant
> généré quand on redessine l'écran.

Ah... tu veux dessiner ça directement sur le desktop. Ben faut créer une
fenêtre pour être informé quand elle est effacée. Les menus que tu vois


sous
XP (fais un clic droit sur le bureau) ou sur les tooltips balloon, y'a une
petite zone d'ombre sur le bord droit, ben c'est plusieurs fenêtres qui
dessinent juste un trait d'épaisseur 1 en semi-transparence! Donc fait
pareil, crée une fenêtre dont tu détermines la région visible en fonction


de
ce que tu veux dessiner et dessines y dessus lors de WM_PAINT.

--
Aurélien REGAT-BARREL





Avatar
Vous n'auriez pas un cas d'utilisation ?


"Aurelien REGAT-BARREL" a écrit dans le
message de news: 41b0f47d$0$26437$
> Comme tout dessin sous Windows, on dessine tjrs ds WM_PAINT (ou
> WM_NCPAINT, WM_ERASEBKGND)
> On l'utilise par ex pour dessiner des pseudo-boutons ds la caption.
> Windows l'utilise entre autres pour dessiner des check boxes.

Tiens, j'y pense. J'ai jamais essayé de subclasser le fenêtre du bureau...

--
Aurélien REGAT-BARREL




Avatar
Aurélien REGAT-BARREL
> Ben si je dessine sur la fenêtre, je dessine pas sur le bureau.



Quelque part, en dessinant sur une fenêtre (au fond transparent etc...) qui
est sur le bureau, on dessine sur le bureau.

Ce qui pose pas mal de problème pour la mise en premier plan.



Le bureau est en dernier plan non ? Le style TOPMOST sur la fenêtre devrait
corriger le problème.

Je vais voir du coté des hooks si je peux pas raffraichir ma fenêtre.
Mais je pensais qu'il existait un évènement de bureau type WM_Paint
que l'on pouvait utiliser pour redessiner.



Oui, évènement destiné au bureau. Tu ne le reçois pas au même titre que tu
ne reçois pas le WM_PAINT des autres fenêtres.

Que veux-tu faire ? Dessiner directement sur l'écran ou sur le bureau ?

--
Aurélien REGAT-BARREL
1 2