怎么像MFC程序一样,把窗口处理函数封装在类里面去呢?
有人会说用static函数,但static 函数不能直接调用非static的函数。
困难就在这点,以下讲讲方法:
技巧:
在创建好窗口后立即利用SetWindowLong函数将类实例的指针传给窗口。
在static的处理函数中利用GetWindowLong函数取出该指针。
然后就可以通过该指针调用非static的处理函数了。
例子:
原因:static 修饰的函数相当于全局函数,因此在函数运行中this指针无效,也就是说该函数的运行没有针对某个具体的类实例,所以也就不能用某个类中的非static 成员变量。
如果你是想用static修饰的函数(如WinProc)作为窗口的处理函数的话,有解决方法:
class CWnd
{
protect:
HWND h_Wnd;
public:
virtual HWND CreateSArea(LPCTSTR wndName,DWORD dwStyle,int x,int y,int w,int h,HWND hParent);
static LRESULT CALLBACK SAreaProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );
virtual void SProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );
};
HWND CWnd::CreateSArea(LPCTSTR wndName, DWORD dwStyle, int x, int y, int w,int h,HWND hParent)
{
WNDCLASS wc;
.....//初始化wc并将SArea::SAreaProc函数设为处理函数
::RegisterClass(&wc);
h_Wnd=::CreateWindow(..........);
if(h_Wnd)
::SetWindowLong(h_Wnd,GWL_USERDATA,(LONG)this);//将this指针传给窗口
return h_Wnd;
}
LRESULT CALLBACK CWnd::SAreaProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
CWnd* pArea=NULL;
if(message!=WM_NCCREATE && message !=WM_CREATE)qude//取得刚才传入的指针
pArea=(CWnd*)::GetWindowLong(hWnd,GWL_USERDATA);
if(pArea)//利用该指针调用你想用的某类实例的成员
pArea->SProc(hWnd,message,wParam,lParam);
return ::DefWindowProc(hWnd,message,wParam,lParam);
}
void CWnd::SProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
.........
}