MFC 自定义CListCtrl

MFC 自定义CListCtrl本文的代码也是根据网上现有的改编而来首先是.h#pragmaonce#include”HeaderCtrlCl.h”//CListCtrlClclassCListCtrlCl:publicCListCtrl{DECLARE_DYNAMIC(CListCtrlCl)public:CHeaderCtrlClm_Header;CListCtrlCl();

大家好,又见面了,我是你们的朋友全栈君。

本文的代码也是根据网上现有的改编而来

首先是.h

#pragma once
#include "HeaderCtrlCl.h"
// CListCtrlCl

class CListCtrlCl : public CListCtrl
{
    DECLARE_DYNAMIC(CListCtrlCl)

public:
    CHeaderCtrlCl m_Header;
    CListCtrlCl();
    virtual ~CListCtrlCl();

protected:
    DECLARE_MESSAGE_MAP()
    virtual void PreSubclassWindow();
public:
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
public:
    afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct);
    void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point){}
    afx_msg void OnRButtonDown(UINT nFlags, CPoint point){}
public:
    // 行高
    int m_nRowHeight;
    int InsertColumn(int nCol, LPCTSTR lpszColumnHeading,
        int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1);
public:
    // Gradient - 渐变系数,立体背景用,不用渐变设为0
    void SetHeaderBKColor(int R, int G, int B, int Gradient);
public:
    // 设置表头高度
    void SetHeaderHeight(float Height);
    CPtrList m_ptrListCol;  //保存列颜色
    CPtrList m_ptrListItem; //保存Item颜色表
    CPtrList m_colTextColor; //保存列字体颜色
    CPtrList m_ItemTextColor; //保存单元格字体颜色
    CPtrList m_ItemFontSize;//保存单元格字体

    bool FindColColor(int col ,COLORREF &color); //查找列颜色
    bool FindItemColor(int col,int row,COLORREF &color);
    bool FindColTextColor(int col,COLORREF &color); //查找列字体颜色
    bool FindItemTextColor(int col,int row,COLORREF &color);
    bool FindItemFontSize(int col,int row,int &height,int &width);//查找字体大小

    void SetColColor(int col,COLORREF color);  //设置列颜色
    void SetItemColor(int col,int row,COLORREF color); //设置Item颜色
    void SetColTextColor(int col,COLORREF color);   //设置列文本颜色
    void SetItemTextColor(int col,int row,COLORREF color);
    void SetRowHeigt(int nHeight); //设置行高
    void SetHeaderFontHW(int nHeight,int nWith); //设置表头字体大小
    void SetHeaderTextColor(COLORREF color);
    COLORREF m_color;
    BOOL SetTextColor(COLORREF cr);
    void SetFontHW(int nHeight,int nWith);  //设置字体的高和宽

    void SetItemFontHW(int col,int row,int nHeight,int nWidth);
public:
    // 字体高度
    int m_fontHeight;
public:
    // 字体宽度
    int m_fontWith;
};

分割线


.cpp如下

#include "stdafx.h"
#include "ListCtrlCl.h"

struct stColor
{
    int nRow;
    int nCol;
    COLORREF rgb;
};

struct stFont
{
    int nRow;
    int nCol;
    int nFontWidth;
    int nFontHeight;
};
// CListCtrlCl

IMPLEMENT_DYNAMIC(CListCtrlCl, CListCtrl)

CListCtrlCl::CListCtrlCl()
: m_nRowHeight(0)
, m_fontHeight(12)
, m_fontWith(0)
{
    m_color = RGB(0,0,0);
}

CListCtrlCl::~CListCtrlCl()
{
}


BEGIN_MESSAGE_MAP(CListCtrlCl, CListCtrl)
    ON_WM_MEASUREITEM()
    ON_WM_MEASUREITEM_REFLECT()
    ON_WM_LBUTTONDOWN()
    ON_WM_RBUTTONDOWN()
END_MESSAGE_MAP()



// CListCtrlCl 消息处理程序



void CListCtrlCl::PreSubclassWindow()
{
    // TODO: 在此添加专用代码和/或调用基类
    ModifyStyle(0,LVS_OWNERDRAWFIXED);
    CListCtrl::PreSubclassWindow();
    CHeaderCtrl *pHeader = GetHeaderCtrl();
    m_Header.SubclassWindow(pHeader->GetSafeHwnd());
}

