首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于使用SetWindowLong更改窗口过程引发的有关问题

2012-09-19 
关于使用SetWindowLong更改窗口过程引发的问题我使用SetWindowLong更改某个窗口的窗口过程,想要更改WM_PAI

关于使用SetWindowLong更改窗口过程引发的问题

我使用SetWindowLong更改某个窗口的窗口过程,想要更改WM_PAINT的处理,
代码大概如下:

fOldWndProc = SetWindowLong(wnd_param->hwnd, GWL_WNDPROC, (long)video_wnd_wndproc);

然后在新的窗口过程里

C/C++ code
LRESULT CALLBACK video_wnd_wndproc(HWND hWnd, UINT wMsg, WPARAM wParam,LPARAM lParam){    LRESULT ret = 0;    if (wMsg == WM_PAINT)    {    ...//在这里做一些WM_PAINT消息的处理    //ret = fOldWndProc(hWnd, wMsg, wParam, lParam); 如果加上这一句,则不会重复收到WM_PAINT    }    else if(fOldWndProc)    {        ret = fOldWndProc(hWnd, wMsg, wParam, lParam);    }    return ret;}



现在的问题就是,如果有WM_PAINT消息触发,就一直会重复收到该消息,
但是把ret = fOldWndProc(hWnd, wMsg, wParam, lParam);
加到WM_PAINT消息的处理分支里,问题就解决了,
但我的应用不允许加入这一句.

请问有知道是怎么回事及怎么解决吗?

谢谢!

[解决办法]
你自己看下msdn关于SetWindowLong的解释

Calling SetWindowLong with the GWL_WNDPROC index creates a subclass of the window class used to create the window. An application can subclass a system class, but should not subclass a window class created by another process. The SetWindowLong function creates the window subclass by changing the window procedure associated with a particular window class, causing the system to call the new window procedure instead of the previous one. An application must pass any messages not processed by the new window procedure to the previous window procedure by calling CallWindowProc. This allows the application to create a chain of window procedures. 
必须把未经新的窗口过程处理的消息传递回前一个窗口过程通过调用 CallWindowProc
像你代码里写的像是消息过滤
在你新的窗口过程里你也没做什么别的处理
不能换种思维来弄?
比方说,添加一个全局变量,标识是否处理窗口Paint消息

热点排行