首页 IP地址查询 | Alexa排名查询 | 手机归属地查询
设为首页 收藏本站
  • 网络编程网络编程
  • 软件编程软件编程
  • 数据库技术数据库技术
  • 编程学院
  • 业界资讯 业界资讯
  • 源码中心源码中心
  • 会员中心会员中心
  • 页面导航: 首页C++编程窗口&界面 → 利用类的非static成员函数作窗口的处理函数

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

    发布:myself 发布日期:2009-01-03 字体:[增加 减小] 类型:转载

    怎么像MFC程序一样,把窗口处理函数封装在类里面去呢?

    有人会说用static函数,但static 函数不能直接调用非static的函数。

    困难就在这点,以下讲讲方法:

      技巧:

      在创建好窗口后立即利用SetWindowLong函数将类实例的指针传给窗口。

      在static的处理函数中利用GetWindowLong函数取出该指针。

      然后就可以通过该指针调用非static的处理函数了。

      例子:

      原因:static 修饰的函数相当于全局函数,因此在函数运行中this指针无效,也就是说该函数的运行没有针对某个具体的类实例,所以也就不能用某个类中的非static 成员变量。

      如果你是想用static修饰的函数(如WinProc)作为窗口的处理函数的话,有解决方法:

    class CWnd

    {
    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 CWnd::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 CWnd::SAreaProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    CWnd* pArea=NULL;
    if(message!=WM_NCCREATE && message !=WM_CREATE)qude//取得刚才传入的指针
      pArea=(CWnd*)::GetWindowLong(hWnd,GWL_USERDATA);
    if(pArea)//利用该指针调用你想用的某类实例的成员
        pArea->SProc(hWnd,message,wParam,lParam);
    return ::DefWindowProc(hWnd,message,wParam,lParam);
    }

    void CWnd::SProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        .........
    }


    为配合网络严查,文章评论将关闭敬请谅解.
    同 类 文 章
    最 近 更 新
    热 点 排 行