原文链接

MFC Listctrl 不支持单元格颜色设置,以及单击其中某一单元格时高亮显示,要想达成自己的目的,就只能对其重绘。

关于单元格中按钮的添加,说一下思路,首先要重写CButton类,将其单击事件接口进行重写,这里就是发送自定义消息,到主窗口界面进行响应,然后在要生添加按钮的单元格中生成新的按钮,加入链表中进行存放,同时记录对应的单元格的行列信息,然后在单元格进行重绘时,改变button 位置即可,有个问题就是当listcontrol的大小发生变化时,因为重绘的原因,按钮的位置移动会有明显痕迹,暂时没想出什么好的办法解决,先这么用着吧。

其中listcontrol的单元格颜色,字体设置,部分来源网络,如有侵权,联系删除。

CListCtrlBtn.h

#define  WM_BNLOOK_CLICK  WM_USER + 100
#define  WM_BNCHECK_CLICK  WM_USER + 101class CListCtrlBtn :public CButton
{DECLARE_DYNAMIC(CListCtrlBtn)
public:CListCtrlBtn();CListCtrlBtn(int type, int nItem, int nSubItem, CRect rect, HWND hParent);~CListCtrlBtn();
protected:DECLARE_MESSAGE_MAP()
public:virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);afx_msg void OnBnClicked();int m_inItem;int m_inSubItem;CRect m_rect;HWND m_hParent;int  m_type;//按钮类型 用于处理消息 区分按钮信息BOOL bEnable;
};

CListCtrlBtn.cpp

#include "stdafx.h"
#include "ListCtrlBtn.h"IMPLEMENT_DYNAMIC(CListCtrlBtn, CButton)
CListCtrlBtn::CListCtrlBtn()
{
}CListCtrlBtn::CListCtrlBtn(int type,int nItem, int nSubItem, CRect rect, HWND hParent)    //-
{m_type = type;m_inItem = nItem;m_inSubItem = nSubItem;m_rect = rect;m_hParent = hParent;bEnable = TRUE;
}CListCtrlBtn::~CListCtrlBtn()
{
}BEGIN_MESSAGE_MAP(CListCtrlBtn, CButton)ON_CONTROL_REFLECT(BN_CLICKED, &CListCtrlBtn::OnBnClicked)
END_MESSAGE_MAP()void CListCtrlBtn::OnBnClicked()
{// TODO: 在此添加控件通知处理程序代码if(m_type == 0)//表示查看::SendMessage(m_hParent, WM_BNLOOK_CLICK, m_inItem, m_inSubItem);if (m_type == 1)//表示巡检::SendMessage(m_hParent, WM_BNCHECK_CLICK, m_inItem, m_inSubItem);
}
void CListCtrlBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{ASSERT(lpDrawItemStruct);//以下为常态按钮绘制//TRACE("* Drawing: %08x\n", lpDrawItemStruct->itemState);CString sCaption;CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);    // get device contextRECT r = lpDrawItemStruct->rcItem;                    // context rectangleint cx = r.right - r.left;                        // get widthint cy = r.bottom - r.top;                        // get height// get text box positionRECT tr = { r.left + 2, r.top, r.right - 2, r.bottom };GetWindowText(sCaption);                            // get button textpDC->SetBkMode(TRANSPARENT);// Select the correct skin if (lpDrawItemStruct->itemState & ODS_DISABLED)//鼠标禁用{    // no skin selected for disabled state -> standard button pDC->FillSolidRect(&r, GetSysColor(COLOR_BTNFACE));pDC->SetTextColor(GetSysColor(COLOR_GRAYTEXT));//)m_TextColor灰色字体  文字偏移OffsetRect(&tr, -1, -1);pDC->DrawText(sCaption, &tr, DT_SINGLELINE | DT_VCENTER | DT_CENTER);}else{                                        // SELECTED (DOWN) BUTTONif ((lpDrawItemStruct->itemState & ODS_SELECTED) )//当按下按钮时的处理{// no skin selected for selected state -> standard buttonRGB(255,152,0)pDC->FillSolidRect(&r,  RGB(39,169,241));//GetSysColor(COLOR_BTNFACE)}else{                                            // DEFAULT BUTTONpDC->FillSolidRect(&r,GetSysColor(COLOR_BTNFACE));//}// paint the enabled button text//pDC->SetTextColor(RGB(255,255,255));CFont nFont, *nOldFont;nFont.CreatePointFont(90, _T("微软雅黑"));//创建字体 nOldFont = pDC->SelectObject(&nFont);DrawText(lpDrawItemStruct->hDC, sCaption, sCaption.GetLength(), &tr, DT_SINGLELINE | DT_VCENTER | DT_CENTER);pDC->SelectStockObject(SYSTEM_FONT);//pDC->DrawText(sCaption, &tr, DT_SINGLELINE | DT_VCENTER | DT_CENTER);}
}

如上 对按钮的按键操作进行了重绘,改变了按钮的正常颜色,按下的事件颜色,以及字体。

CHeaderCtrlCl.h   (表头设置)

#pragma onceclass CHeaderCtrlCl : public CHeaderCtrl
{DECLARE_DYNAMIC(CHeaderCtrlCl)public:CHeaderCtrlCl();virtual ~CHeaderCtrlCl();protected:DECLARE_MESSAGE_MAP()
public:afx_msg void OnPaint();CStringArray m_HChar;CString m_Format; //表示对齐类型的整型数组,0表示左对齐,1表示中间对齐,2表示右对齐
public:int m_R;int m_G;int m_B;int m_Gradient;    // 画立体背景,渐变系数float m_Height;  //表头高度,这是倍数,int m_fontHeight; //字体高度int m_fontWith;   //字体宽度COLORREF m_color;LRESULT OnLayout( WPARAM wParam, LPARAM lParam );
};

CHeaderCtrlCl.cpp

// HeaderCtrlCl.cpp : 实现文件
//#include "stdafx.h"
#include "HeaderCtrlCl.h"// CHeaderCtrlClIMPLEMENT_DYNAMIC(CHeaderCtrlCl, CHeaderCtrl)CHeaderCtrlCl::CHeaderCtrlCl()
: m_R(171)
, m_G(199)
, m_B(235)
, m_Gradient(8)
{m_Format = "";m_Height = 1;m_fontHeight = 15;m_fontWith = 0;m_color = RGB(0,0,0);
}CHeaderCtrlCl::~CHeaderCtrlCl()
{
}BEGIN_MESSAGE_MAP(CHeaderCtrlCl, CHeaderCtrl)ON_WM_PAINT()ON_MESSAGE(HDM_LAYOUT, OnLayout)
END_MESSAGE_MAP()// CHeaderCtrlCl 消息处理程序void CHeaderCtrlCl::OnPaint()
{CPaintDC dc(this); // device context for painting// TODO: 在此处添加消息处理程序代码// 不为绘图消息调用 CHeaderCtrl::OnPaint()int nItem; nItem = GetItemCount();//得到有几个单元 for(int i = 0; i<nItem;i ++) { CRect tRect;GetItemRect(i,&tRect);//得到Item的尺寸int R = m_R,G = m_G,B = m_B;CRect nRect(tRect);//拷贝尺寸到新的容器中 nRect.left++;//留出分割线的地方 CRgn rgn1;RECT tr = { nRect.left-1, nRect.top, nRect.right, nRect.bottom};rgn1.CreateRectRgnIndirect(&tr);//内嵌窗体颜色绘制CBrush brush1(RGB(R, G, B));dc.FillRgn(&rgn1, &brush1);//内嵌窗体边框绘制CBrush brush2(RGB(209, 209, 209));dc.FrameRgn(&rgn1, &brush2, 1, 1);brush1.DeleteObject(); //释放画刷brush2.DeleteObject(); //释放画刷 绘制立体背景 //for(int j = tRect.top;j<=tRect.bottom;j++) //{ //    nRect.bottom = nRect.top+1; //    CBrush _brush; //    _brush.CreateSolidBrush(RGB(R,G,B));//创建画刷 //    dc.FillRect(&nRect,&_brush); //填充背景 //    _brush.DeleteObject(); //释放画刷 //    R-=m_Gradient;G-=m_Gradient;B-=m_Gradient;//    if (R<0)R = 0;//    if (G<0)G = 0;//    if (B<0)B= 0;//    nRect.top = nRect.bottom; //} dc.SetBkMode(TRANSPARENT);CFont nFont ,* nOldFont; //dc.SetTextColor(RGB(250,50,50)); dc.SetTextColor(m_color);nFont.CreateFont(m_fontHeight,m_fontWith,0,0,0,FALSE,FALSE,0,0,0,0,0,0,_TEXT("黑体"));//创建字体 nOldFont = dc.SelectObject(&nFont);UINT nFormat = 1;if (m_Format[i]=='0'){nFormat = DT_LEFT;tRect.left+=3;}else if (m_Format[i]=='1'){nFormat = DT_CENTER;}else if (m_Format[i]=='2'){nFormat = DT_RIGHT;tRect.right-=3;}TEXTMETRIC metric;dc.GetTextMetrics(&metric);int ofst = 0;ofst = tRect.Height() - metric.tmHeight;tRect.OffsetRect(0,ofst/2);dc.DrawText(m_HChar[i],&tRect,nFormat);dc.SelectObject(nOldFont); nFont.DeleteObject(); //释放字体 } 画头部剩余部分 不绘制//CRect rtRect;//CRect clientRect;//GetItemRect(nItem - 1,rtRect);//GetClientRect(clientRect);//rtRect.left = rtRect.right+1;//rtRect.right = clientRect.right;//int R = m_R,G = m_G,B = m_B;//CRect nRect(rtRect);绘制立体背景 //for(int j = rtRect.top;j<=rtRect.bottom;j++) //{ //    nRect.bottom = nRect.top+1; //    CBrush _brush; //    _brush.CreateSolidBrush(RGB(R,G,B));//创建画刷 //    dc.FillRect(&nRect,&_brush); //填充背景 //    _brush.DeleteObject(); //释放画刷 //    R-=m_Gradient;G-=m_Gradient;B-=m_Gradient;//    if (R<0)R = 0;//    if (G<0)G = 0;//    if (B<0)B= 0;//    nRect.top = nRect.bottom; //}
}
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; //表头高度为原来1.5倍,如果要动态修改表头高度的话,将1.5设成一个全局变量 int nHeight = (int)(pwpos->cy * m_Height);pwpos->cy = nHeight; prc->top = nHeight; return lResult;
}

