begin process at 2012 05 28 19:44:33
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

API

 > 

Decalement de 3 pixel dans le HDC


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Decalement de 3 pixel dans le HDC

jeudi 27 janvier 2005 à 14:30:47 | Decalement de 3 pixel dans le HDC

SnOOpss

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 !!

jeudi 27 janvier 2005 à 16:27:17 | Re : Decalement de 3 pixel dans le HDC

ymca2003

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.
jeudi 27 janvier 2005 à 19:08:36 | Re : Decalement de 3 pixel dans le HDC

SnOOpss

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 ???

vendredi 28 janvier 2005 à 09:00:59 | Re : Decalement de 3 pixel dans le HDC

ymca2003

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).
vendredi 28 janvier 2005 à 09:50:33 | Re : Decalement de 3 pixel dans le HDC

SnOOpss

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.
vendredi 28 janvier 2005 à 10:18:39 | Re : Decalement de 3 pixel dans le HDC

ymca2003

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().

vendredi 28 janvier 2005 à 14:04:28 | Re : Decalement de 3 pixel dans le HDC

SnOOpss

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.
vendredi 28 janvier 2005 à 14:11:08 | Re : Decalement de 3 pixel dans le HDC

SnOOpss

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 ????
vendredi 28 janvier 2005 à 14:24:03 | Re : Decalement de 3 pixel dans le HDC

ymca2003

Réponse acceptée !
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();
vendredi 28 janvier 2005 à 14:34:42 | Re : Decalement de 3 pixel dans le HDC

SnOOpss

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)

1 2

Cette discussion est classée dans : wm, hwnd, hdc, paint, rt


Répondre à ce message

Sujets en rapport avec ce message

Screenmate defectueux [ par anthraxx ] Anthrax ignisque -- Le charbon et le feu J'essaye de faire un screenmate (une petite bestiole se promenant sur les fenetres), mais n'etant pas tres ex win app et les variable [ par ultima666 ] Dsl de refaire un sujet dessus mais personne ne répond a l'autre.case WM_PAINT:{// Debut de WM_PAINTint i = 2;hDc = BeginPaint(hWnd, &ps);GetClientRec Effacer les graphiques avec InvalidateRect !? [ par Suisse00 ] Dans plusieurs source je voie qu'il utilise InvalidateRect  pour "effacer". Mais dans mon cas sa fait en sorte que je recois toujours WM_PAINT (et don Affichage bitmap [ par gregory6 ] GringoBonjour, je suis débutant ss visual C++ et j'aurai besoin d'un peu d'aide. Je crée un projet MFC ds lequel je crée une fenetre. Cette fenetre cr un probleme de calcul de courbe [ par Cyr62110 ] Voila mon probleme, je creer un programme dessinant des courbes (fonction,point par point).Mais j'ai un probleme, lors ce que je teste et je rentre le Re : WM_KEYDOWN interception touche clavier [ par gregory6 ] GringoBonjour, Je débute sous visual C++ et j'ai un petit problème sur les interceptions de touches au clavier. J'aimerai récupérer les touches du cla WM_PAINT [ par Ensias ] Salut tous le monde , je voudrais savoir si le message WM_PAINT est envoyé indifiniment à la fenetre, ou bien suite à des evenements precis si c'est l Prob gestion des touches Win32 Unicode [ par raton ] Salut a tous.Voila je suis en train de dev une app pour un scanner (genre ce qu'utilise les caissieres mais avec des touches dessus) et j'ai un petit Problème d'enregistrement avant de quitter [ par julien_boss ] Un problème assez chiant il faut dire. Voilà, je vous explique :le client quitter sur la pitite croix rouge, direction message WM_CLOSE :        case Contrôle windows sur surface DirectDraw [ par rom2n ] Bonjours a tous, je suis en train de développer un jeu en 2D avec DirectDraw et je voulais savoir comment on pouvais affiché un contrôle windows sur u


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,608 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales