鱼C论坛

 找回密码
 立即注册
查看: 3320|回复: 4

关于DefWindowProc的问题

[复制链接]
发表于 2013-10-23 20:32:43 | 显示全部楼层 |阅读模式
20鱼币
在窗口消息回调函数 WndProc中,有时return 0;跳过DefWindowProc,有时break;不跳过默认处理,乱用大多没事,可有时会产生些微妙的变化,有人说(客户区以内用return 0;,客户区以外消息用break;)请问什么时候用return 0,使默认参数不被执行,什么时候用break使默认参数被执行,这其中有什么小经验吗?

LRESULT CALLBACK WndProc(HWND hWnd,
                         UINT nMsg,
                         WPARAM wParam,
                         LPARAM lParam)
{
    switch(nMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;        // 有时return 0;跳过DefWindowProc函数,有时break;使DefWindowProc函数能执行默认处理
    }
    return DefWindowProc(hWnd,nMsg,wParam,lParam);
}

最佳答案

查看完整内容

基本上DefWindowProc提供了对于各个消息的默认处理版本,所以我们处理消息分为3种情况: 1. 全部交给DefWindowProc处理。这种情况下你根本就不需要列出该消息 2. 全部自己处理,不要DefWindowProc处理。这种情况下,处理完就return 0;大多数的消息,我们都是这样处理的。 3. 自己做一些额外处理后再交给DefWindowProc处理。这种情况下,额外处理完,就break.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-23 20:32:44 | 显示全部楼层
基本上DefWindowProc提供了对于各个消息的默认处理版本,所以我们处理消息分为3种情况:
1. 全部交给DefWindowProc处理。这种情况下你根本就不需要列出该消息
2. 全部自己处理,不要DefWindowProc处理。这种情况下,处理完就return 0;大多数的消息,我们都是这样处理的。
3. 自己做一些额外处理后再交给DefWindowProc处理。这种情况下,额外处理完,就break.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-23 21:02:29 | 显示全部楼层
其实多个case后面return跟break+一个return其实在执行上是差不多的,break就多加跳转而已。。。而DefWindowProc是消息的默认处理函数,也就是说你觉得没有项重写的消息处理交给系统负责,如果写成return 0 则是这种情况下哪些消息不需要处理了,直接结束。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-23 21:07:17 | 显示全部楼层

这些概念我也明白,大多数还算是差不多,不过也经常遇到些问题,想得到一些经验
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-24 14:01:46 | 显示全部楼层
本帖最后由 苹果沃珂 于 2013-10-24 16:06 编辑

什么时候使用return或break,主要就看你的代码是否还需要执行return/break语句后的代码。
如果需要,就使用break;
如果不需要,就使用return;


一般情况下,DefWindowProc()函数不处理 WM_DESTROY消息,所以就直接return返回了

评分

参与人数 1鱼币 +5 收起 理由
拈花小仙 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 17:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表