如何自绘ListView表头

作者&投稿:倪空 (若有异议请与网页底部的电邮联系)
~

  TlistView 控件是vcl 对windows公用控件库的一个封装 用户TlistView控件并未提供自绘表头的事件 一般情况下 要想自绘表头比较困难 但是windows 所有控件的绘制都是由于消息WM_PAINT的产生 而由窗口过程来绘制的 这样我们似乎就有可能通过WM_PAINT消息能够绘制TlistView表头 经过分析发现TlistView 的组成实际上包括了两部分 一部分是TlistView本省 另外一部分就是TlistView的表头 该表头实际上是一个嵌入TlistView里面的独立的窗口 该窗口的类名为 SysHeader (可以使用ccrun写的窗口探测工具spy win观察的到) 综合上述依据 实现TlistView表头的自绘可以分为一下几个步骤:

   查找TlistView的表头窗口句柄

   替换表头窗口的窗口过程

   表头的WM_PAINT消息

   在窗口过程中编写绘制代码

  这样就能绘制TlistView 的表头了 具体实现方式如下 :

   查找表头有三种方式

  一 使用FindWindowEx :

  以类名 SysHeader 来查找TlistView的子窗口 由于TlistView只有一个名为 SysHeader 的子窗口(就是表头) 所以一定能够获取到表头窗口的句柄

  二 使用windows提供的帮助宏ListView_GetHeader

  这种方式实际上是通过发送消息来获取表头句柄 返回值即表头句柄

   替换表头的窗口过程

  使用SetWindowLong这个API 就可以替换掉一个窗口的窗口过程 (详细步骤请参看MSDN)

   请参看示例代码

   请参看示例代码

   具体代码

   h文件    //

  #ifndef Unit H    #define Unit H    //     #include    #include    #include    #include    #include

  //     class TForm : public TForm    {    __published: // IDE managed Components        TListView *ListView ;

  private: // User declarations    public: // User declarations        __fastcall TForm (TComponent* Owner);        __fastcall~TForm ();    };

  //     extern PACKAGE TForm *Form ;    //     #endif

   cpp文件    //

  #include    #pragma hdrstop

  #include Unit h     //     #pragma package( *** art_init)    #pragma resource * dfm     TForm *Form ;    typedef LRESULT(CALLBACK * TCallBack)(HWND UINT WPARAM LPARAM);

  TCallBack g_oldListViewWndProc;    HWND g_hListViewHeader;

  LRESULT CALLBACK ListViewWindowProc(HWND hwnd UINT uMsg WPARAM wParam         LPARAM lParam)    {        PAINTSTRUCT ps ={ };        RECT rect = { };        HDC hPen = NULL;        HDC hBrush = NULL;        int iCount = ;        int i = ;        BYTE red = green = blue = ;        BYTE red = green = blue = ;        BYTE red green blue;        int j m n;

  switch(uMsg)        {        case WM_PAINT:            BeginPaint(g_hListViewHeader             hPen = SelectObject(ps hdc GetStockObject(DC_PEN));            iCount = Header_GetItemCount(g_hListViewHeader); // 获取表头数目    // 本文转自 C++Builder研究 ?i=             SetDCPenColor(ps hdc ColorToRGB((TColor)( x EFDBCE)));            red = GetRValue((TColor)( x EFDBCE));            green = GetGValue((TColor)( x EFDBCE));            blue = GetBValue((TColor)( x EFDBCE));            for (int i = ; i Font >Handle);                i = ((rect bottom rect top) abs(Form >Font >Height)) / ;                hBrush = SelectObject(ps hdc GetStockObject(NULL_BRUSH));                SetBkMode(ps hdc TRANSPARENT); // 这是设置背景为透明的                TextOut(ps hdc rect left + rect top + i                     Form >ListView >Columns >Items[i] >Caption c_str()                     Form >ListView >Columns >Items[i] >Caption Length());                SelectObject(ps hdc hBrush);            }            hPen = SelectObject(ps hdc hPen);            EndPaint(g_hListViewHeader             break;        default:            return CallWindowProc((FARPROC)g_oldListViewWndProc g_hListViewHeader                 uMsg wParam lParam);        }

  return ;    }

  //     __fastcall TForm ::TForm (TComponent* Owner) : TForm(Owner)    {        g_hListViewHeader = FindWindowEx(ListView >Handle NULL SysHeader             NULL);        g_oldListViewWndProc = (TCallBack)GetWindowLong            (g_hListViewHeader GWL_WNDPROC);        SetWindowLong(g_hListViewHeader GWL_WNDPROC long(ListViewWindowProc));    }

lishixinzhi/Article/program/c/201311/11101




屏山县15012702523: 如何自绘ListView表头 -
羿李依托: LRESULT CALLBACK ListViewWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam){PAINTSTRUCT ps ={ 0 };RECT rect = { 0 };HDC hPen = NULL;HDC hBrush = NULL;int iCount = 0;int i1 = 0;BYTE red0 = 115, ...

屏山县15012702523: 怎样使用ListView控件展示数据 -
羿李依托: ListView控件的最基本用法是在窗体中以表格形式显示数据,是应用非常广泛的一个窗体控件.控件工具箱在初始状态下是没有ListView控件的,需要我们在工具-附加控件中勾选"MicrosoftListViewControl,Version6.0",这样ListView控件就会...

屏山县15012702523: 急... 如何绘制listview
羿李依托: 网格可以在customDrawItem或AdvancedCustomDraw中画.或一个任何类型的指针(比如Font,Brush...),这个指针指的物件要你本身建立/删除.可以在每个Item的 Data 属性中保存这个 Item 色彩值,如许可以保存更多属性.你可以使每个Item有不合的字体/色彩/背景.

屏山县15012702523: 如何修改listview表头的颜色 -
羿李依托: 1、点开始——在运行框中输入cmd,按回车键; 2、在窗口左上角,鼠标右键选择属性; 3、选择字体选项卡,选择字体; 4、选择颜色,选择一种背景颜色,点确定.

屏山县15012702523: 跪求怎么使用ListView绘制表格
羿李依托: 可以啊 ListView 每个item对应表格的一行,设计一个LinearLayout(水平方向),里面设计多列TextView,加一些边框线等效果然后在adapter中的getView()返回linearLayout就可以了

屏山县15012702523: android 怎么给listview添加一个固定表头以及显示像table的效果 -
羿李依托: 定义一个样式一条线1dp fill_parent #dadada 1.为表头新建一个layout:a_item.xml(一共设置3个列名)android:id="@+id/a_item" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@...

屏山县15012702523: excel里怎样做表头 -
羿李依托: 为excel表格设置固定表头是我们平时工作中经常会用到的,下面小编详细教大家如何设置.首先打开Excel表格,如果你的表头只有一行,那么直接选择“视图-冻结窗格-冻结首行”就可以了.excel如何设置固定表头 如果你的表头是多行的,那...

屏山县15012702523: 表格的表态表头怎么做 -
羿李依托: 以WPS 2019版为例1、将需要插入双斜线的单元格扩大到自己所需要的大小2、依次点击“插入”--->“形状”3、选择“直线”,按住shift+画直线,即可

屏山县15012702523: word表格如何自定义表头 -
羿李依托: 方法如下:1. 先插入表格2. 再把光标放在表格内不要选定内容3. 点击“表格”“绘制斜线表头”4. 再选样式,就可以了

屏山县15012702523: excel表格中如何制作表头 -
羿李依托: 右键——设置单元格格式——边框 或者1、选“绘图/直线”,将光标放在拟划的起始点,按住鼠标左键拖动,到终点处松开,直线就划成了.在单元格横划、竖划或斜划,都可用此法.2、调整文字位置: ★在单元格选择左对齐,输入文字如“月份”,用空格键将两字调到右侧,点“格式/单元格/对齐/垂直对齐/靠上”; ★按住ALT键同时回车换行,并用敲回车次数确定行距大小,输入单元格第二行左侧文字如“企业”;★再输入第二行右侧文字如“数值”,用光标将其调到右侧适当位置即可.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网