void CListCtrlCl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{

    // TODO: 添加您的代码以绘制指定项
    TCHAR lpBuffer[256];

    LV_ITEM lvi;

    lvi.mask = LVIF_TEXT | LVIF_PARAM ;
    lvi.iItem = lpDrawItemStruct->itemID ; 
    lvi.iSubItem = 0;
    lvi.pszText = lpBuffer ;
    lvi.cchTextMax = sizeof(lpBuffer);
    VERIFY(GetItem(&lvi));

    LV_COLUMN lvc, lvcprev ;
    ::ZeroMemory(&lvc, sizeof(lvc));
    ::ZeroMemory(&lvcprev, sizeof(lvcprev));
    lvc.mask = LVCF_WIDTH | LVCF_FMT;
    lvcprev.mask = LVCF_WIDTH | LVCF_FMT;

    CDC* pDC;
    pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    CRect rtClient;
    GetClientRect(&rtClient);
    for ( int nCol=0; GetColumn(nCol, &lvc); nCol++)
    {
        if ( nCol > 0 ) 
        {
            // Get Previous Column Width in order to move the next display item
            GetColumn(nCol-1, &lvcprev) ;
            lpDrawItemStruct->rcItem.left += lvcprev.cx ;
            lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left; 
        }

        CRect rcItem;   
        if (!GetSubItemRect(lpDrawItemStruct->itemID,nCol,LVIR_LABEL,rcItem))   
            continue;   

        ::ZeroMemory(&lvi, sizeof(lvi));
        lvi.iItem = lpDrawItemStruct->itemID;
        lvi.mask = LVIF_TEXT | LVIF_PARAM;
        lvi.iSubItem = nCol;
        lvi.pszText = lpBuffer;
        lvi.cchTextMax = sizeof(lpBuffer);
        VERIFY(GetItem(&lvi));
        CRect rcTemp;
        rcTemp = rcItem;

        if (nCol==0)
        {
            rcTemp.left -=2;
        }

        if ( lpDrawItemStruct->itemState & ODS_SELECTED )
        {
            pDC->FillSolidRect(&rcTemp, GetSysColor(COLOR_HIGHLIGHT)) ;
            pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT)) ;
        }
        else
        {
            COLORREF color;
            color = GetBkColor();
            pDC->FillSolidRect(rcTemp,color);

            if (FindColColor(nCol,color))
            {
                pDC->FillSolidRect(rcTemp,color);
            }
            if (FindItemColor(nCol,lpDrawItemStruct->itemID,color))
            {
                pDC->FillSolidRect(rcTemp,color);
            }

            //pDC->SetTextColor(m_color);
        }

        pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));

        UINT   uFormat    = DT_CENTER ;
        if (m_Header.m_Format[nCol]=='0')
        {
            uFormat = DT_LEFT;
        }
        else if (m_Header.m_Format[nCol]=='1')
        {
            uFormat = DT_CENTER;
        }
        else if (m_Header.m_Format[nCol]=='2')
        {
            uFormat = DT_RIGHT;
        }

        pDC->SetTextColor(m_color);
        COLORREF color;
        if (FindColTextColor(nCol,color))
        {
            pDC->SetTextColor(color);
        }
        if (FindItemTextColor(nCol,lpDrawItemStruct->itemID,color))
        {
            pDC->SetTextColor(color);
        }

        CFont nFont ,* nOldFont; 
        int fontheight, fontwidth;
        if(FindItemFontSize(nCol,lpDrawItemStruct->itemID,fontheight,fontwidth))
        {
            nFont.CreateFont(fontheight,fontwidth,0,0,0,FALSE,FALSE,0,0,0,0,0,0,_TEXT("宋体"));//创建字体 
            nOldFont = pDC->SelectObject(&nFont);

            int ofst;
            ofst = rcItem.Height() - fontheight;
            rcItem.OffsetRect(0,ofst/2);//居中显示
        }
        else
        {
            nFont.CreateFont(m_fontHeight,m_fontWith,0,0,0,FALSE,FALSE,0,0,0,0,0,0,_TEXT("宋体"));//创建字体 
            nOldFont = pDC->SelectObject(&nFont);

            TEXTMETRIC metric;
            metric.tmHeight;
            pDC->GetTextMetrics(&metric);
            int ofst;
            ofst = rcItem.Height() - metric.tmHeight;
            rcItem.OffsetRect(0,ofst/2);//居中显示
        }
        DrawText(lpDrawItemStruct->hDC, lpBuffer, strlen(lpBuffer), &rcItem, uFormat) ;
        DeleteObject(&nFont);
        pDC->SelectStockObject(SYSTEM_FONT) ;
    }

}

