改變 CListCtrl、CHeaderCtrl 高度、字型、顏色和背景

來源:互聯網
上載者:User
摘要

  用CListCtrl來顯示資料比較方便,有時候我們需要標註某一列或某一個儲存格的背景和字型顏色,或者需要改變一下行高和字型大小,CListCtrl要改變這些並不是很方便。本文將介紹如何派生一個類來改變CListCtrl及其表頭的高度、字型大小、列背景顏色、儲存格背景顏色、列字型顏色、儲存格字型顏色。

關鍵字: 自繪 子類化 顏色 CListCtrl CHeaderCtrl 

一、 實現過程

1.表頭修改

  建立一個MFC類CHeaderCtrlCl,其基類為CHeaderCtrl,響應OnPaint訊息實現自繪,實現代碼請看原始碼(由於代碼較占篇幅,所以就不貼上來了,抱歉),在標頭檔中定義函數

LRESULT OnLayout( WPARAM wParam, LPARAM lParam ),之後手動添加訊息響應ON_MESSAGE(HDM_LAYOUT, OnLayout),在訊息響應中改變高度,實現代碼如下: LRESULT CHeaderCtrlCl::OnLayout( WPARAM wParam, LPARAM lParam )
{
        LRESULT lResult = CHeaderCtrl::DefWindowProc(HDM_LAYOUT, 0, lParam); 
        HD_LAYOUT &hdl = *( HD_LAYOUT * ) lParam; 
        RECT *prc = hdl.prc; 
        WINDOWPOS *pwpos = hdl.pwpos; 
        int nHeight = (int)(pwpos->cy * m_Height); //改變高度,m_Height為倍數
        pwpos->cy = nHeight; 
        prc->top = nHeight; 
        return lResult; 
} 複製代碼 2. 表的修改

  建立一個MFC類CListCtrlCl,其基類為CListCtrl,定義一個CHeaderCtrlCl的成員變數m_Header,重載PreSubclassWindow(),在函數中修改控制項類型為自繪模式,然後子類化表頭,代碼如下: void CListCtrlCl::PreSubclassWindow()
{
        // TODO: 在此添加專用代碼和/或調用基類
        ModifyStyle(0,LVS_OWNERDRAWFIXED);
        CListCtrl::PreSubclassWindow();
        CHeaderCtrl *pHeader = GetHeaderCtrl();
        m_Header.SubclassWindow(pHeader->GetSafeHwnd());
} 複製代碼 新增成員變數,儲存一些基本資料。 CPtrList m_ptrListCol;  //儲存列顏色
CPtrList m_ptrListItem; //儲存Item顏色表
CPtrList m_colTextColor; //儲存列字型顏色
CPtrList m_ItemTextColor; //儲存儲存格字型顏色 複製代碼 重載DrawItem()實現自繪,實現代碼請參照代碼。 手動添加訊息宏ON_WM_MEASUREITEM_REFLECT(),添加下面的函數,實現修改行高。 void CListCtrlCl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
        if (m_nRowHeight>0)
        {
                lpMeasureItemStruct->itemHeight = m_nRowHeight;
        }
} 複製代碼 添加訊息處理 OnMeasureItem() void CListCtrlCl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
        // TODO: 在此添加訊息處理常式代碼和/或調用預設值
        CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
} 複製代碼 覆蓋基類InsertColumn進行列資訊儲存 int CListCtrlCl::InsertColumn(int nCol, LPCTSTR lpszColumnHeading, 
                        int nFormat /* = LVCFMT_LEFT */, 
                        int nWidth /* = -1 */, 
                        int nSubItem /* = -1 */)
{
        m_Header.m_HChar.Add(lpszColumnHeading);
        if (nFormat==LVCFMT_LEFT)
        {
                m_Header.m_Format = m_Header.m_Format + "0";
        }
        else if (nFormat==LVCFMT_CENTER)
        {
                m_Header.m_Format = m_Header.m_Format + "1";
        }
        else if (nFormat==LVCFMT_RIGHT)
        {
                m_Header.m_Format = m_Header.m_Format + "2";
        }
        else
        {
                m_Header.m_Format = m_Header.m_Format + "1";
        }
        return CListCtrl::InsertColumn(nCol,lpszColumnHeading,nFormat,nWidth,nSubItem);
} 複製代碼 二、運行效果圖如下: 

 

三、使用方法  

  把HeaderCtrlCl.h, HeaderCtrlCl.cpp, ListCtrlCl.h, ListCtrlCl.cpp添加到你的工程中,在拖一個CListCtrl控制項到對話方塊上,新增成員變數,然後在標頭檔中#include “ListCtrlCl.h”,把剛添加的成員變數類型改為 CListCtrlCl ,在對話方塊的OnInitDialog()中添加初始化代碼: m_ListCtrl.SetColColor(0,RGB(10,150,20)); //設定列背景色
m_ListCtrl.SetColColor(2,RGB(30,100,90)); //設定列背景色
m_ListCtrl.SetBkColor(RGB(50,10,10));        //設定背景色
m_ListCtrl.SetItemColor(1,1,RGB(100,100,10)); //設定指定單元背景色
m_ListCtrl.SetRowHeigt(25);               //設定行高度
m_ListCtrl.SetHeaderHeight(1.5);          //設定頭部高度
m_ListCtrl.SetHeaderFontHW(16,0);   //設定頭部字型高度,和寬度,0表示預設,自適應 
m_ListCtrl.SetHeaderTextColor(RGB(255,200,100)); //設定頭部字型顏色
m_ListCtrl.SetTextColor(RGB(0,255,255));  //設定文本顏色
m_ListCtrl.SetHeaderBKColor(100,255,100,8); //設定頭部背景色
m_ListCtrl.SetFontHW(15,0);               //設定字型高度,和寬度,0表示預設寬度
m_ListCtrl.SetColTextColor(2,RGB(255,255,100)); //設定列文本顏色
m_ListCtrl.SetItemTextColor(3,1,RGB(255,0,0));  //設定儲存格字型顏色 複製代碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.