[MFC] Probleme de récupération de HDC

Messages postés
184
Date d'inscription
mercredi 8 décembre 2004
Statut
Membre
Dernière intervention
1 septembre 2010
- - Dernière réponse : cs_Omeya
Messages postés
28
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
10 août 2006
- 23 juil. 2006 à 00:03
Bonjour à tous

voila je cherche à afficher  un bitmap dans un Picture box (IDC_Cadre) situé sur une fenêtre de dialogue (IDD_PROPPAGE5)

Mes fonctions marchent très bien mais je ne sais pas comment faire pour récupérer le HDC (nécessaire pour l'affichage) de ma fenêtre

--> j'ai essayé avec  HDC hdc = ::GetDC(0);  pour le HDC de l'écran et ca marche très bien

Quelqu'un peut il voler à mon secours??

merci d'avance

--------------------------------------------------------------------------------
Phantom_2005
Afficher la suite 

10 réponses

Messages postés
64
Date d'inscription
lundi 20 octobre 2003
Statut
Membre
Dernière intervention
1 juillet 2010
2
0
Merci
Yo,

pour récuperer le hDC de ta pictureBox, tu doit passée son Handle en paramètre; le proto de la fonction étant:

HDC GetDC(

HWND hWnd // handle of window
);

Si tu récuperais le handle de l'écran avec getDC(0), c'est parceque windows considerais getDC(NULL), il renvoie la fenetre principale pour eviter des erreurs de mémoires.

Pour ce genre de questions, utilise WIN32 Programmer's Reference, qui contient TOUT les protos des fonctions contenu dans Windows.h, un gain de temps considérable.

Aller, bon courage et à +

Nico
Commenter la réponse de mad_love_disease
Messages postés
184
Date d'inscription
mercredi 8 décembre 2004
Statut
Membre
Dernière intervention
1 septembre 2010
1
0
Merci
Merci beaucoup,

cependant j'ai un autre probleme maintenant

Pour récupérer le handle de ma fenetre, je fais:

          CadreDest = GetDlgItem(IDD_PROPPAGE5);

Puis pour obtenir un DC de la fenêtre:


          HDC hdc = ::GetDC(CadreDest);

Mais j'obtiens l'erreur suivante:
          cannot convert from 'class CWnd *' to 'struct HWND__ *'
pour la premiere ligne de code

Comment puis je m'en sortir?

Merci d'avance 




 



--------------------------------------------------------------------------------
Phantom_2005
Commenter la réponse de phantom_2005
Messages postés
184
Date d'inscription
mercredi 8 décembre 2004
Statut
Membre
Dernière intervention
1 septembre 2010
1
0
Merci
De meme, si je cherche a recuperer le handle de ma Picture box en faisant:

                      CadreDest = GetDlgItem(IDD_PROPPAGE5,IDC_Cadre);

j'obtiens l'erreur:
                     error C2664: 'void __thiscall CWnd::GetDlgItem(int,struct HWND__ ** ) const' : cannot convert parameter 2 from 'const int' to 'struct HWND__ ** '

Peut etre que je m'y prend mal?
--------------------------------------------------------------------------------
Phantom_2005
Commenter la réponse de phantom_2005
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
HDC hdc = ::GetDC(GetDlgItem(IDD_PROPPAGE5)->m_hWnd);

_____________________________________
Un éditeur de ressources gratuit pour Windows
Commenter la réponse de vecchio56
Messages postés
64
Date d'inscription
lundi 20 octobre 2003
Statut
Membre
Dernière intervention
1 juillet 2010
2
0
Merci
re-salut,

même délire, voila le proto de la fonction:

HWND GetDlgItem(

HWND hDlg, // handle of dialog box
int nIDDlgItem // identifier of control
);
donc ca nous donne:

HWND CadreTest = GetDlgItem(HWND_Dlg,IDC_Cadre);

HWND_Dlg étant le handle de ta boite de dialogue (IDD_PROPPAGE5), que tu recupere avec le même procédé avec le Handle de ta fenetre principale si tu en as une, ou NULL. Ca donne HWND HWND_Dlg = getDlgItem(NULL,IDD_PROPPAGES);

Tes erreurs proviennent du fait que tu passe un IDC(int) en premier paramètre alors qu'il attends un HWND.

Voila les liens de WIN32 REFERENCE (2 part d'un .rar)

http://www.codingcrew.de/programmierung/win32hlpdownload.php?teil=1
http://www.codingcrew.de/programmierung/win32hlpdownload.php?teil=2

J'espere que cela va t'aider.

PS: CWnd est une structure propre aux classes crées pour visual C++, je te conseille d'utiliser les fonctions de windows.h directement (sous visual toujours), ce sera plus efficace je pense.

Nico
Commenter la réponse de mad_love_disease
Messages postés
184
Date d'inscription
mercredi 8 décembre 2004
Statut
Membre
Dernière intervention
1 septembre 2010
1
0
Merci
Voici mon appli:

******************************************************
void setting::MAJLogo(HBITMAP image)
{
 SIZE Taille, sizeDst;
 HBITMAP NewBmp;
 RECT rcSrc = {0, 0, 0, 0};

//-->methode de  mad_love_disease


// HWND HWND_Dlg = GetDlgItem(NULL,IDD_PROPPAGE5);
// HWND CadreTest = GetDlgItem(HWND_Dlg,IDC_Cadre);


 // HDC hdc = ::GetDC(CadreDest);

//-->méthode de vecchio56
// HDC hdc = ::GetDC(GetDlgItem(IDD_PROPPAGE5)->m_hWnd);


HDC hdc = ::GetDC(0);      // <-- DC de l'écran

/* //Effacement de l'image précédente
 HBITMAP BmpVide, Vide = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),"",IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION);
 sizeDst.cx = 375;
 sizeDst.cy = 150;
 BmpVide = RedimBmp(hdc,Vide,rcSrc,sizeDst);
 DrawBmp(hdc,704,642,BmpVide);
*/
 //Taille de l'image Logo
 Taille = GetBmpSize(image);


 //Taille de l'image résultante
 sizeDst = CalcDim(Taille,375,150);
 m_DimBMP.Format("%d x %d  --  %d x %d",Taille.cx,Taille.cy,sizeDst.cx,sizeDst.cy);


 //Redimensionnement de l'image
 NewBmp = RedimBmp(hdc,image,rcSrc,sizeDst);


 //Affichage de l'image aux coordonnées choisies
 DrawBmp(hdc,0,0,NewBmp);
}
***************************************************************************

Avec la méthode de vecchio56, plus d'erreur mais le programme plante complétement!
Avec la méthode de =182173 mad_love_disease, j'ai encore des erreurs de conversions de paramètres.

Je suis vraiment désolé de vous embeter, je sens que je suis pas loin mais je suis débutant et j'ai pas encore les automatismes!

Merci



--------------------------------------------------------------------------------
Phantom_2005
Commenter la réponse de phantom_2005
Messages postés
64
Date d'inscription
lundi 20 octobre 2003
Statut
Membre
Dernière intervention
1 juillet 2010
2
0
Merci
La méthode de Vechio56 devrait fonctionner normalement. La mienne ne fonctionne pas car getDlgItem doit etre remplacer par getDlgItemInt pour recuperer le handle de IDC_CADRE, enfin je pense. Je pars en vacances dans 2 heures, je n'ai plus trop le temps de t'aider dsl.

Cependant, test ça vite fait:
CWnd * test=GetDlgItem(IDD_PROPPAGE5);
if(!test)
{
//message d'erreur, le pointeur est null
exit;
}
else
{
HDC hdc = GetDC(test->m_hWnd,IDC_Cadre);
}

voila, utilise win32 reference pour voir le type des parmatres des fonctions et ca devrait aller.

A bientot;
Nico
Commenter la réponse de mad_love_disease
Messages postés
184
Date d'inscription
mercredi 8 décembre 2004
Statut
Membre
Dernière intervention
1 septembre 2010
1
0
Merci
Merci Nico,

c'est pas encore ça, mais je vais creuser!

Bonnes vacances et merci encore

@+
--------------------------------------------------------------------------------
Phantom_2005
Commenter la réponse de phantom_2005
Messages postés
28
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
10 août 2006
0
Merci
Tiens, pour t'aider :)

/////////////////////////////////////////
//Ce bout de code simple mais très lent, permet d'afficher un point blanc en position (1,1)
//du cadre IDC_PICTURE de la boîte de dialogue MAINBOX :
HDC dc = GetDC(GetDlgItem(MAINBOX, IDC_PICTURE));
SetPixel(dc, 1, 1, 0xFFFFFF);
ReleaseDC( GetDlgItem(MAINBOX, IDC_PICTURE), dc );
/////////////////////////////////////////

Tu devrais pouvoir l'adapter sans problème à ton programme.
Toutefois, et j'insiste là-dessus, il est vraiment très lent à l'exécution. C'est à cause de l'instruction SetPixel.
Je te conseillerai de te pencher sur l'instruction SetDIBitsToDevice, apparemment bien plus performante.
Commenter la réponse de cs_Omeya
Messages postés
28
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
10 août 2006
0
Merci
J'ai oublié de préciser que le point sera quasiment invisible si tu ne rafraichis pas l'affichage du cadre en permanence.
Une solution (mais ce n'est pas la meilleure) serait d'utiliser un thread qui afficherait le point blanc toutes les 10 millisecondes, par exemple.
Commenter la réponse de cs_Omeya