void CListCtrlCl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值

    CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
void CListCtrlCl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
    if (m_nRowHeight>0)
    {
        lpMeasureItemStruct->itemHeight = m_nRowHeight;
    }
}
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);
}
// Gradient - 渐变系数,立体背景用,不用渐变设为0
void CListCtrlCl::SetHeaderBKColor(int R, int G, int B, int Gradient) //设置表头背景色
{
    m_Header.m_R = R;
    m_Header.m_G = G;
    m_Header.m_B = B;
    m_Header.m_Gradient = Gradient;
}

// 设置表头高度
void CListCtrlCl::SetHeaderHeight(float Height) //设置表头高度
{
    m_Header.m_Height = Height;
}
bool CListCtrlCl::FindColColor(int col,COLORREF &color) //查找列颜色
{
    int flag = 0;
    for (POSITION pos = m_ptrListCol.GetHeadPosition();pos!=NULL;)
    {
        stColor *pColor = (stColor*)m_ptrListCol.GetNext(pos);
        if (pColor->nCol==col)
        {
            flag = 1;
            color = pColor->rgb;
            break;
        }
    }
    if (1==flag)
    {
        return true;
    }
    return false;
}
bool CListCtrlCl::FindItemColor(int col,int row,COLORREF &color) //查找颜色
{
    int flag = 0;
    for (POSITION pos = m_ptrListItem.GetHeadPosition();pos!=NULL;)
    {
        stColor *pColor = (stColor*)m_ptrListItem.GetNext(pos);
        if (pColor->nCol==col&&pColor->nRow==row)
        {
            flag = 1;
            color = pColor->rgb;
            break;
        }
    }
    if (1==flag)
    {
        return true;
    }
    return false;
}
void CListCtrlCl::SetColColor(int col,COLORREF color) //设置列颜色
{
    stColor *pColor  = new stColor;
    pColor->nCol = col;
    pColor->rgb = color;
    m_ptrListCol.AddTail(pColor);
}
void CListCtrlCl::SetItemColor(int col,int row,COLORREF color) //设置格子颜色
{
    stColor *pColor  = new stColor;
    pColor->nCol = col;
    pColor->nRow = row;
    pColor->rgb = color;
    m_ptrListItem.AddTail(pColor);
}
void CListCtrlCl::SetRowHeigt(int nHeight) //高置行高
{
    m_nRowHeight = nHeight;

    CRect rcWin;
    GetWindowRect(&rcWin);
    WINDOWPOS wp;
    wp.hwnd = m_hWnd;
    wp.cx = rcWin.Width();
    wp.cy = rcWin.Height();
    wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;
    SendMessage(WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp);
}
void CListCtrlCl::SetHeaderFontHW(int nHeight,int nWith) //设置头部字体宽和高
{
    m_Header.m_fontHeight = nHeight;
    m_Header.m_fontWith = nWith;
}
void CListCtrlCl::SetHeaderTextColor(COLORREF color) //设置头部字体颜色
{
    m_Header.m_color = color;
}
BOOL CListCtrlCl::SetTextColor(COLORREF cr)  //设置字体颜色
{
    m_color = cr;
    return TRUE;
}
void CListCtrlCl::SetFontHW(int nHeight,int nWith) //设置字体高和宽
{
    m_fontHeight = nHeight;
    m_fontWith = nWith;
}
void CListCtrlCl::SetColTextColor(int col,COLORREF color)
{
    stColor *pColor = new stColor;
    pColor->nCol = col;
    pColor->rgb = color;
    m_colTextColor.AddTail(pColor);
}

bool CListCtrlCl::FindColTextColor(int col,COLORREF &color)
{
    int flag = 0;
    for (POSITION pos = m_colTextColor.GetHeadPosition();pos!=NULL;)
    {
        stColor *pColor = (stColor*)m_colTextColor.GetNext(pos);
        if (pColor->nCol==col)
        {
            flag = 1;
            color = pColor->rgb;
            break;
        }
    }
    if (1==flag)
    {
        return true;
    }
    return false;
}

