利用类的非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)
{
    ......... 
}


 

举报

相关文章推荐

直接获取类中(非static)成员函数地址的方法

类中的静态成员函数,和非

使非MFC窗口程序的窗口回调过程成为C++类的成员函数

使非MFC窗口程序的窗口回调过程成为C++类的成员函数 作者:luzhl 下载源代码     一直以来,编写非MFC下的窗口程序,都习惯把窗口过程及消息处理函数编写成全局函数。为...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

C++类中的静态成员函数--static

为了能方便访问静态数据成员,C++定义了一种特殊的成员函数来

C++类的const, static 和inline成员函数(变量)

在C++类的声明中包含多个函数或变量的声明或定义。这些函数和变量可以分为以下几类,这几类并不是完全没有交集的,常量成员函数可以是内联成员函数,内联成员函数也可以是常量成员函数: 普通成员函数和变量 ...

static 和 const的解释(用 const 限定类的成员函数)

static 和 const的解释(用 const 限定类的成员函数)   static 是c++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static...

C++[类设计]静态窗口过程调用非静态成员函数

//in MainProgram.cpp #include #include "CustomWnd.h" int WINAPI WinMain(HINSTANCE hInstance,HINSTA...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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