亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

如何自繪ListView表頭

2023-06-09 12:08:09
字體:
來源:轉載
供稿:網友

       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. 請參看示例代碼
 

示例代碼 :
開發者 : 死牛之祭(A-Few)
2009-08-25
說明 :
該代碼可以zi you引用, 包括商業應用. 希望轉載時尊重作者的署名權利.
學習交流請來信a-few@netease.com.

.h文件
// ---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
// ---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>

// ---------------------------------------------------------------------------
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 <vcl.h>
#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;

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, green0 = 154, blue0 = 206;
    BYTE red1 = 255, green1 = 255, blue1 = 255;
    BYTE red, green, blue;
    int j, m, n;

    switch(uMsg)
    {
    case WM_PAINT:
        BeginPaint(g_hListViewHeader, &ps);
        hPen = SelectObject(ps.hdc, GetStockObject(DC_PEN));
        iCount = Header_GetItemCount(g_hListViewHeader); // 獲取表頭數目
// 本文轉自 C++Builder研究 - http://www.ccrun.com/article.asp?i=1069&d=uq3568
        SetDCPenColor(ps.hdc, ColorToRGB((TColor)(0x00EFDBCE)));
        red = GetRValue((TColor)(0x00EFDBCE));
        green = GetGValue((TColor)(0x00EFDBCE));
        blue = GetBValue((TColor)(0x00EFDBCE));
        for (int i = 0; i < iCount; i++)
        {
            Header_GetItemRect(g_hListViewHeader, i, &rect); // 獲取Item的高度

            m = rect.bottom - rect.top;
            n = m / 2 + 1;
            for (j = 0; j < n; j++)
            {
                red = red0 * (j + 1) / n + red1 * (n - j - 1) / n;
                green = green0 * (j + 1) / n + green1 * (n - j - 1) / n;
                blue = blue0 * (j + 1) / n + blue1 * (n - j - 1) / n;

                SetDCPenColor(ps.hdc, RGB(red, green, blue));
                MoveToEx(ps.hdc, rect.left + 1, rect.top + j, NULL);
                LineTo(ps.hdc, rect.right, rect.top + j);
                MoveToEx(ps.hdc, rect.left + 1, rect.bottom - j - 1, NULL);
                LineTo(ps.hdc, rect.right, rect.bottom - j - 1);
            }
            SetDCPenColor(ps.hdc, ColorToRGB(clBtnFace));
            MoveToEx(ps.hdc, rect.right, rect.top + 1, NULL);
            LineTo(ps.hdc, rect.right, rect.bottom - 1);
            SelectObject(ps.hdc, Form1->Font->Handle);
            i1 = ((rect.bottom - rect.top) - abs(Form1->Font->Height)) / 2;
            hBrush = SelectObject(ps.hdc, GetStockObject(NULL_BRUSH));
            SetBkMode(ps.hdc, TRANSPARENT); // 這是設置背景為透明的
            TextOut(ps.hdc, rect.left + 10, rect.top + i1,
                Form1->ListView1->Columns->Items[i]->Caption.c_str(),
                Form1->ListView1->Columns->Items[i]->Caption.Length());
            SelectObject(ps.hdc, hBrush);
        }
        hPen = SelectObject(ps.hdc, hPen);
        EndPaint(g_hListViewHeader, &ps);
        break;
    default:
        return CallWindowProc((FARPROC)g_oldListViewWndProc, g_hListViewHeader,
            uMsg, wParam, lParam);
    }

    return 0;
}

// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    g_hListViewHeader = FindWindowEx(ListView1->Handle, NULL, "SysHeader32",
        NULL);
    g_oldListViewWndProc = (TCallBack)GetWindowLong
        (g_hListViewHeader, GWL_WNDPROC);
    SetWindowLong(g_hListViewHeader, GWL_WNDPROC, long(ListViewWindowProc));
}

