自绘ListCtrl -- 设置行高

以下是通过重载DramItem()方法来实现自绘,

故需要设置ListCtrl控件属性"Owner Draw Fixed"为TRUE,"Owner Data"为FALSE(默认为FLASE);

1.  准备工作

(1).新建一个MFC类CMyListCtrl,其基类为CListCtrl,

(2).将ListCtrl控件属性"Owner Draw Fixed"设置为TRUE,"Owner Data"设置为FALSE(默认为FLASE);

(3).在ListCtrl控件所在对话框类声明中,修改控件变量声明为CMyListCtrl m_List;

(4).在MyListCtrl.h文件里,添加变量int m_nRowHeight;

2. 手动添加消息宏ON_WM_MEASUREITEM_REFLECT(),并添加下面的函数,实现修改行高

void CMyListCtrl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
	if (m_nRowHeight>0)
	{
		lpMeasureItemStruct->itemHeight = m_nRowHeight;
	}
}

3. 手动添加消息宏ON_WM_MEASUREITEM,响应消息处理OnMeasureItem()

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

4. 添加成员变量int m_nRowHeight,并且添加对外修改接口

void CMyListCtrl::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);
}

5. 手动添加消息宏ON_WM_DRAWITEM(),重载DrawItem()重画列表控件

void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	LVITEM lvi = {0};
	lvi.mask = LVIF_STATE;//|LVIF_IMAGE;
	lvi.stateMask = LVIS_FOCUSED | LVIS_SELECTED ;
	lvi.iItem = lpDrawItemStruct->itemID;
	BOOL bGet = GetItem(&lvi); 

	//高亮显示
	BOOL bHighlight =((lvi.state & LVIS_DROPHILITED)||((lvi.state & LVIS_SELECTED)
									&& ((GetFocus() == this)|| (GetStyle() & LVS_SHOWSELALWAYS))));

	//画文本背景
	CRect rcBack = lpDrawItemStruct->rcItem;
	pDC->SetBkMode(TRANSPARENT); 

	if( bHighlight ) //如果被选中
	{
		pDC->SetTextColor(RGB(255,255,255)); 			//文本颜色
		pDC->FillRect(rcBack, &CBrush(RGB(90,162,100))); 	//行背景色
	}
	else
	{
		pDC->SetTextColor(RGB(0,0,0)); 				//文本颜色
		pDC->FillRect(rcBack, &CBrush(RGB(255,255,255)));       //行背景色
	} 

	//绘制文本
	if (lpDrawItemStruct->itemAction & ODA_DRAWENTIRE)
	{
		//得到列数
		int nCollumn = GetHeaderCtrl()->GetItemCount();

		//循环处理
		CString szText;
		for (int i = 0; i < GetHeaderCtrl()->GetItemCount(); i++)
		{
			CRect rcItem;
			if ( !GetSubItemRect(lpDrawItemStruct->itemID, i, LVIR_LABEL, rcItem ))
			{
				continue;
			}

			szText = GetItemText( lpDrawItemStruct->itemID, i );

			rcItem.left += 5; rcItem.right -= 1;
			pDC->DrawText(szText, lstrlen(szText), &rcItem,  DT_LEFT | DT_VCENTER | DT_NOPREFIX | DT_SINGLELINE);
		}
	}
}

改变行高的方法II:

也可以通过在每一行插入图标的方法改变行高,图标可以根据需要是否要真正插入

先设置ListCtrl属性

//加载ListCtrl
LONG lStyle;
lStyle = GetWindowLong(m_TaskList.m_hWnd, GWL_STYLE); //获取当前窗口Style
lStyle &= ~LVS_TYPEMASK; //清除显示方式
lStyle |= LVS_REPORT | LVSIL_SMALL | LVS_ALIGNTOP | LVS_SHOWSELALWAYS; //设置Style
SetWindowLong(m_TaskList.m_hWnd, GWL_STYLE, lStyle);
DWORD dwStyle = m_TaskList.GetExtendedStyle();
//dwStyle |= LVS_EX_FULLROWSELECT; //选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_SUBITEMIMAGES; //subitem添加图标
dwStyle |= LVS_EX_DOUBLEBUFFER;
m_TaskList.SetExtendedStyle(dwStyle);
//::SendMessage(m_TaskList.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);

再设置图标(行高)

