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;
}