使用Setwindowlong子类化一个类,截取一些消息处理。但是由于将消息处理函数和设置函数都放在了同一个类中(消息处理函数比较好调用)出现了一下错误:
cannot convert from 'long (__stdcall CSkinCtrl::*)(struct HWND__ *,unsigned int,unsigned int,long)' to 'long'
        Conversion is a valid standard conversion, which can be performed implicitly or by use of static_cast, C-style cast or function-style cast
谁有办法解决这个难题吗??(我不想改变自己的程序结构,就是这两个函数还是做一个类的成员函数。)
十分急,谢谢大大们了。

解决方案 »

  1.   

    就是这两个函数还是做一个类的成员函数
    ==================================
    第一函数要和原窗口过程的回调函数一致,如果要做为类成员的话,一定要是static类型!
      

  2.   

    如果要做为类成员函数的话,一定要是static类型!
      

  3.   

    一个类的动态成员函数是不能强制转换为LONG型的,换句话说,回调函数(WindowProc)不能是一个类的动态成员函数,你可以用全局函数或者静态成员函数。
      

  4.   

    使用trunk技术,可以让类的成员函数作为回调函数
    google一下
      

  5.   

    回调函数一般都有一个指针类型的子定义上下文参数,通常在设置回调函数的时候,把类的实例指针传过去,在回调函数中利用这个指针类访问类成员。
    但是WindowProc没有这样的参数,只有一个HWND句柄,你可以利用全局变量把这个句柄与类的实例指针关联起来。
      

  6.   

    可是静态成员函数不是没有办法调用动态成员函数的吗,难道全部改成静态成员函数,这样和我的要求好像不一致了, 
    这个算是第二个问题了,回答了,可以加分
    ==========================================================================================
    这个好办啊,一种办法是可以用全局变量保存当前类对象的指针,然后能过指针来访问。更好的办法是将当前对象的指针和窗口关联,然后再静态函数中取出!方法如下:在动态类中,一般OnCreate中设置:
    SetWindowLong(hwnd, GWL_USERDATA, this);静态函数中获得
    CXXX *pXXX = reinterpret_cast<CXXX *>(GetWindowLong(hDlg, GWL_USERDATA));
    pXXX->ToDo (); //调用动态成员函数