//设置ListCtrl行高(仅通过cy=44来控制行高,但这里并不需要加载图标,需要再APP下载时根据不同的APP动态加载具体的图标)
m_ImageList.Create(44, 44, ILC_COLOR32 | ILC_MASK, 0, 10); //如果用32*32的会改变行高.ILC_MASK将图标背景设为透明,否则空白地方均为黑色
m_ImageList.SetBkColor(RGB(255, 255, 255)); //需要设置背景色为白色,否则图标镂空的地方都是黑色,且图标有黑边框
m_nInstall = m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));   //只能是.ico图片,.bmp格式不显示, Add返回索引0
//m_nInstall = m_ImageList.Add(LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1)));  //或者这个
m_TaskList.SetImageList(&m_ImageList, LVSIL_SMALL); //LVSIL_SMALL为小图标(16*16),LVSIL_NORMAL为大图标(32*32),一定要配套使用,否则不显示
时间: 2024-08-21 16:36:07

自绘ListCtrl -- 设置行高的相关文章

共享MFC自绘Listctrl代码

在别人代码基础上修改的ListCtrl,支持设置行高,header高度,header背景图,奇偶行不同背景色, 支持设置某列为Checkbox,Edit,Combobox, 支持自定义排序. 效果图如下: VS2012代码下载:https://github.com/yinkaisheng/MFCListCtrlEx

实现Myxls设置行高的功能(转)

MyXLS是一个导出Excel的好工具,速度快,体积小,而且也不用担心使用Com生成Excel时资源释放的问题了.但是作者提供的代码没有设置行高 要实现这个效果,首先需要修改两个文件: 1.Row.cs 添加行高的属性. private ushort _rowHeight;   /// <summary> /// Gets the row index of this Row object. /// </summary> public ushort RowHeight { get {

给GridView设置行高

近期在工作中遇到了这样一个问题,使用一个GridView展示数据,item中仅仅是一个TextView,可是里面显示的文字多少不固定多少,必须所有展示出来. 遇到的问题: 1.把item中的宽和高设置match_parent,还是设置成wrap_content,当内容过多的时候,会覆盖下一行的显示的内容. 2.没有一个属性能够给GridView设置行高,那么高度就不能控制. 遇到的问题展示:.期望 想到的解决的方法是: 设计思路:1.先把TextView的高度,获取出来 2.把高度存到全局变量中

DataGridView设置行高

.Net中DataGridView控件如何设置行高 在DataGridView控件中,默认的行高很大,而标题头的行高却很小,感觉很不匀称. 标题头的行高比较好设置需要修改两个属性1修改ColumnHeadersHeader 设置为你想要的高度,比如20:但这时候自动变回来.2修改ColumnHeadersHeaderSize属性为 EnableResizing,不要为AutoSize.行高的设置:RowTemplate属性下的Height 属性. 其实.Net设置的很完美了,就是有的属性不容易找

VC自绘ListCtrl(III) -- Alternate Row Colors for the CListCtrl

问题是这样的: 一般情况下,如果ListCtrl 的某个 Item 被选中的时候,它的背景会显示为蓝色,这时候如果我们点击一下其它的Button (也就是输入焦点转移到其它控件上去时),刚才这个被选中的item的背景会变成浅灰色,在这种情况下我要让它的背景仍然是蓝色,应该怎么实现?谢谢! http://www.codeproject.com/listctrl/coloredlistctrl.asp Alternate Row Colors for the CListCtrl Download d

在safari下input的placeholder设置行高失效

在项目中遇到input的placeholder在safari下设置行高失效的问题,亲测 input{ width:250px; height:30px; line-height:30px; font-size:14px; padding:0px 0px 0px 30px; [;line-height:1;color:#f00;] } 单独针对Safari来写hack 原文地址:https://www.cnblogs.com/guoliping/p/9798703.html

iOS UILabel 设置行高

UILabel *tileLabel = [[UILabel alloc] init]; tileLabel.numberOfLines = 0; tileLabel.backgroundColor = [UIColor clearColor]; tileLabel.text = @"调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整

自绘listCtrl控件选中该行高亮(模拟windows)

CListCtrl的派生类CMyListCtrl的DrawItem()函数里添加代码 CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC); if (lpDrawItemStruct->itemState && LVIS_SELECTED) { CPen PenLine(PS_SOLID, 1, RGB(0, 0, 0)); CPen *OldPenLine = pDC->SelectObject(&PenLine);

给博客园的博客文章设置行高,让博客文字不再拥挤

若使用博客园模板的默认样式,文字是相当拥挤的.如下图: 解决办法: [1]点击导航下的[管理] [2]进入后台界面后,点击[设置] [3]进入设置界面后,找到[页面定制CSS代码],并进行如下输入: #cnblogs_post_body p { line-height: 2; } [4]代码输入完成后,在页尾处找到[保存],并点击 [5]处理之后,文字终于有了行高. [6]当然,还可以通过控制台查看标签,进行进一步的样式设置. 但如果仅要求增加文章行高的话,就是以上操作……