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

phantom_2005 Messages postés 184 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 1 septembre 2010 - 12 juil. 2006 à 10:11
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

10 réponses

mad_love_disease Messages postés 64 Date d'inscription lundi 20 octobre 2003 Statut Membre Dernière intervention 1 juillet 2010 3
13 juil. 2006 à 14:00
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
0
phantom_2005 Messages postés 184 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 1 septembre 2010 1
13 juil. 2006 à 14:37
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
0
phantom_2005 Messages postés 184 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 1 septembre 2010 1
13 juil. 2006 à 14:40
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
13 juil. 2006 à 15:04
HDC hdc = ::GetDC(GetDlgItem(IDD_PROPPAGE5)->m_hWnd);

_____________________________________
Un éditeur de ressources gratuit pour Windows
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mad_love_disease Messages postés 64 Date d'inscription lundi 20 octobre 2003 Statut Membre Dernière intervention 1 juillet 2010 3
13 juil. 2006 à 15:05
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
0
phantom_2005 Messages postés 184 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 1 septembre 2010 1
13 juil. 2006 à 15:22
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
0
mad_love_disease Messages postés 64 Date d'inscription lundi 20 octobre 2003 Statut Membre Dernière intervention 1 juillet 2010 3
14 juil. 2006 à 11:53
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
0
phantom_2005 Messages postés 184 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 1 septembre 2010 1
17 juil. 2006 à 08:37
Merci Nico,

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

Bonnes vacances et merci encore

@+
--------------------------------------------------------------------------------
Phantom_2005
0
cs_Omeya Messages postés 28 Date d'inscription dimanche 4 mai 2003 Statut Membre Dernière intervention 10 août 2006
22 juil. 2006 à 23:59
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.
0
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
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.
0
Rejoignez-nous