Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16497255
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:54:32

下载本文示例代码
  实现方法:   用类的一个static函数作真正的处理函数,在该函数中调用另一个非static的函数进行处理。   困难:   static函数不能直接调用非static的函数。   技巧:   在创建好窗口后立即利用SetWindowLong函数将类实例的指针传给窗口。   在static的处理函数中利用GetWindowLong函数取出该指针。   然后就可以通过该指针调用非static的处理函数了。   例子:   原因:static 修饰的函数相当于全局函数,因此在函数运行中this指针无效,也就是说该函数的运行没有针对某个具体的类实例,所以也就不能用某个类中的非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){    ......... }   实现方法:   用类的一个static函数作真正的处理函数,在该函数中调用另一个非static的函数进行处理。   困难:   static函数不能直接调用非static的函数。   技巧:   在创建好窗口后立即利用SetWindowLong函数将类实例的指针传给窗口。   在static的处理函数中利用GetWindowLong函数取出该指针。   然后就可以通过该指针调用非static的处理函数了。   例子:   原因:static 修饰的函数相当于全局函数,因此在函数运行中this指针无效,也就是说该函数的运行没有针对某个具体的类实例,所以也就不能用某个类中的非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){    ......... } 下载本文示例代码


利用类的非static成员函数作窗口的处理函数利用类的非static成员函数作窗口的处理函数利用类的非static成员函数作窗口的处理函数利用类的非static成员函数作窗口的处理函数利用类的非static成员函数作窗口的处理函数利用类的非static成员函数作窗口的处理函数利用类的非static成员函数作窗口的处理函数利用类的非static成员函数作窗口的处理函数利用类的非static成员函数作窗口的处理函数利用类的非static成员函数作窗口的处理函数利用类的非static成员函数作窗口的处理函数利用类的非static成员函数作窗口的处理函数利用类的非static成员函数作窗口的处理函数利用类的非static成员函数作窗口的处理函数利用类的非static成员函数作窗口的处理函数
阅读(155) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~