Comment utiliser les classes avec les boites de dialogue ?

cs_alain34270 Messages postés 85 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 18 septembre 2005 - 17 févr. 2004 à 14:15
cs_alain34270 Messages postés 85 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 18 septembre 2005 - 17 févr. 2004 à 20:25
Bonjour,

j'ai écrit une classe qui contient une boite de dialogue.

Je veux utiliser la fonction DialogBox pour afficher ma boite de dialogue, associée à une procédure de traitement des messages de cette boite qui est, en fait, une méthode de ma classe.
Or, le compilateur (vc++ 6) refuse la procédure, car il ne la reconnait pas comme ayant la forme attendue :
BoiteDialogue.cpp(61) : error C2440: 'type cast' : cannot convert from '' to 'int (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)'
None of the functions with this name in scope match the target type

Il faudrait que je la place à l'extérieur de la classe, mais à ce moment-là, il ne me sert plus à grand-chose d'écrire une classe pour gérer ma boite de dialogue.

Quelqu'un aurait-il une solution ?
merci d'avance.

alain

2 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
17 févr. 2004 à 19:18
la DlgProc doit être une fonction statique.

lors de la création de la boîte de dialogue, tu fait un DialogBoxParam et tu refile un pointeur sur ton objet contennant le dialogue comme dernier paramètre

au début de la dlgproc, tu associe ton pointeur à ton handle :
if(uMsg == WM_INITDIALOG)
SetWindowLong(hDlg, GWL_USERDATA, lParam);

puis pour les autres messages, tu le récupère et tu traite avec des méthodes de la classes :
// récupération objet TDlgAbout associé à la boîte de dialogue
TDlgAbout* pDlg = (TDlgAbout*) GetWindowLong(hDlg, GWL_USERDATA);
if(!pDlg)
return 0;

ex :DlgAbout.h

//************************************************
// Classe TDlgAbout.
//************************************************
class TDlgAbout
{
//==========================================
// Membres protégés.
//==========================================
protected :

// handle de la boîte de dialogue
HWND	m_hDlg;

//==========================================
// Membres publics.
//==========================================
public :
// constructeur, destructeur
TDlgAbout();
~TDlgAbout();

// création boîte de dialogue
int Create(HWND hWndParent);

//==========================================
// Procédures de traitement des messages.
//==========================================
protected :
static int CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

int MsgInitDialog(HWND, WPARAM, LPARAM);	// WM_INITDIALOG
int MsgCommand(WPARAM, LPARAM); // WM_COMMAND
};

#endif	// DLGABOUT_H_INCLUDED


DlgAbout.cpp :

//************************************************
// Constructeur.
//************************************************
TDlgAbout::TDlgAbout()
{
// initialisation des paramètres
m_hDlg = NULL;
}

//************************************************
// Destructeur.
//************************************************
TDlgAbout::~TDlgAbout()
{
}

//************************************************
// Create : ouverture de la boîte de dialogue "A propos de".
// entrée : hWndParent : fenêtre parente.
// retour : code de retour de la fonction DialogBoxParam.
//************************************************
int TDlgAbout::Create(HWND hWndParent)
{
// création de la boîte de dialogue
return DialogBoxParam(g_hAppInstance, MAKEINTRESOURCE(IDD_ABOUTBOX), hWndParent,
TDlgAbout::DlgProc, (LPARAM) this);
}

//==========================================
// Traitement des messages.
//==========================================

//************************************************
// DlgProc : procédure de traitement des messages de la boîte de dialogue.
// entrée : hDlg : handle de la boîte de dialogue.
//          uMsg : message à traiter.
//          wParam : premier paramètre du message.
//          lParam : second paramètre du message.
// retour : dépend du message à traiter.
//************************************************
int CALLBACK TDlgAbout::DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
// affecter l'objet TDlgAbout lors de la création de la boîte de dialogue, 
// contenu dans lParam
if(uMsg == WM_INITDIALOG)
    SetWindowLong(hDlg, GWL_USERDATA, lParam);

// récupération objet TDlgAbout associé à la boîte de dialogue
TDlgAbout* pDlg = (TDlgAbout*) GetWindowLong(hDlg, GWL_USERDATA);
if(!pDlg)
return 0;

// en fonction du message
switch(uMsg)
{
case WM_INITDIALOG	: return pDlg->MsgInitDialog	(hDlg, wParam, lParam);
case WM_COMMAND		: return pDlg->MsgCommand		(wParam, lParam);
default : return 0;
}
}

//************************************************
// MsgInitDialog : traitement du message WM_INITDIALOG. Initialisation de la boîte de
//                 dialogue.
// entrée : hDlg   : handle de la boîte de dialogue.
//          wParam : premier paramètre du message.
//          lParam : second paramètre du message.
// retour : vrai.
//************************************************
int TDlgAbout::MsgInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam)
{
// sauvegarde handlem_hDlg = hDlg;

// retour
return TRUE;
}

//************************************************
// MsgCommand : traitement du message WM_COMMAND. Action sur un des contrôles de la
//              boîte de dialogue.
// entrée : wParam : premier paramètre du message.
//          lParam : second paramètre du message.
// retour : vrai si la commane a été traitée, faux sinon..
//************************************************
int TDlgAbout::MsgCommand(WPARAM wParam, LPARAM lParam)
{
// récupération des paramètres
int nIDCtl = LOWORD(wParam);

// en fonction de l'Id du contrôle
switch(nIDCtl)
{
case IDOK 	: EndDialog(m_hDlg, IDOK); break;
case IDCANCEL : EndDialog(m_hDlg, IDCANCEL); break;
default : return FALSE;
}

// la commande a été traitée
return TRUE;
}
0
cs_alain34270 Messages postés 85 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 18 septembre 2005
17 févr. 2004 à 20:25
Merci beaucoup pour ta réponse aussi complète !

a+
alain
0
Rejoignez-nous