OVH Cloud OVH Cloud

question sur validité du HDC

5 réponses
Avatar
Chevalley J.-C
Bonjour,
Une application de CAO commence par initialiser une variable globale HDC
my_hdc=GetDC( ). Ensuite, toutes les fonctions graphiques utilisent my_hdc
jusqu'à ce que l'application se ferme et fait un ReleaseDC(..)
Voici par exemple 2 routines de l'application:

void line(*x,*y)
{
cprintf("my_hdc=%i ,x=%i ,y=%i \n",my_hdc,*x,*y);
if (!LineTo( my_hdc,*x,*y)) MessageBox(NULL,"ERROR","",0);
}

void move(*x,*y)
{
cprintf("my_hdc=%i ,x=%i ,y=%i \n",my_hdc,*x,*y);
if (!MoveTo( my_hdc,*x,*y)) MessageBox(NULL,"ERROR","",0);
}

Je constate qu'il arrive parfois que l'API LineTo( ) retourne une erreur
("Descripteur non valide") alors que le sprintf me donne toujours les mêmes
valeurs pour my_hdc,*x,*y. Est-il possible que ce my_hdc soit tout à coup
plus valide? si oui, pourquoi?

Serais-ce mieux comme ça?

void line(*x,*y)
{
HDC hdc_temp=GetDC( my_whnd);
cprintf("my_hdc=%i ,x=%i ,y=%i \n",my_hdc,*x,*y);
if (!LineTo( my_hdc,*x,*y)) MessageBox(NULL,"ERROR","",0);
ReleaseDC(whnd,hdc_temp);
}

void move(*x,*y)
{
HDC hdc_temp=GetDC( my_whnd);
cprintf("my_hdc=%i ,x=%i ,y=%i \n",my_hdc,*x,*y);
if (!MoveTo( my_hdc,*x,*y)) MessageBox(NULL,"ERROR","",0);
ReleaseDC(whnd,hdc_temp);
}

Merci, Jean-Claude

5 réponses

Avatar
Vincent Burel
"Chevalley J.-C" wrote in message
news:4342a000$
Bonjour,
Une application de CAO commence par initialiser une variable globale HDC
my_hdc=GetDC( ). Ensuite, toutes les fonctions graphiques utilisent


my_hdc
jusqu'à ce que l'application se ferme et fait un ReleaseDC(..)



Normallement on obtient une DC quand on en a besoin , et on la relache dès
que les travaux d'affichages sont terminés... Je ne pense pas que HANDLE HDC
ait été prévu pour être global... De plus appeler un MessageBox entre un Get
/ ReleaseDC me semble pas recommandable non plus...

VB
Avatar
Remi THOMAS
"Vincent Burel" écrivit
"Chevalley J.-C" wrote in message
news:4342a000$
Bonjour,
Une application de CAO commence par initialiser une variable globale HDC
my_hdc=GetDC( ). Ensuite, toutes les fonctions graphiques utilisent


my_hdc
jusqu'à ce que l'application se ferme et fait un ReleaseDC(..)



Normallement on obtient une DC quand on en a besoin , et on la relache dès
que les travaux d'affichages sont terminés... Je ne pense pas que HANDLE
HDC
ait été prévu pour être global... De plus appeler un MessageBox entre un
Get
/ ReleaseDC me semble pas recommandable non plus...

VB





Salut,

Je précise que ce HDC est obtenu sur un message WM_PAINT.
Tout ton dessin doit être effectué dans ce WM_PAINT sinon tu aura des soucis
de rafraichissement.

Rémi

--
Rémi THOMAS
MVP Visual C++ .NET
http://www.pixel-technology.com/rthomas
Avatar
Chevalley J.-C
Merci pour vos réponses.. le problème est résolu. Le LineTo donne une
erreur car il est appelé par 2 threads différents au même moment. La valeur
du HDC est correcte mais le Lineto plante si de HDC est entrai dêtre utilisé
par qqch d'autre.
De ce fait, j'en déduis que même si ce n'est pas courrent, on peut se
permettre se stocker une variable globale HDC et l'utiliser jusqu'à la fin
du programme car en synchronisant mes 2 threads, j'ai plus de prblms...



"Remi THOMAS" a écrit dans le message de
news:4342b515$0$21307$
"Vincent Burel" écrivit
> "Chevalley J.-C" wrote in message
> news:4342a000$
>> Bonjour,
>> Une application de CAO commence par initialiser une variable globale


HDC
>> my_hdc=GetDC( ). Ensuite, toutes les fonctions graphiques utilisent
> my_hdc
>> jusqu'à ce que l'application se ferme et fait un ReleaseDC(..)
>
> Normallement on obtient une DC quand on en a besoin , et on la relache


dès
> que les travaux d'affichages sont terminés... Je ne pense pas que HANDLE
> HDC
> ait été prévu pour être global... De plus appeler un MessageBox entre un
> Get
> / ReleaseDC me semble pas recommandable non plus...
>
> VB
>
>

Salut,

Je précise que ce HDC est obtenu sur un message WM_PAINT.
Tout ton dessin doit être effectué dans ce WM_PAINT sinon tu aura des


soucis
de rafraichissement.

Rémi

--
Rémi THOMAS
MVP Visual C++ .NET
http://www.pixel-technology.com/rthomas




Avatar
Vincent Burel
"Chevalley J.-C" wrote in message
news:43438d42$
Merci pour vos réponses.. le problème est résolu. Le LineTo donne une
erreur car il est appelé par 2 threads différents au même moment. La


valeur
du HDC est correcte mais le Lineto plante si de HDC est entrai dêtre


utilisé
par qqch d'autre.
De ce fait, j'en déduis que même si ce n'est pas courrent, on peut se
permettre se stocker une variable globale HDC et l'utiliser jusqu'à la


fin
du programme car en synchronisant mes 2 threads, j'ai plus de prblms...



Enfin bon, c'est un bricolage inutile et peu re-commandable. Rendez vous
compte que vous synchronisez 2 thread pour palier à un mauvais usage des
DC...

à méditer...
VB
Avatar
Arnold McDonald
Vincent Burel wrote:

Je ne pense
pas que HANDLE HDC ait été prévu pour être global... De plus appeler
un MessageBox entre un Get / ReleaseDC me semble pas recommandable
non plus...



Je n'ai pas franchement regardé son code, mais il est possible d'avoir des
HDC globaux à des classes de fenêtres tout de même. Ne pas oublier le style
CS_CLASSDC lors d'un CreateWindow().

--
Arnold McDonald (AMcD®)

http://arnold.mcdonald.free.fr/