利用类的非static成员函数作窗口的处理函数
来源:互联网 发布:ff14敖龙族捏脸数据 编辑:程序博客网 时间:2024/05/22 02:11
实现方法:
用类的一个static函数作真正的处理函数,在该函数中调用另一个非static的函数进行处理。
困难:
static函数不能直接调用非static的函数。
原因:
static 修饰的函数相当于全局函数,因此在函数运行中this指针无效,也就是说该函数的运行没有针对某个具体的类实例,所以也就不能用某个类中的非static 成员变量。
技巧:
在创建好窗口后立即利用SetWindowLong函数将类实例的指针传给窗口。
在static的处理函数中利用GetWindowLong函数取出该指针。
然后就可以通过该指针调用非static的处理函数了。
例子:
如果你是想用static修饰的函数(如WinProc)作为窗口的处理函数的话,有解决方法:
class SArea
...{
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 SArea::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 SArea::SAreaProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
...{
SArea* pArea=NULL;
if(message!=WM_NCCREATE && message !=WM_CREATE)qude//取得刚才传入的指针
pArea=(SArea*)::GetWindowLong(hWnd,GWL_USERDATA);
if(pArea)//利用该指针调用你想用的某类实例的成员
pArea->SProc(hWnd,message,wParam,lParam);
return ::DefWindowProc(hWnd,message,wParam,lParam);
}
void SArea::SProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
...{
.........
}
...{
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 SArea::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 SArea::SAreaProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
...{
SArea* pArea=NULL;
if(message!=WM_NCCREATE && message !=WM_CREATE)qude//取得刚才传入的指针
pArea=(SArea*)::GetWindowLong(hWnd,GWL_USERDATA);
if(pArea)//利用该指针调用你想用的某类实例的成员
pArea->SProc(hWnd,message,wParam,lParam);
return ::DefWindowProc(hWnd,message,wParam,lParam);
}
void SArea::SProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
...{
.........
}
- 利用类的非static成员函数作窗口的处理函数
- 类的static函数实现非static成员函数作窗口过程函数
- 关于编译器对c++ 类静态成员、静态成员函数、非静态成员函数的处理
- static成员函数访问非static成员
- 类的static成员变量,static成员函数
- C++ 类的 静态成员 (static) 静态成员函数 Static
- 类的static成员函数和const成员函数
- 类的static成员函数和const成员函数
- 使非MFC窗口程序的窗口回调过程成为C++类的成员函数
- static关键字的作用以及静态成员函数与非静态成员函数的区别
- 类成员函数作线程的启动函数参数
- 类的static成员函数问题
- 什么是类的成员函数和非成员函数
- 指向类非static的数据成员和函数的指针用法
- static函数(非成员函数)与普通函数的区别
- 直接获取类中(非static)成员函数地址的方法
- static数据成员、成员函数的问题
- static数据成员、成员函数的问题
- C# 编码规范和编程好习惯
- 多线程中AfxGetApp()->m_pMainWnd和AfxGetMainWnd() 的区别?
- 一些sql 语句(行列转换等)
- GDI(一)
- Delphi下发送Email的方法
- 利用类的非static成员函数作窗口的处理函数
- GDI(二)
- how to use dialog
- jsp链接 mysql
- Janus Web/ASP.NET Server Controls v3(3.5.0.35) for VS2005
- A* 算法之误区
- 带参数的构造函数.cpp
- IT专业学生求职简历宝典(Leo谈谈写简历)
- 从《读库》关于“报人”文章感叹今日技术媒体