自己试图封装API函数时碰到的一个问题
我自己想封装Win32的API函数,碰到一个问题。
因为回调函数不能是一个类的成员函数,所以我们通常设置一个
static LRESULT CALLBACK stWinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
静态函数作为回调函数,同时在一开始调用函数CreateWindow时,将参数
LPVOID lpParam 设置为This 指针,这样静态回调函数可以在处理消息WM_NCCREATE中通过lParam参数获得这个This指针,然后再调用真正的处理函数WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)。
我用代码简单的表示一下:
BOOL CBaseWindow::Create(DWORD dwStyles, RECT* rect)
{
// Create the window
// send the this pointer as the window creation parameter
m_hwnd = CreateWindow(szClassName, szWindowTitle, dwStyles,
rect->left, rect->top, rect->right - rect->left,
rect->bottom - rect->top, NULL, NULL, hInstance,
(void *)this);
return (m_hwnd != NULL);
}
LRESULT CALLBACK CBaseWindow::stWinMsgHandler(HWND hwnd,
UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CBaseWindow* pWnd;
if (uMsg == WM_NCCREATE)
{
// 通过在lpCreateParams中提取CreateWindow中设置的this指针
SetWindowLong(hwnd, GWL_USERDATA,
(long)((LPCREATESTRUCT(lParam))->lpCreateParams));
}
// 获得窗口对象的指针
pWnd = GetObjectFromWindow(hwnd);
//如果获得了指针就调用真正的窗口处理函数
if (pWnd)
return pWnd->WinMsgHandler(hwnd, uMsg, wParam, lParam);
else
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
我现在的问题是,我要自己封装Dialog类,在实现非模态对话框是就碰到了问题,非模态对话框实际也是一个窗体,因为非模态对话框的创建使用CreateDialog,没有显式地调用CreateWindow,我就无法传递这个This指针,如何解决?