关于 GETDISPINFO 通知的详细理解

news/2025/3/16 6:25:47/

你可能会经常看到这样的通知消息:XXN_GETDISPINFO,是不是有点印象了?

这个消息的使用场景:当控件要求其父窗口生成(标记为延迟呈现的)信息时,将使用这个 XXN_GETDISPINFO 通知,这些信息可以通过 LPSTR_TEXTCALLBACK 等来显式生成,也可以通过作为所有者数据控件隐式生成。是不是有点绕?

事实上,控件实际上只是请求有关条目信息的代码(通过类似 LVM_GETITEM 的消息)和生成该信息的代码(LVN_GETDISPINFO 处理程序)之间的中间人。

换句话说,代码执行流程,如下所述:

首先,一个想从列表视图控件中获取条目信息的人会创建一个 LVITEM 结构,并根据需要根据掩码初始化 LVITEM.mask 和其他字段。
(例如,如果设置了 LVIF_TEXT 标志,则还必须将 LVITEM.pszText 和 LVITEM.cchTextMax 设置为缓冲区及其大小。)

然后,它向列表视图控件发送一条LVM_GETITEM消息。列表视图控件查看 LVITEM.mask 以查看需要填写的信息。列表视图可以自行提供的一些信息。信息的其他部分需要列表视图控件的父窗口的帮助。

例如,如果 LVITEM.mask 设置了 LVIF_TEXT 标志,并且项的文本设置为 LPSTR_TEXTCALLBACK,则列表视图需要查阅其父窗口以获取文本。

列表视图控件将 LVN_GETDISPINFO 消息发送给其父窗口,说:“嘿,有人在找信息,请提供 LVITEM.mask 成员中要求的信息。” 父窗口处理消息后,结果将返回给原始调用方。

下面是在返回结果之前发生的一个小奖励步骤: 如果父窗口在 LVITEM.mask 中设置了 LVIF_DI_SETITEM 标志,则返回的值也会保存到列表视图控件中,就像您发送了LVM_SETITEM消息一样。例如,如果设置 LVIF_DI_SETITEM 标志以响应LVIF_TEXT 请求,则返回的文本将保存到列表视图项中,覆盖以前的值 LPSTR_TEXTCALLBACK。如果您只想计算一次结果并让列表视图从一开始就缓存结果,这将非常方便。

请注意,在整个过程中,LVITEM.mask 控制列表视图的原始调用方请求的信息,以及其父视图的列表视图请求的信息。
如果您错误地更改了 LVITEM.mask 的值(除了设置 LVIF_DI_SETITEM 标志,如“奖励步骤”中所述),那么您就干扰了这个 “推卸责任” 的游戏。父窗口处理消息后,结果将返回给原始调用方。但是,如果您修改了 LVITEM.mask,则返回给调用方的结果与调用方请求的结果不同!

例如,如果列表视图看到设置了 LVIF_TEXT 标志,则会将父窗口提供的字符串复制回调用方的缓冲区。但是等一下,如果父窗口是设置 LVIF_TEXT 标志的人,这意味着原始呼叫者没有要求文本。没有缓冲区可以将结果复制回其中。列表视图将字符串复制到未初始化的指针,并因此发生各种内存损坏。

总结

在处理 XXN_GETDISPINFO 通知时,请遵守惯例。掩码指定了要求您提供哪些信息(因此哪些信息将被复制回原始呼叫者)。如果您更改此掩码,原始呼叫者将大吃一惊。

这就像在餐厅里当厨师修改顾客的订单一样。
“哦,这位顾客不想要香菜,那我给他加点葱花作为替代吧。”

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《The GETDISPINFO notifications tell you what information they want》


http://www.ppmy.cn/news/1325110.html

相关文章

计算机网络编程

网络编程 文章目录 网络编程1 计算机网络1.1 什么是网络1.2 什么是计算机网络1.3 计算机网络发展的四个阶段 2 常用名词2.1 网络模型2.1.1 OSI模型2.1.2 TCP/IP模型 2.2 网络协议2.2.1 TCP/UDP2.2.2 IP 2.3 Port: 端口号 3 计算机网络编程3.1 InetAddress类3.2 基于TCP的Socket…

零售EDI:Babylist EDI 项目案例

Babylist 与各种不同的品牌和零售商合作,包括婴儿用品、玩具、衣物和其他相关产品的制造商。用户可以在 Babylist 上浏览各种不同的产品,并根据自己的需求和喜好选择适合的项目。本文将为大家介绍对接Babylist 的EDI项目案例。 Babylist EDI 需求 传输协…

Elastic 8.12:AI Assistant for Observability 正式发布,更新至 Apache Lucene 9.9

作者:来自 Elastic Brian Bergholm 今天,我们很高兴地宣布 Elastic 8.12 全面上市。 有哪些新的功能? 8.12 版本的两个最重要的组成部分包括 Elastic AI Assistant for Observability 的 正式发布版 和 Apache Lucene 9.9 的更新&#xff08…

一个简单好用的C语言单元测试框架-Unity

Unity简介: Unity是一个用于C语言的轻量级单元测试框架。它由Throw The Switch团队开发,旨在简化嵌入式系统的单元测试。单元测试中单元的含义,单元就是人为规定的最小的被测功能模块,如C语言中单元指一个函数,Java里…

PostgreSQL以查询的结果集创建表

select * into [新数据表名] from [旧数据表名]

AD导出BOM表 导出PDF

1.Simple BOM: 这种模式下,最好在pcb界面,这样的导出的文件名字是工程名字,要是在原理图界面导出,会以原理图的名字命名表格。 直接在菜单栏 报告->Simple BOM 即可导出物料清单,默认导出 comment pattern qu…

【JavaWeb后端开发-第七章】SpingBoot原理

文章目录 前言1. 配置优先级2. Bean管理2.1. 获取Bean2.2. Bean作用域2.3. 第三方Bean 3. SpringBoot原理3.1. 起步依赖3.2. 自动配置3.2.1. 概述3.2.2. 常见方案概述方案一方案二 3.2.3. 原理分析3.2.3.1. 源码跟踪3.2.3.2. Conditional 3.2.4. 案例3.2.4.1. 自定义starter分析…

❤ Uniapp使用二 ( 日常使用篇)

❤ Uniapp使用二 ( 日常使用篇) 一、表单 1、基础表单验证 form <form submit"formSubmit" reset"formReset"> <view class"uni-form-item uni-column"><view class"title">请选择类型{{selectvalue}}</view&…