bool CListCtrlCl::FindItemTextColor(int col,int row,COLORREF &color)
{
    int flag = 0;
    for (POSITION pos = m_ItemTextColor.GetHeadPosition();pos!=NULL;)
    {
        stColor *pColor = (stColor*)m_ItemTextColor.GetNext(pos);
        if (pColor->nCol==col&&pColor->nRow==row)
        {
            flag = 1;
            color = pColor->rgb;
            break;
        }
    }
    if (1==flag)
    {
        return true;
    }
    return false;
}

void CListCtrlCl::SetItemTextColor(int col,int row,COLORREF color)
{
    stColor *pColor = new stColor;
    pColor->nCol = col;
    pColor->nRow = row;
    pColor->rgb = color;
    m_ItemTextColor.AddTail(pColor);
}

void CListCtrlCl::SetItemFontHW(int col,int row,int nHeight,int nWidth)
{
    stFont *pFont=new stFont;
    pFont->nCol=col;
    pFont->nRow=row;
    pFont->nFontHeight=nHeight;
    pFont->nFontWidth=nWidth;
    m_ItemFontSize.AddTail(pFont);
}
bool CListCtrlCl::FindItemFontSize(int col,int row,int &height,int &width)
{
    int flag = 0;
    for (POSITION pos = m_ItemFontSize.GetHeadPosition();pos!=NULL;)
    {
        stFont *pFont = (stFont*)m_ItemFontSize.GetNext(pos);
        if (pFont->nCol==col&&pFont->nRow==row)
        {
            flag = 1;
            height=pFont->nFontHeight;
            width = pFont->nFontWidth;
            break;
        }
    }
    if (1==flag)
    {
        return true;
    }
    return false;
}

原理:要明白DrawItem是关键, 即绘每一个项,我们就在这里面搞事!CPtrList 看名字就知道叫指针列表,用来保存要修改的项,如果那项要修改,stFont与stColor就是我们要添加进去的指针,哪里要修改哪里就new一个,再addtail(添加到尾部),再写一个Find方法,某项有无被设置了颜色或者字体等属性,并在DrawItem里调用,找到就设置某项,基本原理即清楚了!附一张效果图:
这里写图片描述
不得不说还是相当的美观!

下载链接:http://download.csdn.net/detail/what951006/9805027
更多文章:http://blog.csdn.net/what951006?viewmode=list
Powered by:小乌龟在大乌龟背上~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152478.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 黑客养成秘籍_名媛修炼手册

    黑客养成秘籍_名媛修炼手册第一节、黑客的种类和行为以我的理解,“黑客”大体上应该分为“正”、“邪”两类,正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善,而邪派黑客则是通过各种黑客技能对系统进行攻击、入侵或者做其他一些有害于网络的事情,因为邪派黑客所从事的事情违背了《黑客守则》,所以他们真正的名字叫“骇客”(Cracker)而非“黑客”(Hacker),也就是我们平时经常听说的“黑客”(Cacker

  • mac navicat prenium 15.0.29 激活码[免费获取]

    (mac navicat prenium 15.0.29 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

  • 基于SpringBoot的JWT单点登录

    基于SpringBoot的JWT单点登录单点登录单点登录SSO,分布式架构中通过一次登录,就能访问多个相关的服务。快速入门首先引入Jwt依赖<!–JWT–><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4&

  • 如何学习PLC编程「建议收藏」

    如何学习PLC编程「建议收藏」plc是工业常用的自动化产品可编程控制器,它就相当于人类的大脑控制其他的器官,可编程控制器说白了就是个CPU,带几个模块,模块功能主要是,模拟量输入输出,数字量输入输出,其他功能计数模块。PLC在工业领域里扮演着重要的角色,作为一家企业或者个人应如何学习PLC呢?1.有一定的电工基础,掌握传感器、接近开关、编马器、气动元件等常用器件的使用及继电器控制原理。2.再学数制及数制转换,掌握二进制、八进制、十六进制、BCD码、ASCI码的概念。3.选择你所在地区流型的PLC品牌做为学习的机种,学会后可以更

    2022年10月19日
  • idea打包maven项目jar_tomcat部署maven项目

    idea打包maven项目jar_tomcat部署maven项目今天遇到一个需求,客户要求项目用maven管理,真是操碎了心,还好最终解决了,也在这里分享一下心得。首先选中要buide成maven的包——>右键——>addframeworksupport…,然后勾选maven即可;…

  • linux中top命令详解_top是什么命令

    linux中top命令详解_top是什么命令top命令Linuxtop命令用于实时显示process的动态。top参数详解第一行,任务队列信息**系统当前时间:**13:52:56**系统开机后到现在的总运行时间:**up66

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号