c – 为什么我的WndProc不能上课?

这似乎应该很简单.我有我的班:
class Simple
{
public:
    LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WParaM wParam,LParaM lParam)
    {
         ...
    }
};

和我的WinMain:

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR commandLine,int cmdshow)
{
    Simple *simple = new Simple();
    ...

    wndClass.lpfnWndProc = simple->WndProc;
    ...
 }

当我尝试,我得到:

error C2440: '=' :cannot convert from 'LRESULT (__stdcall Simple::* )(HWND,UINT,WParaM,LParaM)' to 'WNDPROC'

有没有什么理由我不能让我的WndProc在一个班级?好像这样真的很有用.

解决方法

C将成员函数和自由函数视为不同的 – 成员函数需要访问此指针,通常作为隐藏的第一个参数传入.因此,n参数成员函数将最接近于(n 1)-argument自由函数,这意味着试图调用您的WndProc的代码将传入错误的参数数.

但是,您可以将WndProc声明为静态成员函数,从而消除了此指针.这段代码应该有效:

class Simple
{
public:
    static LRESULT CALLBACK WndProc(HWND hwnd,LParaM lParam)
    {
         ...
    }
};

int WINAPI WinMain(HINSTANCE hInstance,int cmdshow)
{
    Simple *simple = new Simple();
    ...

    wndClass.lpfnWndProc = simple->WndProc;
    ...
 }

当然,这意味着你不能直接访问类的字段.您可以通过将类的指针嵌入为每个窗口实例保留的额外字节,也许通过使用SetWindowLongPtr解决这个问题.一旦你这样做,你可以通过编写这样的东西来恢复接收器对象指针:

class Simple
{
public:
    static LRESULT CALLBACK WndProc(HWND hwnd,LParaM lParam)
    {
         Simple* me = static_cast<Simple*>(getwindowlongPtr(hwnd,GWLP_USERDATA));
         if (me) return me->realWndProc(hwnd,msg,wParam,lParam);
         return DefWindowProc(hwnd,lParam);
    }
private:
    LRESULT CALLBACK realWndProc(HWND hwnd,LParaM lParam)
    {
         // Yay!  I'm a member function!
    }
};

希望这可以帮助!

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...