La technique générale de permettre une instance de fenêtre pour être représentée par exemple que la classe est d'utiliser SetWindowLongPtr et GetWindowLongPtr pour associer votre pointeur d'instance de classe avec le handle de fenêtre. Voici quelques exemples de code pour vous aider à démarrer. Il ne peut pas compiler sans quelques modifications. C'est seulement destiné à être une référence.
Personnellement, j'ai arrêté de rouler mes propres classes de fenêtres il y a quelques années lorsque j'ai découvert la classe de modèles CWindow et CWindowImpl d'ATL. Ils prennent soin de faire tout ce codage banal pour vous permettre de se concentrer uniquement sur les méthodes d'écriture qui traitent les messages de fenêtre. Voir l'exemple de code que j'ai écrit here.
Espérons que cela aide.
class CYourWindowClass
{
private:
HWND m_hwnd;
public:
LRESULT WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE: return OnCreate(wParam, lParam);
case wM_PAINT: return OnPaint(wParam, lParam);
case WM_DESTROY:
{
SetWindowLongPtr(m_hwnd, GWLP_USERDATA, NULL);
m_hwnd = NULL;
return 0;
}
}
return DefWindowProc(m_hwnd, uMsg, wParam, lParam);
}
CYourWindowClass()
{
m_hwnd = NULL;
}
~CYourWindowClass()
{
ASSERT(m_hwnd == NULL && "You forgot to destroy your window!");
if (m_hwnd)
{
SetWindowLong(m_hwnd, GWLP_USERDATA, 0);
}
}
bool Create(...) // add whatever parameters you want
{
HWND hwnd = CreateWindow("Your Window Class Name", "Your Window title", dwStyle, x, y, width, height, NULL, hMenu, g_hInstance, (LPARAM)this);
if (hwnd == NULL)
return false;
ASSERT(m_hwnd == hwnd);
return true;
}
static LRESULT __stdcall StaticWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CYourWindowClass* pWindow = (CYourWindowClass*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
if (uMsg == WM_CREATE)
{
pWindow = ((CREATESTRUCT*)lParam)->lpCreateParams;
SetWindowLongPtr(hwnd, GWLP_USERDATA, (void*)pWindow);
m_hWnd = hwnd;
}
if (pWindow != NULL)
{
return pWindow->WndProc(uMsg, wParam, lParam);
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
};
};
Voir [ Meilleure méthode de stockage de ce pointeur pour une utilisation dans WndProc ] (http://stackoverflow.com/questions/117792/best-method-for-storing-this-pointer-for-use-in-wndproc). –
C'est pour cette raison que j'ai toujours souhaité que 'WndProc' ait un paramètre 'void * user_data'. Cela rendrait beaucoup plus facile la création d'un wrapper basé sur un objet. –
@Evan: oui, mais il aurait aussi fallu que quelqu'un * sane * soit responsable de la conception de l'API ... L'API Win32 aurait été une bête très différente si cela avait été le cas. – jalf