CListCtrlCl.h

#pragma once
#include "HeaderCtrlCl.h"
#include "ListCtrlBtn.h"
#include <vector>
using namespace std;typedef struct BTNGROUP
{CListCtrlBtn*m_Btn[2];BTNGROUP(){m_Btn[0] = NULL;m_Btn[1] = NULL;}
}m_BtnGroup;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);
public:// 行高int m_nRowHeight;int InsertColumn(int nCol, LPCTSTR lpszColumnHeading,int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1,bool nCreatBtn = false);//是否创建按钮
public:// Gradient - 渐变系数,立体背景用,不用渐变设为0void 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; //保存单元格字体颜色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);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);  //设置字体的高和宽
public:// 字体高度int m_fontHeight;
public:// 字体宽度int m_fontWith;
public:int m_nCreatBtnCol;public://用于按钮添加vector<m_BtnGroup> m_BtVect;void SetItemBtn(int nItem, int nSubItem, HWND hMain);
};

CListCtrlCl.cpp

// ListCtrlCl.cpp : 实现文件
//#include "stdafx.h"
#include "ListCtrlCl.h"struct stColor
{int nRow;int nCol;COLORREF rgb;
};
// CListCtrlClIMPLEMENT_DYNAMIC(CListCtrlCl, CListCtrl)CListCtrlCl::CListCtrlCl()
: m_nRowHeight(0)
, m_fontHeight(12)
, m_fontWith(0)
{m_color = RGB(0,0,0);
}CListCtrlCl::~CListCtrlCl()
{for each (auto var in m_BtVect)//内存释放清理{var.m_Btn[0]->DestroyWindow();delete var.m_Btn[0];var.m_Btn[1]->DestroyWindow();delete var.m_Btn[1];}m_BtVect.clear();vector<m_BtnGroup>().swap(m_BtVect);
}BEGIN_MESSAGE_MAP(CListCtrlCl, CListCtrl)ON_WM_MEASUREITEM()ON_WM_MEASUREITEM_REFLECT()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 itemGetColumn(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;CRgn rgn1;RECT tr = { rcItem.left - 1, rcItem.top, rcItem.right, rcItem.bottom };rgn1.CreateRectRgnIndirect(&tr);/*if (nCol==0){rcTemp.left -=2;}*/if (m_nCreatBtnCol == lvi.iSubItem)//按钮位置移动{int cx = (rcTemp.left + rcTemp.right)/2;int cy = rcTemp.top+5;m_BtVect[lvi.iItem].m_Btn[0]->MoveWindow(cx - 45, cy, 40, 20);m_BtVect[lvi.iItem].m_Btn[1]->MoveWindow(cx + 5, cy, 40, 20);}if ( lpDrawItemStruct->itemState & ODS_SELECTED ){COLORREF color = GetBkColor(); //获取背景颜色//pDC->FillSolidRect(rcTemp,color);//内嵌窗体颜色绘制CBrush brush1(color);pDC->FillRgn(&rgn1, &brush1);//内嵌窗体边框绘制CBrush brush2(RGB(209, 209, 209));pDC->FrameRgn(&rgn1, &brush2, 1, 1);brush1.DeleteObject();brush2.DeleteObject();/*    //内嵌窗体颜色绘制  高亮处理CBrush brush1(GetSysColor(COLOR_HIGHLIGHT));pDC->FillRgn(&rgn1, &brush1);//内嵌窗体边框绘制CBrush brush2(RGB(209, 209, 209));pDC->FrameRgn(&rgn1, &brush2, 1, 1);brush1.DeleteObject();brush2.DeleteObject();//pDC->FillSolidRect(&rcTemp, GetSysColor(COLOR_HIGHLIGHT)) ;pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));    */}else{COLORREF color = GetBkColor(); //获取背景颜色//pDC->FillSolidRect(rcTemp,color);//内嵌窗体颜色绘制CBrush brush1(color);pDC->FillRgn(&rgn1, &brush1);//内嵌窗体边框绘制CBrush brush2(RGB(209, 209, 209));pDC->FrameRgn(&rgn1, &brush2, 1, 1);brush1.DeleteObject();brush2.DeleteObject();if (FindColColor(nCol,color))//获取单元行颜色{CBrush brush1(color);pDC->FillRgn(&rgn1, &brush1);//内嵌窗体边框绘制CBrush brush2(RGB(209, 209, 209));pDC->FrameRgn(&rgn1, &brush2, 1, 1);brush1.DeleteObject();brush2.DeleteObject();;}if (FindItemColor(nCol,lpDrawItemStruct->itemID,color))//获取单元格颜色{CBrush brush1(color);pDC->FillRgn(&rgn1, &brush1);//内嵌窗体边框绘制CBrush brush2(RGB(209, 209, 209));pDC->FrameRgn(&rgn1, &brush2, 1, 1);brush1.DeleteObject();brush2.DeleteObject();;}//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;}TEXTMETRIC metric;pDC->GetTextMetrics(&metric);int ofst;ofst = rcItem.Height() - metric.tmHeight;rcItem.OffsetRect(0,ofst/2);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; nFont.CreateFont(m_fontHeight,m_fontWith,0,0,0,FALSE,FALSE,0,0,0,0,0,0,_T("宋体"));//创建字体 nOldFont = pDC->SelectObject(&nFont);DrawText(lpDrawItemStruct->hDC, lpBuffer, _tcslen(lpBuffer), &rcItem, uFormat);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 */,bool nCreatBtn)
{m_Header.m_HChar.Add(lpszColumnHeading);if (nFormat==LVCFMT_LEFT){m_Header.m_Format = m_Header.m_Format + L"0";}else if (nFormat==LVCFMT_CENTER){m_Header.m_Format = m_Header.m_Format + L"1";}else if (nFormat==LVCFMT_RIGHT){m_Header.m_Format = m_Header.m_Format + L"2";}else{m_Header.m_Format = m_Header.m_Format + L"1";}if (nCreatBtn){m_nCreatBtnCol = nCol;//记录创建按钮的列}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);
}static int m_StaticBtId = 0;
void CListCtrlCl::SetItemBtn(int nItem, int nSubItem, HWND hMain)
{CRect rect;GetSubItemRect(nItem, nSubItem, LVIR_BOUNDS, rect);DWORD dwStyle = WS_CHILD | WS_VISIBLE | BS_OWNERDRAW;m_BtnGroup m_Group;m_Group.m_Btn[0] = new CListCtrlBtn(0,nItem, nSubItem, rect, hMain);m_Group.m_Btn[0]->Create(_T("查看"), dwStyle, rect, this, m_StaticBtId);m_StaticBtId++;m_Group.m_Btn[1] = new CListCtrlBtn(1,nItem, nSubItem, rect, hMain);m_Group.m_Btn[1]->Create(_T("巡检"), dwStyle, rect, this, m_StaticBtId);m_BtVect.push_back(m_Group);return;}/*    //获取选中行列DWORD dwPos = GetMessagePos();CPoint point(LOWORD(dwPos), HIWORD(dwPos));this->ScreenToClient(&point);LVHITTESTINFO lvinfo;lvinfo.pt = point;lvinfo.flags = LVHT_ABOVE;int nColSelected, nRowSelected;int nItem = SubItemHitTest(&lvinfo);if (nItem != -1){nColSelected = lvinfo.iItem; //行 nRowSelected = lvinfo.iSubItem; //列}*/

使用:

DWORD dwStyle = m_list.GetExtendedStyle();//dwStyle |= LVS_EX_CHECKBOXES;// LVS_EX_FULLROWSELECT;            //选中某行使整行高亮(只适用与report风格的listctrl)//dwStyle |= LVS_EX_GRIDLINES;                //网格线(只适用与report风格的listctrl)m_list.SetExtendedStyle(dwStyle);m_list.SetBkColor(RGB(255, 255, 255));        //设置背景色m_list.SetRowHeigt(30);               //设置行高度m_list.SetHeaderHeight(1.5);          //设置头部高度m_list.SetHeaderFontHW(16, 0);         //设置头部字体高度,和宽度,0表示缺省,自适应 m_list.SetHeaderTextColor(RGB(0, 0, 0)); //设置头部字体颜色m_list.SetTextColor(RGB(0, 0, 0));  //设置文本颜色m_list.SetHeaderBKColor(255, 255, 255, 0); //设置头部背景色m_list.SetFontHW(14, 0);               //设置字体高度,和宽度,0表示缺省宽度m_list.GetHeaderCtrl()->EnableWindow(0); //禁止表头拖动m_list.InsertColumn(0, _T("编号"), LVCFMT_CENTER, 80);m_list.InsertColumn(1, _T("设备名称"), LVCFMT_CENTER, 80);m_list.InsertColumn(2, _T("区域"), LVCFMT_CENTER, 80);m_list.InsertColumn(3, _T("上次巡检时间"), LVCFMT_CENTER, 80);m_list.InsertColumn(4, _T("巡检结果"), LVCFMT_CENTER,80);m_list.InsertColumn(5, _T("操作"), LVCFMT_CENTER, 80,-1,true);

注意设置 Owner Drow Fixed 为TRUE ,Border 为 false ,以及不要设置网格线风格,否则影响整体效果。

效果图:


————————————————
版权声明:本文为CSDN博主「若歌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36568418/article/details/102922111

MFC-CListCtrl重绘,添加按钮到单元格相关推荐

  1. MFC 之 重绘按键Cbutton

    上次我们学习了如何美化对话框的界面,这次我们为上次的对话框添加两个按钮,一个是关闭按钮,另一个是最小化按钮,好,现在我们先看一下效果: 是不是很难看,因为我们的对话框美化了,所以我们的按钮也要美化,因 ...

  2. VC的MFC中重绘函数的使用总结(整理)

    原文网址:http://www.cnblogs.com/x8023z/archive/2008/12/09/mfc33.html 在刷新窗口时经常要调用重绘函数 MFC提供了三个函数用于窗口重绘 In ...

  3. mfc ListControl 重绘网格线

    .h文件 //网格线设置 [yal 2013.10.08]  int        m_nGridStyle;      //风格 PS_DASH,PS_SOLID,...  COLORREF   m ...

  4. swift 拖动按钮_Swift - 单元格滑动按钮库SwipeCellKit使用详解1(基本用法)

    在之前的两篇文章中我分别介绍了如何使用 iOS8和 iOS11提供的相关代理方法,来实现 tableView单元格滑动事件按钮: 但它们局限性还是比较大的,前者只能实现尾部按钮,且按钮只能使用文字无法 ...

  5. android标题栏添加按钮_[办公小技巧]Excel 添加页码,自定义和指定单元格页码添加...

    EXCEL在指定的单元格中插入页码 1. CTRL +F3 2. 选择新建 3. 输入名称:"纵当页" 输入引用位置:=IF(ISNA(MATCH(ROW(),GET.Docume ...

  6. 重绘和回流----降低回流减少性能影响

    回流和重绘 原创 2016年02月29日 14:49:02 标签: 布局 / dom 640 回流与重绘 1. 当render tree中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重 ...

  7. 【转】高性能WEB开发系列之重绘与回流

    原文转载:http://www.cnblogs.com/wangzhichao/archive/2011/05/16/2047633.html 页面呈现流程 在讨论页面重绘.回流之前.需要对页面的呈现 ...

  8. 页面重绘和回流以及优化

    在讨论页面重绘.回流之前.需要对页面的呈现流程有些了解,页面是怎么把html结合css等显示到浏览器上的,下面的流程图显示了浏览器对页面的呈现的处理流程.可能不同的浏览器略微会有些不同.但基本上都是类 ...

  9. E9表单按钮置灰功能与单元格自定义属性说明

    1:表单单元格自定义按钮配置说明 1.1:选中需要设置按钮的单元格 1.2:设置单元格自定义属性 鼠标右键====>设置自定义属性====>id.name.class 如下图: 1.3:插 ...

最新文章

  1. python中组合框_PyQt 组合框
  2. 《Unity虚拟现实开发实战》——第1章,第1.8节小结
  3. 使用SAP WebIDE消费API Portal里创建的API时的错误消息
  4. 计算机教室 使用计划,计算机室教学计划
  5. Netty学习总结(2)——Netty的高性能架构之道
  6. [转载] python下求语数总分和平均值_R和python语言如何求平均值,中位数和众数
  7. pxe服务器 安装系统,通过PXE网络安装windows系统
  8. 常用计量单位及其换算
  9. linux怎么进入自己添加的软盘,linux – 创建没有mount的虚拟软盘映像?
  10. matlab激光扩束总结,激光扩束系统设计(推荐).doc
  11. Ecshop模板开发(二十三):手机版显示商城
  12. 查询SCI期刊分区及影响因子
  13. 桌面虚拟化 | 同VDI扭打,IDV要如何补齐短板?
  14. XRouter 一个轻量级的Android路由框架,基于ARouter上进行改良,优化Fragment的使用,可结合XPage使用
  15. [Eclipse手册]设置pom.xml打开方式
  16. IO流的节点流和处理流(缓冲流)and ZIP流使用
  17. 基于Python实现的孤立词语音识别系统
  18. 敏涵控股集团贵族私人定制:一场探索美学的旅程
  19. 鸿蒙之始 那个软件能播,智能电视安装这几款直播软件就够了,全是HD画质,还支持回看!...
  20. shell root切换oracle_细说Shell脚本(一)

热门文章

  1. JQuery之append和appendTo的区别,还有js中的appendChild用法
  2. Apriori算法与python实现
  3. uclinux系统简介
  4. C++ typename的起源与用法
  5. 如何快速、科学的配置GO语言编译Android环境
  6. Redis常用命令和操作
  7. 10月18---10月20号第一周总结
  8. JS Boolean 初始值
  9. 利用沪江小D做个词典小工具
  10. 亲测好用的6个临时邮箱推荐