WEB开发网
开发学院软件开发VC 如何锁定 ListView 的栏目头宽度 阅读

如何锁定 ListView 的栏目头宽度

 2006-07-23 11:20:11 来源:WEB开发网   
核心提示:本文示例源代码或素材下载 世界之大,真是无其不有,如何锁定 ListView 的栏目头宽度,Windows 应用程序的GUI标准明确规定了 ListView 栏目头(Column Header)的宽度必须是可调整的,这本来是专门为用户考虑而设计的控制特性,它的实现都在 comctl32.dll 动态链接库中,由

本文示例源代码或素材下载

世界之大,真是无其不有。Windows 应用程序的GUI标准明确规定了 ListView 栏目头(Column Header)的宽度必须是可调整的,这本来是专门为用户考虑而设计的控制特性,可是偏偏就有用户拒绝这样的特性。作为技术人员,用户的需求是很难拒绝的。 尽管这明显是一种“非典型性需求”。本文将通过一个实例来示范如何实现 ListView Column Header 宽度的锁定。

ListView 及其 Column Header 实际上都是 Windows 通用控件(Comctl32.dll) 的一部分。所以查一查 MSDN 中与“Header Control”相关的控件资料不难发现,栏目头的锁定与否与几个 Windows 的通知消息密切相关,这几个消息分别是 HDN_TRACK、HDN_BEGINTRACK 和 HDN_ENDTRACKA。其中 HDN_BEGINTRACK 是本文要特别关照的一个。当用户在栏目头上拖拽鼠标时,如果位置正好在改变宽度的分割条上,则栏目头控件会向其父窗口发送一个 HDN_BEGINTRACK 通知消息。为了实现栏目头宽度的锁定,就必须搞掂这个通知消息。不能将它传递到父窗口,但是,这个消息与 Windows 中形形色色的其它通知消息一样,有两个版本:一个版本是 HDN_BEGINTRACKW,专门用于宽字符和 Unicode 字符集;另一个版本是 HDN_BEGINTRACKA,专门用于 ANSI 字符集。这两个版本的使用方法可以从公共控件的头文件 commctrl.h 中获取:

// From commctrl.h
#ifdef UNICODE
#define HDN_BEGINTRACK HDN_BEGINTRACKW
#else
#define HDN_BEGINTRACK HDN_BEGINTRACKA
#endif  

所以在实现对消息的 HDN_BEGINTRACK 处理时,实际上是根据 UNICODE 的取值实现对 HDN_BEGINTRACKA 或 HDN_BEGINTRACKW 的处理。那么 Header Control 到底是发送的哪一个消息呢?在这里必须明白:Header Control 是 Windows 通用控件的一部分,它的实现都在 comctl32.dll 动态链接库中。由于这个 DLL 已经被编译成可执行代码,因此在工程中修改 UNICODE 的设置将无济于事。如何知道栏目头控件发送哪一个版本的通知消息呢?是 A 版本还是 W 版本?

1 2  下一页

Tags:如何 锁定 ListView

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接