Yesky首页| 产品报价| 行情| 手机 | 数码 | 笔记本 | 台式机 | DIY硬件 | 外设 | 网络 | 数字家庭 | 评测 | 软件 | e时代 | 游戏 | 图片 | 壁纸 | 群乐 | 社区 | 博客 | 下载
您现在的位置: 天极网 > 开发频道 > 利用类的非static成员函数作窗口的处理函数
全文

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

2002-06-17 12:50 作者: myself 出处: 责任编辑:
  实现方法:

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

共1页。 1
网友关注
最新上市
编辑推荐
文章阅读排行
周排行
月排行
欢迎订阅天极网RSS聚合资讯:http://www.yesky.com/index.xml