拈花小仙 发表于 2013-10-23 20:32:43

关于DefWindowProc的问题

在窗口消息回调函数 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);
}

仰望天上的光 发表于 2013-10-23 20:32:44

基本上DefWindowProc提供了对于各个消息的默认处理版本,所以我们处理消息分为3种情况:
1. 全部交给DefWindowProc处理。这种情况下你根本就不需要列出该消息
2. 全部自己处理,不要DefWindowProc处理。这种情况下,处理完就return 0;大多数的消息,我们都是这样处理的。
3. 自己做一些额外处理后再交给DefWindowProc处理。这种情况下,额外处理完,就break.

my_angel 发表于 2013-10-23 21:02:29

其实多个case后面return跟break+一个return其实在执行上是差不多的,break就多加跳转而已。。。而DefWindowProc是消息的默认处理函数,也就是说你觉得没有项重写的消息处理交给系统负责,如果写成return 0 则是这种情况下哪些消息不需要处理了,直接结束。。。{:5_104:}

拈花小仙 发表于 2013-10-23 21:07:17

my_angel 发表于 2013-10-23 21:02 static/image/common/back.gif
其实多个case后面return跟break+一个return其实在执行上是差不多的,break就多加跳转而已。。。而DefWindow ...

这些概念我也明白,大多数还算是差不多,不过也经常遇到些问题,想得到一些经验

苹果沃珂 发表于 2013-10-24 14:01:46

本帖最后由 苹果沃珂 于 2013-10-24 16:06 编辑

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


一般情况下,DefWindowProc()函数不处理 WM_DESTROY消息,所以就直接return返回了
页: [1]
查看完整版本: 关于DefWindowProc的问题