VC中锁定ListView的栏目头宽度

世界之大,真是无其不有。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 版本?

为了找到答案,我们必须求助一个经常被遗忘的消息 WM_NOTIFYFORMAT。一般控件第一次被创建时,都要向父窗口一个消息询问父窗口需要哪个版本的通知消息。然后父窗口返回 NFR_ANSI 或 NFR_UNICODE。如果父窗口不处理 WM_NOTIFYFORMAT,那么这个消息将根据父窗口或对话框本身的首选项被传递到 Windows 的 DefWindowProc 消息处理例程进行默认处理。默认为 UNICODE。因此,要知道通知消息的版本,必须处理 ListCtrl 的 WM_NOTIFYFORMAT。为了确认父窗口的返回值,你可以做一个试验便明白了。

时间: 2024-10-27 08:05:56

VC中锁定ListView的栏目头宽度的相关文章

软件-vc中的listview怎么允许选中多行

问题描述 vc中的listview怎么允许选中多行 用vc开发一个软件,想要让这个listview支持多行同时被选中,也就是按住ctrl键就可以选中多行? 解决方案 ListView的多行选择问题??? http://bbs.csdn.net/topics/100072187 解决方案二: VB中如何获取listview选中了多少行 专业回答 Dim i As Integer, sCount As Integer sCount = 0 For i = 0 To ListView1.ListIte

VC中头文件没有怎么办

问题描述 VC中头文件没有怎么办 某些头文件在tc中有 在VC中没有 那该怎么办呢 解决方案 TC 和 VC 就没有对比性,TC 是 DOS 下运行的,开发的程序运行在 DOS 系统下.现在还有纯 DOS 系统吗?没有了吧! 怎么办?进行代码移植,将用 TC 实现的功能改用 VC 来实现.特别是以前 TC 下图形图像处理的函数,在 VC 下会更容易.更方便的实现. 解决方案二: 这个没办法,不同的编译器头文件有区别.实现也不一样 但是很多功能是有的.你需要的就是把tc的实现用vc提供的类库,AP

getegid函数-请问getegid这个函数在vc中的哪个头文件中

问题描述 请问getegid这个函数在vc中的哪个头文件中 请问vc中有这个函数吗,有的话是在哪个头文件中呢,没有的话是用什么代替呢?我在msdn上搜过,那上面显示头文件是,但是我试了一下显示没有这个头文件的错误信息. 解决方案 参考C语言getegid()函数:获得组识别码 是C语言,没有说是VC. 头文件: #include <unistd.h> #include <sys/types.h> 定义函数:gid_t getegid(void); 函数说明:getegid()用来取

浅谈VC中预编译的头文件放那里的问题分析_C 语言

用C++写程序,肯定要用预编译头文件,就是那个stdafx.h.不过我一直以为只要在.cpp文件中包含stdafx.h 就使用了预编译头文件,其实不对.在VC++中,预编译头文件是指放到stdafx.h中的头文件才会有效果.如下: file: stdafx.h 复制代码 代码如下: // stdafx.h : include file for standard system include files,// or project specific include files that are u

在VC中使用MATLAB C/C++函数库

MATLAB广泛应用于线性代数.自动控制理论.数理统计.数字信号处理.时间序列分析.动态系统仿真等领域.因此如果在VC中对MATLAB进行调用将大大减少编程的工作量.保证程序的准确性,并且继承了VC++强大的功能,提高开发效率,本文将介绍了在VC中使用MATLAB函数库的具体步骤: 在VC中建立一个项目后: 1.设置: 添加路径: 在project-settings-c/C++-category:-preprocessor-Additional include directories:栏目中添加

如何在VC中显示动态的GIF

如果是使用VB,也许这个话题是多余的,因为VB有一个图象控件可以非常容易地实现各种格式的图象显示功能,然而对于VC却没有一个象样的控件可以达到这种效果,怎么办?经过一段日子的研究,发现只需要实现两步工作,就可以在VC中实现如同VB中一样的gif动态效果. 本文将介绍的两部分是IPicture接口的使用和gif的储存格式,好象一听到储存格式,读者就不想再看下去了!其实不然,这里只须用到其最基本的一部分,请读者耐心地往下看. 一.IPicture接口 IPicture接口是一个com类,其成员函数可

如何在VC++中使用API直接打印

(说明:)这一段代码,用以演示<如何在VC++中使用API直接打印>.并且该段代码可以直接嵌入各种工程中,有实际使用的价值. (用途:)在Visual C++中,应用程序通常是使用CView中提供的打印功能,在OnPrint()或OnDraw()中向打印机输出.但是对于对话框中的数据,或基于对话框的程序,打印成了一件繁琐的工作. 该段代码向用户提供了PrintListCtrl()函数,用于打印用户在对话框或FormView中的CListCtrl(控件必须是Report View 形式的)控件中

VC++中图像处理类CBitmap的用法_C 语言

VC++中图像处理类CBitmap的用法 class CBitmap : public CGdiObject { DECLARE_DYNAMIC(CBitmap) public: static CBitmap* PASCAL FromHandle(HBITMAP hBitmap); // Constructors CBitmap(); BOOL LoadBitmap(LPCTSTR lpszResourceName); BOOL LoadBitmap(UINT nIDResource); BOO

VC中使用ADO开发数据库应用程序简明教程_C 语言

本文实例讲述了VC中使用ADO开发数据库应用程序的方法.分享给大家供大家参考,具体如下: 一.ADO概述 ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口.ADO 使您能够编写应用程序以通过 OLE.DB 提供者访问和操作数据库服务器中的数据.ADO 最主要的优点是易于使用.速度快.内存支出少和磁盘遗迹小.ADO 在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量.高性能的接口.之所以