计算机二级辅导:如何自绘ListView表头计算机等级考试

文章作者 100test 发表时间 2010:01:02 07:00:26
来源 100Test.Com百考试题网


  TlistView 控件是vcl 对windows公用控件库的一个封装.用户TlistView控件并未提供自绘表头的事件, 一般情况下, 要想自绘表头比较困难. 但是windows 所有控件的绘制都是由于消息WM_PAINT的产生,而由窗口过程来绘制的, 这样我们似乎就有可能通过WM_PAINT消息能够绘制TlistView表头. 经过分析发现TlistView 的组成实际上包括了两部分, 一部分是TlistView本省, 另外一部分就是TlistView的表头, 该表头实际上是一个嵌入TlistView里面的独立的窗口, 该窗口的类名为”SysHeader32”.(可以使用ccrun写的窗口探测工具spy4win观察的到). 综合上述依据, 实现TlistView表头的自绘可以分为一下几个步骤:
  1. 查找TlistView的表头窗口句柄.
  2. 替换表头窗口的窗口过程
  3. 表头的WM_PAINT消息
  4. 在窗口过程中编写绘制代码
  这样就能绘制TlistView 的表头了.具体实现方式如下 :
  1. 查找表头有三种方式
  一. 使用FindWindowEx :
  以类名”SysHeader32”来查找TlistView的子窗口, 由于TlistView只有一个名为”SysHeader32”的子窗口(就是表头), 所以一定能够获取到表头窗口的句柄
  二. 使用windows提供的帮助宏ListView_GetHeader
  这种方式实际上是通过发送消息来获取表头句柄, 返回值即表头句柄
  2. 替换表头的窗口过程
  使用SetWindowLong这个API 就可以替换掉一个窗口的窗口过程.(详细步骤请参看MSDN)
  3. 请参看示例代码
  4. 请参看示例代码
  具体代码
  .h文件
  // ---------------------------------------------------------------------------
  #ifndef Unit1H
  #define Unit1H
  // ---------------------------------------------------------------------------
  #include
  #include
  #include
  #include
  #include
  // ---------------------------------------------------------------------------
  class TForm1 : public TForm
  {
  __published: // IDE-managed Components
  TListView *ListView1.
  private: // User declarations
  public: // User declarations
  __fastcall TForm1(TComponent* Owner).
  __fastcall~TForm1().
  }.
  // ---------------------------------------------------------------------------
  extern PACKAGE TForm1 *Form1.
  // ---------------------------------------------------------------------------
  #endif
  .cpp文件
  // ---------------------------------------------------------------------------
  #include
  #pragma hdrstop
  #include "Unit1.h"
  // ---------------------------------------------------------------------------
  #pragma package(smart_init)
  #pragma resource "*.dfm"
  TForm1 *Form1.
  typedef LRESULT(CALLBACK * TCallBack)(HWND, UINT, WPARAM, LPARAM).
  TCallBack g_oldListViewWndProc.
  HWND g_hListViewHeader.

相关文章


C 多继承的二义性计算机等级考试
VC实现按钮的3D效果计算机等级考试
计算机二级C基础入门:stdafx.h的作用计算机等级考试
C 编程基础入门:友元接口计算机等级考试
计算机二级辅导:如何自绘ListView表头计算机等级考试
计算机二级辅导:C语言free函数的原理计算机等级考试
2009年9月全国计算机二级C语言笔试试题计算机等级考试
2009年下半年全国计算机二级C语言笔试答案计算机等级考试
2009年9月全国计算机二级C语言上机试题计算机等级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