Decalement de 3 pixel dans le HDC [Résolu]

Signaler
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
-
Bonjour !!! Pourquoi si je fait :

case WM_PAINT:

{

RECT rt;

PAINTSTRUCT ps;

HDC hdc = BeginPaint(GetParent(hwnd), &ps);

GetWindowRect( hwnd, &rt);

FillRect(hdc,&rt,crouge);

je me retrouve avec un carré rouge pile dans les coordonées du handle de la fentre tandis que si je fait

case WM_PAINT:


{


RECT rt;


HDC hdc = GetWindowDC(GetParent(hwnd));


GetWindowRect( hwnd, &rt);


FillRect(hdc,&rt,crouge);

Je retrouve avec un decalage de 3 pixels, a la rigueur je m'en fou je
peu le decaler mais est ce que sur un ordre ordi il sera encore de 3
pixels ???

En fait je ne peux pas utiliser Beginpaint en dehors du WM_paint donc sa me pose probleme dans la suite du prog !!
A voir également:

10 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Tu insiste vraiment pour prendre GetWindowDC alors que j'ai dit GetDC (ou alors tu n'as remis que ton code initial).

Sinon SM_CXBORDER sont effectivement des constantes qui servent à récupérer les valeurs dynamiques du système par l'intermédiare de GetSystemMetrics();
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Begin paint récupére un Dc pour dessiner dans la zone cliente de la fenêtre.
GetWindowDc récupère un DC de la fenêtre en entier (avec les bordures et la barre de titre) d'ou le décalage de pixel.

Quoi qu'il en soit pour quoi dans le traitement de WM_PAINT tu récupère le DC du parent de ta fenêtre ?

Si tu veux récupérer un DC en dehors de WM_PAINT, c'est GetDC. Mais le mieux c'est quand même de demùander de redessiner la fenêtre avec invalidateRect plutot que de dessiner n'importe quand.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Je recupere le dc de la fentre parente car je dessine en dehors de le
fentre fille et je ne peux pas me servir de wm_paint par exmple
dans c WM_CTLCOLORLISTBOX je redessine un truc sur la listbox et a
cette interuption je suis obligé de recuperer le dc par GetDc.

Pour la taille du titre c'est bon je les ai tous virés mais ya pas un
moyen de connaitre l epaisseur du cadre pour etre sur que ca marche d
un ordi sur lautre ???
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Je ne comprend pas trop. tu traite WM_CTLCOLORLISTBOX pour dessiner dans ta ListBox. Ce message est reçu par le parent de la ListBox donc le DC du parent du ListBox est le DC de la fenêtre qui reçoit le message c'est à dire le hWnd de la WndProc (ou DlgProc) que tu récupère par GetDC(hwnd) non ?

Si c'est pas ça, ourrait-tu expliquer ce que tu veux faire (quel genre d'interfcae tu veux et comment tu le fait), il y a peut-être plus simplet et plus propre (il n'est pas bon de dessiner ailleurs que dans sa zone cliente quqnd on nous le demande).
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Je traite WM_CTLCOLORLISTBOX comme ca g toute les information que je ve sur les listboxs presente sur le dialog.

En fait cette application est une dll ki applique un theme sur un autre
programme c'est l'autre programme qui crée le dialog moi je ne fait ke
sous classer le dialog complet grace a la dll, je fait ma sauce et je
lui renvoi la main !!!

Les bouttons sont carrement refait en ownerdraw mais j'ai franchement
la flemme de faire pareil pour les listbox et en faisant comme ca, ca
marche a part le decalage.

Effectivement avec
WM_CTLCOLORLISTBOX
g le bon DC mais je ne peux pas utliser beginpaint donc je me retrouve
avec un decalage de 3 pixel vers le haut et vers la gauche en dehors de
la listbox.
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Dans ton subclassing, tu as donc comme param de la DlgProc le handle de la boîte de dialogue (qui doit être le parent de la listbox mais il se peut qu'il y ai une ruse dans la façon que le programme crée ses contrôles).

Pour avoir les coordonnées de la listBox relativement à la zone cliente du Dialog( peut importe leur lient de parenté réel) :
HWND hListBox -> handle de la listbox (doit se trouver dans les param du WM_COLORLISTBOX)
HWND hDlg -> handle de la boîte de dialogue subclassée (doit se trouver en param de ta nouvelle DlgProc).

RECT rcListBox;
GetWindowRect(hListBox, &rcListBox);
MapWindowPoints(HWND_DESKTOP, hDlg, (LPPOINT)&rcListBox, 2);

en récupérant le DC de la zone cliente du dialogue :HDC hdc GetDC(hDlg);> rcListBox représente le rectangle de la ListBox dans ce DC (à toi de dessiner autour).

Ne pas oublier de faire un ReleaseDC().
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Rien a faire toujour le meme decalge de 3 pixel pareil pour la meme avec ton code



case WM_PRINT:

{



RECT rcListBox;

GetWindowRect(hwnd, &rcListBox);


MapWindowPoints(HWND_DESKTOP, hDlg, (LPPOINT)&rcListBox, 2);




RECT rt;

rt=tabpoint->rteff;




HDC hdc = GetWindowDC(GetParent(hwnd));




POINT lppt;

SetBrushOrgEx(hdc,3,3,&lppt);



FillRect(hdc,&rt,hbDialog);



La partie en vert amene le meme resultat ke la partie en
rose du coup je suis obligé de decaler ma brosse avec la commande en
rouge.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Je pense me servir de SM_CXBORDER, SM_CYBORDER ou de SM_CXEDGE,
SM_CYEDGE pour avoir la decalage mais ca ne me servirait a rien vu ke
ca voudrait dire ke sur n'importe quel ordinateur sur n importe kelle
reolution et n'importe quel systeme d exploitation la taille des
bordure serait la meme (vu que ce sont des constantes non ??) donc de
tout decaler de 3 pixels ce serait une bonne idées. Tu penses ke c bon
????
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Mince désolé j'avais pas repéré la bonne partie du code a changer, en
tout cas c'était simplement ca GetDC a la place de GetWindowDC, me
reste plus qu'a tout rechanger au endroit ou j'ai du gruger les 3
pixels je suis sur que c'est la meme histoire.

En tout cas merci parce que j aurait jamais pensé a ca ( je l'ai meme pas vu quand tu la mit dans ton post)
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Voici un résumé sur la différence :
- GetWindowDC : récupère un DC complet de la fenêtre avec bordures et barre de titres.
- GetDC : récupère un DC de la zone cliente (là où on dessine en temps normal et où sont placés les contrôles)