对话框窗口过程的另外一种实现方法

蝎子

在之前的一篇关于对话框返回值的文章中,有人建议说可以使用另外一种不同的搞法:也即直接调用DefDlgProc这个API函数(就类似于窗口消息过程中调用默认的消息处理函数DefWindowProc一样,而不是直接返回TRUE或者FALSE。

那,让我们试试呗

实际上,我们准备试它两次。今天我会使用上述所说的方法,过几天,我还会演示另外一种完全不一样的做法。这两种做法中,都包含同一个的内部理念,而剩下的其他部分只是为了让这个理念能顺利跑起来的辅助结构而已。

这个所谓的第一种方法,实际上是使用了一种递归式调用手法,它尝试在对话框窗口过程中调用DefDlgProc,从而触发一种默认的消息处理流程。这种技巧需要设立一个标志,使用这个标志可以能够打破递归调用,从而退出无限循环。

因为通常你的对话框对象里已经有了一些数据成员了,所以,再添加一个数据成员应该不是什么大问题。

上面所说的内部理念是:打破递归循环调用链

DefDlgProc会调用对话框窗口过程来判断主程序的意图。当你想让Windows执行默认的消息处理时,你就会递归地调用DefDlgProc:在DefDlgProc这个函数的内部,它会回过头来,调用你的对话框窗口过程来判断你是否会希望覆盖默认的处理流程。

通过检测这个递归调用并返回FALSE,对DefDlgProc的递归调用就会执行默认处理并返回它的处理结果。

现在,你得到了默认消息处理的结果,你可以在返回之前修改它,然后调用链返回到外层的DefDlgProc,它会将这个值作为消息处理的最终处理结果。

如果有人喜欢看图的话,可以看看下面这个图:

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值