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

c – 为什么我的WndProc不能上课?,第1张

概述这似乎应该很简单.我有我的班: class Simple{public: LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { ... }}; 和我的WinMain: int WINAPI WinMain(HINSTANCE hInstance, H 这似乎应该很简单.我有我的班:
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 – 为什么我的WndProc不能上课?全部内容,希望文章能够帮你解决c – 为什么我的WndProc不能上课?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1248621.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存