翻译《The Old New Thing》- Why do we even have the DefWindowProc function?

news2024/11/16 19:39:14

Why do we even have the DefWindowProc function? - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20071105-00/?p=24583

Raymond Chen 2007年11月05日


为什么一定要使用 DefWindowProc 函数?

简要

文章讨论了为什么我们有DefWindowProc函数。它解释了如果窗口过程遵循对话框模型,简单地返回FALSE以获得默认处理,那么DefWindowProc函数就没有必要存在。然而,这种模型忽略了派生类使用基类作为子程序的关键模式。文章通过示例代码展示了如何使用DefWindowProc来扩展而非完全覆盖基类行为,以及如何修改消息以自定义默认处理程序的行为。这在面向对象编程中是常见的,允许派生类大部分保持基类的行为。如果没有DefWindowProc,实现这些功能将会更加困难。

正文

        不久前,我探讨了重新实现对话框过程的两种方式(方法1,方法2)。 评论者“8”想知道我们为什么有DefWindowProc函数。 难道窗口过程不能遵循对话框模型,简单地返回FALSE以表示他们希望进行默认处理吗? 如果是这样,那就没有必要导出DefWindowProc函数了。

        这忽略了派生类的一个关键模式:将基类作为子程序来使用。 正是这种模式促使人们要求对像窗口过程那样的对话框过程。 如果你使用“返回FALSE以获得默认行为”的模式, 窗口过程可能会是这样的:

BOOL DialogLikeWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 switch (uMsg) {
  ... 处理消息并返回TRUE ...
 }
 // 我们没有特别的处理;做默认的事情
 return FALSE;
}

        在这个假想的世界中,子类化可能会这样进行:

BOOL DialogLikeSubclass(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 switch (uMsg) {
  ... 处理消息并返回TRUE ...
 }
 // 我们没有特别的处理;让基类尝试
 CallDialogLikeWindowProc(PrevDialogLikeWndProc, hwnd, uMsg, wParam, lParam);
}

        这在你想要完全覆盖基类行为时是有效的。 但如果你只想增强它呢? 调用先前的窗口过程类似于从派生类调用基类实现, 在面向对象编程中这是相当常见的,你希望派生类“大体上”表现得像基类。 考虑这样一个案例,我们希望允许用户通过点击客户区域的任何地方来拖动窗口:

LRESULT CALLBACK CaptionDragWndProc(
    HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 LRESULT lres;
 switch (uMsg) {
 case WM_NCHITTEST:
  lres = DefWindowProc(hwnd, uMsg, wParam, lParam);
  if (lres == HTCLIENT) lres = HTCAPTION;
  return lres;
 ...
 }
 return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

        我们希望我们的命中测试表现得像正常的一样, 唯一的例外是客户区域中的点击应该被视为对标题的点击。 有了DefWindowProc模型, 我们可以通过调用DefWindowProc来进行默认处理,然后在后端修改结果。 如果我们使用了类似对话框的模型, 就没有一种方法可以将“默认处理器”作为一个子程序来调用,以便让它承担繁重的工作。 我们将被迫做所有的工作或者什么都不做。

        另一个要明确的点是,DefWindowProc函数提供可修改消息的机会, 在它们到达默认处理器之前。 例如,假设你有一个只读的编辑控件, 但你希望它看起来像一个正常的编辑控件,而不是得到静态控件的外观。 你可以通过修改你传递给DefWindowProc的消息来做到这一点:

...
case WM_CTLCOLORSTATIC:
  if (GET_WM_CTLCOLOR_HWND(wParam, lParam) == m_hwndEdit)
  {
   // 给它“编辑”的外观
   return DefWindowProc(hwnd, WM_CTLCOLOREDIT, wParam, lParam);
  }
...

        还有一个常见操作是在保持其他属性不变的情况下更改编辑控件的一种颜色属性。 为此,你可以将DefWindowProc作为一个子程序来使用, 然后微调你想要自定义的一个属性。

case WM_CTLCOLORSTATIC:
  if (GET_WM_CTLCOLOR_HWND(wParam, lParam) == m_hwndDanger)
  {
   // 从默认颜色属性开始
   LRESULT lres = DefWindowProc(hwnd, uMsg, wParam, lParam);
   // 将文字颜色改为红色;保持其他所有东西不变
   SetTextColor(GET_WM_CTLCOLOR_HDC(wParam, lParam), RGB(255,0,0));
   return lres;
  }
...

        使用对话框模型来实现这些类型的操作将是一项更为棘手的任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1688271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day15|各种遍历的应用

相关题目&#xff1a; 层次遍历会一打十 反转二叉树 对称二叉树 层次遍历会一打十 自底向上的层序遍历 实现思路&#xff1a;层次遍历二叉树&#xff0c;将遍历后的结果revers即可 public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List&l…

Flutter 页面布局 Flex Expanded弹性布局

题记 —— 执剑天涯&#xff0c;从你的点滴积累开始&#xff0c;所及之处&#xff0c;必精益求精&#xff0c;即是折腾每一天。 什么是弹性布局&#xff08;Flex&#xff09;&#xff1f; 弹性布局&#xff08;Flex&#xff09;是一种基于弹性盒子模型的布局方式&#xff0c;类…

IP地址显示“不安全”怎么办|已解决

解决IP地址显示“不安全”的问题&#xff0c;通常需要确保网站或服务使用HTTPS协议进行加密通信&#xff0c;可以通过部署SSL证书来解决&#xff0c;以下是具体的解决步骤&#xff1a; 1 申请IP地址SSL证书&#xff1a;网站管理员应向证书颁发机构&#xff08;CA&#xff09;申…

【教学类-58-03】黑白三角拼图03(4*4宫格)总数算不出+随机抽取10张

背景需求&#xff1a; 【教学类-58-01】黑白三角拼图01&#xff08;2*2宫格&#xff09;256种-CSDN博客文章浏览阅读318次&#xff0c;点赞10次&#xff0c;收藏12次。【教学类-58-01】黑白三角拼图01&#xff08;2*2宫格&#xff09;256种https://blog.csdn.net/reasonsummer/…

联邦BGP

AR1&#xff1a; [Huawei]bgp 1 [Huawei-bgp]router-id 1.1.1.1 [Huawei-bgp]peer 12.1.1.2 as-number 2 [Huawei-bgp]network 10.1.1.1 24---宣告 AR8&#xff1a; [Huawei]bgp 3 [Huawei-bgp]router-id 8.8.8.8 [Huawei-bgp]peer 78.1.1.7 as-number 2 [Huawei-bgp]ne…

剖析镜面不锈钢氮气柜的种类和使用维护方法

镜面不锈钢氮气柜是一种高端的储存设备&#xff0c;专门设计用于保存对环境条件有严格要求的敏感物品。它采用了高品质的不锈钢材料&#xff0c;并通过精细的抛光处理达到镜面效果&#xff0c;不仅美观而且具备优秀的耐腐蚀性和易清洁性。柜体内利用氮气控制系统&#xff0c;通…

CTFHUB技能树——SSRF(三)

目录 URL Bypass 数字IP Bypass 302跳转 Bypass DNS重绑定 Bypass SSRF绕过方法&#xff1a; &#xff08;1&#xff09; http://abc.com127.0.0.1 &#xff08;2&#xff09;添加端口号 http://127.0.0.1:8080 &#xff08;3&#xff09;短地址 htt…

内网安全之证书服务基础知识

PKI公钥基础设施 PKI(Public Key Infrastructure)公钥基础设施&#xff0c;是提供公钥加密和数字签名服务的系统或平台&#xff0c;是一个包括硬件、软件、人员、策略和规程的集合&#xff0c;用来实现基于公钥密码体制的密钥和证书的产生、管理、存储、分发和撤销等功能。企业…

c【语言】了解指针,爱上指针(4)

了解指针&#xff0c;爱上指针&#xff08;4&#xff09; 字符指针变量数组指针变量二维数组传参的本质函数指针变量typedef关键字函数指针数组转移表 字符指针变量 如整型指针变量一样&#xff0c;它是指针变量的其中一个类型&#xff1a;char* 一般&#xff0c;我们是这样使…

通胀担忧仍存,美联储降息预期或又推迟

KlipC报道&#xff1a;周三&#xff0c;美联储公布4月30日至5月1日政策会议纪要&#xff0c;会议纪要显示美联储对通胀仍感到担忧&#xff0c;将更长时间维持利率不变&#xff0c;必要时进一步收紧政策。 尽管在前不久公布的4月CPI数据显示通胀有所缓解&#xff0c;但是被认为…

网站如何建设

#### 环境准备 - 安装Java Development Kit (JDK)&#xff1a;这是Java开发的基础&#xff0c;用于编译Java源代码。 - 安装Web服务器&#xff1a;常用的有Tomcat、Jetty、GlassFish或JBoss。它们负责将Java应用程序部署到Web上&#xff0c;并处理来自客户端的请求。 - 安装…

flutter开发实战-美颜前后对比图效果实现

flutter开发实战-美颜前后对比图效果实现 最近使用代码中遇到了图片前后对比&#xff0c;这里使用的是CustomClipper来实现 一、CustomClipper 我们实现CustomClipper子类来实现美颜后的图片裁剪功能 getClip()是用于获取剪裁区域的接口&#xff0c;由于图片大小是6060&am…

一张SSL证书如何同时保护多个域名及其子域名?

在互联网时代&#xff0c;数据安全和隐私保护变得至关重要&#xff0c;而SSL证书作为确保网站安全的重要工具&#xff0c;其重要性不言而喻。本文将详细探讨一种特殊的SSL证书——多域名通配符SSL证书&#xff0c;它为网站管理员提供了一种高效、经济的方式来保护多个域名及其子…

第一后裔加速器推荐 第一后裔免费加速器用哪个

知名游戏开发商NEXON对于许多老玩家来说都不会陌生&#xff0c;它旗下的泡泡堂和DNF可谓是一代人的青春。就在最近NEXON又为玩家们带来了最新作品《第一后裔》&#xff0c;该款游戏为搭建在虚幻5引擎上的一款多人联机射击掉宝类游戏&#xff0c;一上线就受到了许多游戏玩家的关…

高速公路定向广播(声光一体) HT-600D

1、产品概述&#xff1a; HT-600D声光一体平面波IP定向广播是北京恒星科通创新性研发产品&#xff0c;采用公司自主研发的平面波传声技术&#xff0c;该产品具有高声压、强指向性、高清晰度等特点&#xff0c;采用定向声传声技术将声音聚集到正前方定向传输,周边声压级明显降低…

【EXCEL_VBA_实战】两组数据比对是否一致(字符串数组)

工作背景&#xff1a;比对两组数据是否一致&#xff08;位置非一一对应&#xff09; 思路构建&#xff1a;两组数据转换为两组字符串数组&#xff0c;比对所包含元素是否相同 问题点&#xff1a;A数组的第一个元素不一定与B数组的第一个元素对应&#xff0c;此时无法通过公式…

数据仓库和数据挖掘基础

文章目录 1. 数据仓库基础知识1.1 数据仓库的基本特性1.2 数据仓库的数据模式1.3 数据仓库的体系结构 2. 数据挖掘基础知识2.1 数据挖掘的分类2.2 数据挖掘技术2.3 数据挖掘的应用过程 传统数据库在联机事务处理(OLTP)中获得了较大的成功&#xff0c;但是对管理人员的决策分析要…

SAP---成本中心采购跟消耗性采购的区别

1.常规库存采购业务的说明&#xff1a; 1.从业务层面分析&#xff0c;企业的常规库存物料采购是&#xff1a; 采购部门下采购订单后&#xff0c;供应商送货&#xff0c;当货物到厂后&#xff0c;由库管员执行收货操作&#xff0c;先将货物收到仓库中&#xff0c;再由各个需求…

tomcat jdbc连接池的默认配置配置方案

MySQL 5.0 以后针对超长时间数据库连接做了一个处理&#xff0c;即一个数据库连接在无任何操作情况下过了 8 个小时后(MySQL 服务器默认的超时时间是 8 小时)&#xff0c;MySQL 会自动把这个连接关闭。在数据库连接池中的 connections 如果空闲超过 8 小时&#xff0c;MySQL 将…

肌肤暗沉与胶原蛋白:解锁透亮肌肤的秘密

&#x1f338;亲爱的小仙女们&#xff0c;今天我们来聊聊肌肤暗沉与胶原蛋白之间的神秘联系。你是不是也曾为肌肤的暗沉而烦恼&#xff1f;其实&#xff0c;很多时候&#xff0c;肌肤的暗沉不仅仅是外部因素造成的&#xff0c;更与肌肤内部的胶原蛋白含量密切相关。&#x1f31…