利用类的非static成员函数作窗口的处理函数

转载 2007年09月23日 14:14:00

实现方法:   

        用类的一个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)
...{
    ......... 
}


 

什么是类的成员函数和非成员函数

类有成员变量和成员函数。而函数中,不是任何一个类的成员的函数,就是非成员函数。例如: class A{ public:     void f1(){}; // 这个就是成员函数。   ...
  • u013152895
  • u013152895
  • 2015年03月23日 13:10
  • 1613

static成员函数访问非static成员

在C++中类的static成员类似于作用于类的全局成员,可以在类未创建任何实例化时直接通过 类名::静态成员名 进行访问。static成员函数只能访问static成员,而不能访问非stati...
  • davie1love
  • davie1love
  • 2016年04月17日 17:04
  • 539

C++成员函数,非成员函数,友元函数,隐式类类型转换

博客的所有内容都是个人理解,难免有理解错误的地方,欢迎大家多多拍砖! 成员函数是指在类内部定义的函数,非成员函数是指在某个命名空间或者全局空间内的函数,友元函数是指某些虽然不是类成员却能够访问类的所...
  • zhangchunminggucas
  • zhangchunminggucas
  • 2012年05月17日 15:38
  • 5314

C++中的类成员函数

:将自己觉得类成员函数中需要注意的地方总结成以下几点: (1)编译器隐式的将类内定义的成员函数当作内联函数; (2)每个成员函数都有一个额外的、隐含的this指针,在调用成员函数时,参数this初...
  • zdplife
  • zdplife
  • 2016年03月20日 09:55
  • 293

类成员函数作为其他类的友元函数的实现(c++语言)

关于类成员函数作为友元函数的编写方法(1) 单文件编译#include using std::cout;class One; //Another中使用One的引用,故前向引用声明class Anoth...
  • dupei
  • dupei
  • 2009年08月12日 13:18
  • 1951

C++static类成员,static类成员函数

1.static类成员 在C++primer里面说过,static类成员不像普通的类数据成员,static类数据成员独立于一切类对象处在。static类数据成员是与类关联的,但不与该类定义的对象有任何...
  • u014453898
  • u014453898
  • 2017年03月20日 14:33
  • 1112

成员函数与非成员函数的区别

今天看书关于成员函数和非成员函数被搞得晕头转向的,在群里问了一下大神们才搞懂是什么意思,其实简单来说成员函数是在类中定义的函数,而非成员函数就是普通函数,就是不是在类中定义的函数,其中非成员函数比较典...
  • GS_MY
  • GS_MY
  • 2013年04月23日 15:28
  • 1071

static 修饰成员变量与成员函数

这是C++对static关键字的重用。主要指静态数据成员/成员函数。 表示属于一个类而不是属于此类的任何特定对象的变量和函数. 这是与普通成员函数的最 大区别, 也是其应用所在, 比如在对...
  • linux_wgl
  • linux_wgl
  • 2012年09月22日 00:03
  • 3253

C++static静态成员函数

静态成员函数   静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。   在静态成员函数的实现中不能直接引用类中说明的非静态...
  • pamchen
  • pamchen
  • 2013年03月04日 09:44
  • 22606

C++回顾之static成员、static成员函数及类对象大小计算

static静态数据成员,static静态成员函数,static静态常量数据成员,类大小的计算原则等...
  • ab198604
  • ab198604
  • 2014年02月08日 10:14
  • 2652
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用类的非static成员函数作窗口的处理函数
举报原因:
原因补充:

(最多只允许输入30个字)