// ---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
    SetWindowLong(g_hListViewHeader, GWL_WNDPROC, (long)g_oldListViewWndProc);
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲www在线观看| 亚洲福利在线视频| 免费av在线一区| 日本高清不卡在线| 欧美成人精品xxx| 亚洲天堂网站在线观看视频| 亚洲人成毛片在线播放| 国产精品www色诱视频| 成人免费网视频| 国产精品大陆在线观看| 69av在线播放| 欧美第一淫aaasss性| 亚洲福利视频免费观看| 久久久精品视频成人| 日韩av在线免费观看| 一区二区三区国产在线观看| 国产99久久精品一区二区永久免费| 欧美成人四级hd版| 国产精品久久久久久久久久| 亚洲天堂av在线播放| 成人h猎奇视频网站| 久久视频在线观看免费| 91高潮在线观看| 91在线观看免费观看| 97在线观看免费| 91免费观看网站| 亚洲男人的天堂在线| 欧美激情免费视频| 在线观看免费高清视频97| 日韩中文字幕不卡视频| 欧美激情网友自拍| 精品久久中文字幕久久av| 国产aⅴ夜夜欢一区二区三区| 亚洲在线一区二区| 国产欧美日韩丝袜精品一区| 国产视频在线观看一区二区| 日韩视频欧美视频| 国产精品h片在线播放| 久久精品99久久香蕉国产色戒| 国产精品精品一区二区三区午夜版| 欧美成人精品一区二区| 亚洲性猛交xxxxwww| 日本精品久久中文字幕佐佐木| 欧美孕妇性xx| 亚洲国产精品久久精品怡红院| 亚洲的天堂在线中文字幕| 亚洲欧美日韩在线高清直播| 中文字幕久热精品视频在线| 日韩av在线一区| 欧美成年人视频| 久久久亚洲福利精品午夜| 成人免费视频网址| 午夜精品久久久久久久男人的天堂| 久久精品成人欧美大片| 久久综合免费视频影院| 久久久久久久久网站| 中文字幕精品www乱入免费视频| 91伊人影院在线播放| 国产成人一区二区| 96精品久久久久中文字幕| 97视频在线免费观看| 日本成人免费在线| 尤物九九久久国产精品的特点| 欧美性猛交xxxx乱大交蜜桃| 91精品国产91久久久久| 成人妇女免费播放久久久| 一区二区中文字幕| 国产欧美日韩丝袜精品一区| 久久成人18免费网站| 91tv亚洲精品香蕉国产一区7ujn| 欧美性理论片在线观看片免费| 97色在线观看| 欧美—级a级欧美特级ar全黄| 国产日韩欧美在线播放| 69久久夜色精品国产7777| 欧美日韩国产精品一区二区三区四区| 欧美国产日韩精品| 清纯唯美亚洲激情| 亚洲精品视频免费在线观看| 欧美xxxx14xxxxx性爽| 欧美性jizz18性欧美| 亚洲另类xxxx| 国产激情久久久久| 亚洲一区二区三区成人在线视频精品| 亚洲自拍av在线| 97视频国产在线| 欧美成人三级视频网站| 国产成人黄色av| 国产激情久久久久| 日韩欧美精品中文字幕| 亚洲第一网中文字幕| 亚洲视屏在线播放| 国产亚洲一级高清| 日韩免费av在线| 欧美成年人视频| 国内精品久久久久久影视8| 久久久人成影片一区二区三区观看| 成人免费自拍视频| 91九色精品视频| 成年无码av片在线| 91在线观看免费高清完整版在线观看| 一区二区三区四区精品| 日本亚洲欧美成人| 日韩在线视频二区| 成人激情在线播放| 日韩av在线直播| 日韩在线中文字| 精品久久久av| 国产精品国内视频| 欧美日韩国产丝袜美女| 欧美www视频在线观看| 国产一区二区动漫| 91精品国产综合久久香蕉| 国内精品在线一区| 亚洲国产欧美久久| 欧美亚洲国产视频| 成人xvideos免费视频| 国产精品视频精品| 成人在线小视频| 色婷婷**av毛片一区| 午夜精品免费视频| 欧美在线视频观看| 日韩精品久久久久| 中文字幕日韩电影| 一本色道久久88精品综合| 在线a欧美视频| 中文字幕欧美日韩va免费视频| 欧美激情图片区| 91精品一区二区| 国产精品白嫩美女在线观看| 欧美黑人国产人伦爽爽爽| 日韩有码在线播放| 一级做a爰片久久毛片美女图片| 8050国产精品久久久久久| 午夜精品福利在线观看| 欧美一区二粉嫩精品国产一线天| 亚洲国产婷婷香蕉久久久久久| 欧美日韩一区免费| 欧美高清视频免费观看| 久久夜色撩人精品| 91超碰caoporn97人人| 午夜精品一区二区三区在线视频| 久久久久免费视频| 欧美日韩第一页| 久久综合久久美利坚合众国| 欧美另类极品videosbestfree| 亚洲成人久久一区| 欧美日韩亚洲系列| 欧美一级淫片播放口| 91在线免费网站| 国产精品一区二区三区成人| 日韩国产激情在线| 精品香蕉在线观看视频一| 中文字幕日韩欧美在线视频| 国产精品久久久久久久久粉嫩av| 亚洲一区二区三区视频| 91美女片黄在线观看游戏| 成人av电影天堂| 91嫩草在线视频| 欧美精品videosex极品1| 精品女厕一区二区三区| 久久久亚洲网站| 91精品国产高清久久久久久91| 黑人巨大精品欧美一区二区三区|