国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > 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);
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
91国内精品在线视频| 国产在线视频精品视频免费看| 日本在线天堂| 伊人影院在线观看| 午夜羞羞小视频在线观看| 亚洲综合激情六月婷婷在线观看| 国产美女一区视频| 国产在线中文字幕| 五月天婷婷基地| 精品推荐蜜桃传媒| jizz在线视频| 中文字幕网站视频在线| 国产区视频在线| 亚洲精品在线视频免费| 国产在线看片| 在线播放av网站| 高清在线观看av| 伊人中文在线| 国产精美视频| www.狠狠操| 国产9色视频| 精品资源在线看| 91在线网站| 国产综合视频一区二区三区免费| 91极品在线| 国产精品69一区二区三区| 嫩草在线播放| 性国产高清在线观看| 午夜视频在线观看网站午夜视频在线| 2021av在线| 国产精品18久久久久网站| 激情综合网五月激情| 亚洲综合在线网| 国产天堂视频| 国产一区电影| 国产乱码在线| www.国产精品.com| 夜夜爽夜夜操| 精品国产一区二区三区久久久狼牙 | 九九热视频在线观看| 中文乱码字幕av网站| 国产青青草在线| 国产亚洲精品久久久久久移动网络| 狠狠操视频网站| 青青草原av在线| 青青草视频在线观看| 91在线视频免费看| av影视在线看| 日韩国产成人| 国产九九九九| 国产日本视频| 在线国产1区| www在线观看播放免费视频日本| 免费黄网站在线观看| 免费看黄视频网站| 福利视频在线看| 国产三区视频在线观看| 国产传媒在线播放| 亚洲私人影吧| 最好看更新中文字幕| 国产天堂在线观看| 一区二区三区四区在线免费视频| 在线观看的网站你懂的| 狠狠干天天爱| 精品国产一区二区三区久久久狼牙 | 青青草视频免费在线观看| 麻豆精品不卡国产免费看| 狠狠干天天爱| 在线国产一级| 国产麻豆一级片| 国产精品欧美色图| 日韩亚洲一区中文字幕| 国产毛片毛片毛片| 国产高清视频在线观看| eeuss影院网站免费观看| 丁香花高清在线观看完整版| 国产高清免费视频| 国产自产视频| 青草在线视频在线观看| 国产网站免费观看| 亚洲an天堂an在线观看| 国产特级嫩嫩嫩bbb| 欧美性猛交p30| 国产盗摄精品一区二区酒店| 九九热视频在线观看| 亚洲欧美日韩综合精品网| 午夜av在线播放| 麻豆网站在线免费观看| 国产成在线观看免费视频| 国产中文字幕第一页| 天天草天天草| a级片国产精品自在拍在线播放| 国产成人福利| 国产高清视频免费最新在线| 国产精品入口麻豆电影| 国产亚洲精品午夜高清影院| 日韩av成人| 国产视频青青| 国产视频1区| 尤物网站在线| 日本中文字幕高清视频| 久久99亚洲网美利坚合众国 | 中文字幕麻豆| 九九热视频免费在线观看| 亚洲综合在线不卡| 伊人春色在线| 亚洲成a人v欧美综合天堂麻豆| 国产变态拳头交视频一区二区| 国产区在线观看| 国产精品入口麻豆免费观看| 国产网站在线免费观看| 国产高清免费在线播放| 国产精品99999| 2018中文字幕在线观看| 中文字幕av免费| 四虎在线免费视频| 九九热免费在线视频| 牛牛热在线视频| 天天爱天天做色综合| 成人欧美亚洲| 国产videos| 激情小说 在线视频| 中文字幕有码在线视频| 91在线最新| 九九热视频精品在线观看| 国产极品一区二区三区| 精品一区二区三区免费站| 亚洲欧美综合乱码精品成人网 | 国产对白国语对白| 亚洲免费网站在线观看| 狠狠操视频网站| 精品女厕厕露p撒尿| 国产尤物视频| 国产xxxxx| 国产在线看片| av免费在线免费| 国产亚洲精品久久久久久移动网络 | 日本免费不卡| 尤物在线视频| 日本一二区视频| 2018狠狠干| 午夜av在线播放| 免费高清视频日韩| 99爱视频在线观看| 国产小黄视频| 激情丁香婷婷| av在线不卡网站| 精品日韩av| 国产日本视频| 五月综合网站| 国产九九九九| 尤物视频在线看| 丁香视频免费观看| 伊人影院在线视频| 中文岛国精品亚洲一区| 国产福利一区二区在线精品| 国产中文字幕网| www免费在线观看视频| 精品福利视频导航大全| 国产福利在线| 精品a在线观看| 香蕉视频在线观看www| 青青青青在线| 国产精品探花在线| 中文字幕在线影视资源| 国产永久免费高清在线观看视频| 欧美精品se| 二区三区中文字幕| 国产免费自拍视频| 丁香婷婷在线观看| 国产一二区在线| 国产福利免费观看| 亚洲综合天堂网| 激情亚洲综合网| √天堂中文在线| 精品国产福利一区二区在线 | 欧美日韩一区二区三区在线播放| 精品伦理一区二区| 日本一本久久| 国产网站免费看| 精品国产高清a毛片无毒不卡| 在线观看av的网站| 国产在线视频自拍| 在线亚洲精品自拍| 激情小说 在线视频| 国产精品久久麻豆| 先锋影音av中文字幕| 国产美女视频一区二区二三区| 国产一级粉嫩xxxx| 在线观看国产视频| 国产麻豆综合视频在线观看| 国产91在线视频蝌蚪| 久久精品最新免费国产成人| 国产天堂在线观看| 日本高清不卡中文字幕| 国产欧美日本亚洲精品一4区| 99在线播放| 国产网站在线免费观看| 美女被人操视频在线观看| 国产黄在线看|