翻译《The Old New Thing》- ven if you have code to handle a message, you’re allowed to ...

Even if you have code to handle a message, you're allowed to call DefWindowProc, because you were doing that anyway after all - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20090105-00/?p=19603

Raymond Chen 2009年01月05日


即使你有处理消息的代码,你仍然可以调用 DefWindowProc,因为你本来就在这么做

        仅仅因为你写了 case WM_SOMETHING:,并不意味着你必须处理 WM_SOMETHING 消息的所有可能参数。你仍然可以调用 DefWindowProc 函数。毕竟,当你没有 case WM_SOMETHING: 语句的时候,你本来就这么做。

switch (uMsg) {
case WM_CHAR:
    OnChar(…);
    return 0;
default:
    return DefWindowProc(…);
}

        上述代码片段根本没有处理 WM_SOMETHING 消息。假设 WM_SOMETHING 消息使用 wParam 参数来指定发生的某种类型的事情,而你只想在 wParam 的值为 4 时覆盖默认处理。其他值你该怎么办呢?

switch (uMsg) {
case WM_CHAR:
    OnChar(…);
    return 0;
case WM_SOMETHING:
    if (wParam == 4) { DoSomething4(…); }
    else … ????? … 
    return 0;
default:
    return DefWindowProc(…);
}

        如果值是 4,那么你进行你的特殊“某事 4”处理,但其他值呢?你如何处理它们?

        那么,想想看:你之前是如何处理的?在你添加 WM_SOMETHING 处理器之前的原始代码,等同于以下代码:

switch (uMsg) {
case WM_CHAR:
    OnChar(…);
    return 0;
case WM_SOMETHING:
    return DefWindowProc(…);
default:
    return DefWindowProc(…);
}

        在原始代码中,由于没有 WM_SOMETHING 消息的显式处理器,控制权转移到 default 案例处理器,它只是调用了 DefWindowProc 函数。

        如果你真的想,你可以将案例稍微扩展一些:

switch (uMsg) {
case WM_CHAR:
    OnChar(…);
    return 0;
case WM_SOMETHING:
    if (wParam == 4) return DefWindowProc(…);
    else return DefWindowProc(…);
default:
    return DefWindowProc(…);
}

        因为如果 wParam 是 4,原始代码只是调用了 DefWindowProc。如果 wParam 是 4 以外的其他值,原始代码仍然只是调用了 DefWindowProc

        当然,我以这种方式扩展了代码块,以便它与我们开始编写 WM_SOMETHING 方法时的案例相匹配。以这种方式写出来,很明显该如何填写问号部分。

switch (uMsg) {
case WM_CHAR:
    OnChar(…);
    return 0;
case WM_SOMETHING:
    if (wParam == 4) { DoSomething4(…); }
    else return DefWindowProc(…);
    return 0;
default:
    return DefWindowProc(…);
}

        仅仅因为你有一个 case WM_SOMETHING 语句,并不意味着你必须处理所有情况;你可以在你不想要处理的案例中仍然调用 DefWindowProc

        掌握了这些信息,你可以帮助评论者 Norman Diamond 在他的 WM_SYSKEYDOWN 消息处理器中处理 VK_F10 键,而无需开始处理“我真的不想麻烦的一堆系统键。”

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0x0007

可不可奖励我吃只毛嘴鸡 馋😋

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值