自定义MFC ClistCtrl控件的示例代码
来源:互联网 发布:网络的物理结构 编辑:程序博客网 时间:2024/06/01 10:30
Author: kagula@20150401
环境: vs2013sp1
自定义行高、字体、颜色。
如何引用的示例代码
初始化
BOOL CTestListCtrlDlg::OnInitDialog(){CDialogEx::OnInitDialog();// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE);// Set big iconSetIcon(m_hIcon, FALSE);// Set small icon{DWORD dwStyle = m_list.GetExtendedStyle(); //添加列表框的网格线!!!dwStyle |= LVS_EX_FULLROWSELECT; dwStyle |= LVS_EX_GRIDLINES; m_list.SetExtendedStyle(dwStyle);m_list.InsertColumn(0,L"编号",LVCFMT_LEFT,32); //添加列标题!!!! 这里的80,40,90用以设置列的宽度。!!!LVCFMT_LEFT用来设置对齐方式!!!m_list.InsertColumn(1,L"商品名称",LVCFMT_LEFT,256);m_list.InsertColumn(2,L"颜色",LVCFMT_CENTER,32);m_list.InsertColumn(3,L"尺码",LVCFMT_CENTER,32);m_list.InsertColumn(4,L"数量",LVCFMT_CENTER,32);InitList();}//m_list.SetFontSelf(15,L"黑体");//设定表体中的字体int nRow = m_list.InsertItem(0,L"");m_list.SetItemText(nRow,0,L"编号");m_list.SetItemText(nRow,1,L"商品名称");m_list.SetItemText(nRow,2,L"颜色");m_list.SetItemText(nRow,3,L"尺码");m_list.SetItemText(nRow,4,L"数量");nRow = m_list.InsertItem(1,L"");m_list.SetItemText(nRow,0,L"编号2");m_list.SetItemText(nRow,1,L"商品名称2");m_list.SetItemText(nRow,2,L"颜色2");m_list.SetItemText(nRow,3,L"尺码2");m_list.SetItemText(nRow,4,L"数量2");return TRUE; // return TRUE unless you set the focus to a control}
void CRFI_CHECK_DLG::InitList(){static bool bFirst = true;if (bFirst){bFirst=FALSE;CHeaderCtrl *pHeader = NULL; pHeader = m_list.GetHeaderCtrl(); if(pHeader) { TRACE("header item count:%d/n", pHeader->GetItemCount()); int iColumn=pHeader->GetItemCount(); for (int i=0; i<iColumn; i++) { HDITEM hdItem; BOOL bResult = FALSE; bResult=pHeader->GetItem(i, &hdItem); //直接在OnInitDialog中调用,程序会挂掉。hdItem.fmt |= HDF_OWNERDRAW; bResult=pHeader->SetItem(i, &hdItem); } //pHeader->Invalidate();}}}
缩放
void CTestListCtrlDlg::OnSize(UINT nType, int cx, int cy){CDialogEx::OnSize(nType, cx, cy);CRect rectClient;GetClientRect(&rectClient);{int left = 0;int top = 39;int columnWidth = 52;int widthProductName = (rectClient.Width()-columnWidth*4)<128?128:(rectClient.Width()-columnWidth*4);CRect rect(left,top,left+rectClient.Width(),rectClient.Height()-64);GetDlgItem(IDC_LIST2)->MoveWindow(&rect);m_list.SetColumnWidth(0,columnWidth);m_list.SetColumnWidth(1,widthProductName);m_list.SetColumnWidth(2,columnWidth);m_list.SetColumnWidth(3,columnWidth);m_list.SetColumnWidth(4,columnWidth);}}
依赖文件
C8637ListCtrl.h
#pragma once#include "C8637HeaderCtrl.h"// C8637ListCtrlclass C8637ListCtrl : public CListCtrl{DECLARE_DYNAMIC(C8637ListCtrl)public:C8637ListCtrl();virtual ~C8637ListCtrl();C8637HeaderCtrl m_headerCtrl;protected:DECLARE_MESSAGE_MAP()virtual void PreSubclassWindow();public:CFont* m_font;void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);void SetFontSelf(int nHeight, LPCTSTR lpszFacename);afx_msg void OnNcPaint();afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct);virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);};
C8637ListCtrl.cpp
// C8637ListCtrl.cpp : implementation file//#include "stdafx.h"#include "C8637ListCtrl.h"/*[1]《如何重绘CListCtrl的表头》http://qiusuoge.com/9200.html[2]《CListCtrl的Report风格自绘》http://jingyan.baidu.com/article/5bbb5a1b38af1113eaa17910.html[3]《CListCtrl插入多列(REPORT样式)》http://blog.sina.com.cn/s/blog_6392417a0100gxmj.html*/// C8637ListCtrlIMPLEMENT_DYNAMIC(C8637ListCtrl, CListCtrl)C8637ListCtrl::C8637ListCtrl(){m_font = nullptr;}C8637ListCtrl::~C8637ListCtrl(){if (m_font != nullptr){delete m_font;m_font = nullptr;}}BEGIN_MESSAGE_MAP(C8637ListCtrl, CListCtrl)ON_WM_NCPAINT()ON_WM_MEASUREITEM_REFLECT()END_MESSAGE_MAP()// C8637ListCtrl message handlersvoid C8637ListCtrl::PreSubclassWindow(){//use our custom CHeaderCtrl as long as there //is a headerctrl object to subclass if(GetHeaderCtrl()) { m_headerCtrl.SubclassWindow(GetHeaderCtrl()->m_hWnd); }CRect rcwin; GetWindowRect(rcwin); WINDOWPOS wp; wp.hwnd=GetSafeHwnd(); wp.cx=rcwin.Width(); wp.cy=rcwin.Height(); wp.flags=SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOOWNERZORDER|SWP_NOZORDER; SendMessage(WM_WINDOWPOSCHANGED,0,(LPARAM)&wp); CListCtrl::PreSubclassWindow();}void C8637ListCtrl::OnNcPaint(){// TODO: Add your message handler code here// Do not call CListCtrl::OnNcPaint() for painting messages}void C8637ListCtrl::MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct ){lpMeasureItemStruct->itemHeight = 28;}void C8637ListCtrl::SetFontSelf( int nHeight, LPCTSTR lpszFacename ){//先删除原有字体 if(m_font != NULL) delete m_font; m_font = new CFont; //创建字体 m_font->CreateFont( nHeight, // nHeight 0, // nWidth 0, // nEscapement 0, // nOrientation FW_NORMAL, // nWeight FALSE, // bItalic FALSE, // bUnderline 0, // cStrikeOut ANSI_CHARSET, // nCharSet OUT_DEFAULT_PRECIS, // nOutPrecision CLIP_DEFAULT_PRECIS, // nClipPrecision DEFAULT_QUALITY, // nQuality DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily lpszFacename); // lpszFacename //设置字体SetFont(m_font, TRUE); }void C8637ListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){ASSERT(lpDrawItemStruct->CtlType == ODT_LISTVIEW); CDC dc; dc.Attach(lpDrawItemStruct->hDC); ASSERT(NULL != dc.GetSafeHdc()); // Save these value to restore them when done drawing. COLORREF crOldTextColor = dc.GetTextColor(); COLORREF crOldBkColor = dc.GetBkColor(); // If this item is selected, set the background color // and the text color to appropriate values. Also, erase // rect by filling it with the background color. if ((lpDrawItemStruct->itemAction | ODA_SELECT) && (lpDrawItemStruct->itemState & ODS_SELECTED)) { dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT)); dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT)); dc.FillSolidRect(&lpDrawItemStruct->rcItem, ::GetSysColor(COLOR_HIGHLIGHT)); } else { if(lpDrawItemStruct->itemID%2) dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(255,255,250)); else dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(255,255,255)); } // If this item has the focus, draw a red frame around the // item's rect. if ((lpDrawItemStruct->itemAction | ODA_FOCUS) && (lpDrawItemStruct->itemState & ODS_FOCUS)) { CBrush br(RGB(0, 0, 128)); dc.FrameRect(&lpDrawItemStruct->rcItem, &br); } // Draw the text. CString strText(_T("")); CRect rcItem; for(int i=0; i<GetHeaderCtrl()->GetItemCount(); i++) { strText = GetItemText(lpDrawItemStruct->itemID, i); GetSubItemRect(lpDrawItemStruct->itemID, i, LVIR_LABEL, rcItem); rcItem.left += 5; if (i<2){dc.DrawText( strText, strText.GetLength(), &rcItem, DT_LEFT|DT_SINGLELINE|DT_VCENTER); }else{dc.DrawText( strText, strText.GetLength(), &rcItem, DT_CENTER|DT_SINGLELINE|DT_VCENTER); }} // Reset the background color and the text color back to their // original values. dc.SetTextColor(crOldTextColor); dc.SetBkColor(crOldBkColor); dc.Detach(); }
C8637HeaderCtrl.h
#pragma once// C8637HeaderCtrlclass C8637HeaderCtrl : public CHeaderCtrl{DECLARE_DYNAMIC(C8637HeaderCtrl)public:C8637HeaderCtrl();virtual ~C8637HeaderCtrl();protected:DECLARE_MESSAGE_MAP()public:LRESULT OnLayout( WPARAM wParam, LPARAM lParam);virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);};
C8637HeaderCtrl.cpp
// C8637HeaderCtrl.cpp : implementation file//#include "stdafx.h"#include "C8637HeaderCtrl.h"// C8637HeaderCtrlIMPLEMENT_DYNAMIC(C8637HeaderCtrl, CHeaderCtrl)C8637HeaderCtrl::C8637HeaderCtrl(){}C8637HeaderCtrl::~C8637HeaderCtrl(){}BEGIN_MESSAGE_MAP(C8637HeaderCtrl, CHeaderCtrl)ON_MESSAGE(HDM_LAYOUT, OnLayout)END_MESSAGE_MAP()// C8637HeaderCtrl message handlersvoid C8637HeaderCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){ASSERT(lpDrawItemStruct-> CtlType == ODT_HEADER); HDITEM hdi; TCHAR lpBuffer[256]; hdi.mask = HDI_TEXT; hdi.pszText = lpBuffer; hdi.cchTextMax = 256; GetItem(lpDrawItemStruct-> itemID,&hdi); CDC* pDC;CPen pen, *pOldPen;pDC = CDC::FromHandle(lpDrawItemStruct-> hDC); pDC-> SetTextColor(RGB(0,0,0)); pDC-> SetBkColor(RGB(235,239,245)); CBrush brush; brush.CreateSolidBrush(RGB(235,239,245));CRect rect = lpDrawItemStruct-> rcItem; //THIS FONT IS ONLY FOR DRAWING AS LONG AS WE DON'T DO A SetFont(...) CBrush *pOldBrush=pDC-> SelectObject(&brush); rect.top-=0,rect.right+=1;pDC-> FillRect(&rect,&brush);pen.CreatePen(PS_SOLID, 1, RGB(220,220,220));pOldPen = pDC->SelectObject(&pen);pDC->Rectangle(&rect);//Draw borderpDC->SelectObject(pOldPen);pDC-> SelectObject(pOldBrush); pDC-> SelectObject(GetStockObject(DEFAULT_GUI_FONT));//DRAW THE TEXT CFont font;font.CreatePointFont(116,L"黑体",pDC);CFont *pFont = pDC->SelectObject(&font);lpDrawItemStruct-> rcItem.top += 8; ::DrawText(lpDrawItemStruct->hDC,lpBuffer, wcslen(lpBuffer), &lpDrawItemStruct->rcItem,DT_VCENTER|DT_CENTER);pDC->SelectObject(pFont);//pDC-> SelectStockObject(SYSTEM_FONT);}LRESULT C8637HeaderCtrl::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 = 32;pwpos->cy = nHeight; prc->top = nHeight; return lResult; }
0 0
- 自定义MFC ClistCtrl控件的示例代码
- CListCtrl控件Report属性下的GRIDLINE示例代码
- VC/MFC中 CListCtrl控件的使用方法
- MFC中CListCtrl控件的用法
- MFC CLIstCtrl控件的高度设置
- MFC CListCtrl控件的基本使用
- MFC控件应用--CListCtrl
- MFC控件--CListCtrl
- vc++ MFC-CListCtrl控件
- MFC控件之CListCtrl
- MFC--CListCtrl控件
- MFC 自定义CListCtrl
- CListCtrl常用代码示例
- 代码触发clistctrl控件的NM_CLICK事件
- MFC中控件的大小和位置自定义代码
- MFC中的列表控件CListCtrl
- MFC 列表控件CListCtrl详解
- MFC中的列表控件CListCtrl
- 升级到struts-2.3.14.3之后涉及的改动以及ActionContextCleanUp,StrutsFilter详解
- p2p打洞stun的原理
- try catch throw用法
- String,PChar,PByte,Array of Char,Array of Byte 转换
- Java虚拟机学习 - 查看JVM参数及值的命令行工具
- 自定义MFC ClistCtrl控件的示例代码
- Android-IM架构设计
- C++中嵌入python入门2
- CentOS6.5中Web环境搭建
- 变量的作用域
- 建立yum 仓库
- kmalloc、vmalloc、malloc的区别
- ndroid进阶:ListView深入学习 choiceMode使用及自定义Adapter
- Java虚拟机学习 - JDK可视化监控工具