#ifndef __swldlgs_h_
#define __swldlgs_h_
#include <windows.h>
// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
template <class TChild, WORD t_wDlgTemplateID>
class XDialogImpl
{
public:
enum { IDD = t_wDlgTemplateID };
XDialogImpl(HINSTANCE hInstance, HWND hWnd) :
_hInstance(hInstance)
,_hWnd(hWnd)
{};
///
/// Create modal dialog
///
INT_PTR doModal()
{
TChild* pTChild = static_cast<TChild*>(this);
//::DialogBoxParam to create modal dialog
return ::DialogBoxParam(_hInstance, MAKEINTRESOURCE(IDD), _hWnd,
(DLGPROC)startDialogProc, (LPARAM)pTChild);
return 0;
};
BOOL dialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
break;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK)
{
::EndDialog(hWnd, 0);
}
break;
case WM_NOTIFY:
break;
default:
return FALSE;
};
return FALSE;
};
static BOOL CALLBACK startDialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
//TChild* pTChild = reinterpret_cast<TChild*>(::GetWindowLong(hWnd, GWL_USERDATA));
TChild* pTChild = reinterpret_cast<TChild*>(::SendMessage(0, 0, 0, 0));///::GetWindowLong(hWnd, GWL_EXSTYLE));
return pTChild->dialogProc(hWnd, uMsg, wParam, lParam);
};
protected:
HINSTANCE _hInstance;
HWND _hWnd;
};
#endif //__swldlgs_h_
#ifndef __testdialog_h_
#define __testdialog_h_
#include "swldlgs.h"
#include "resource.h"
class XTestDialog : public XDialogImpl<XTestDialog, IDD_DIALOG1>
{
public:
typedef XDialogImpl<XTestDialog, IDD_DIALOG1> TBase;
XTestDialog(HINSTANCE hInstance, HWND hWnd) :
TBase(hInstance, hWnd)
{};
BOOL dialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
break;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK)
{
::EndDialog(hWnd, 0);
}
break;
case WM_NOTIFY:
break;
default:
return FALSE;
};
return FALSE;
};
};
#endif //__testdialog_h_
компилировал
msvc.net 2003
gcc version 3.2.3 (mingw special 20030504-1)
Это работает! Почему, я понять не могу.