原文链接: http://blog.csdn.net/benny5609/article/details/1967078

解决方案:

1. 设置List Control的属性 Owen Draw Fixed.

2. 自定义CMyListCtrl, 继承于CListCtrl,并重载CListCtrl::DrawItem.
         必须重载DrawItem函数,而不能自己处理WM_DRAWITEM,否则MFC处理时运行到CListCtrl::DrawItem会抱错。( 此函数的内容只有一条语句: ASSERT(FALSE),所以,坚决不能运行^_^)

3. 为List Control所在的对话框添加对WM_MEASUREITEM消息的处理OnMeasureItem。在响应过程中修改结构中的itemHeight参数。

注意: 不能简单地在CMyListCtrl中响应WM_MEASUREITEM消息,原因很简单,它根本收不到此消息。如果要更好的实现,可以提供一个CMyListCtrl::MeasureItem的函数,在对话框的消息OnMeasureItem中,调用此方法。

以下DrawItem实现片断:

void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
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;

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 ; 
   }

// Get the text 
   ::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));

CDC* pDC;
   pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

if ( lpDrawItemStruct->itemState & ODS_SELECTED )
   {
    pDC->FillSolidRect(&lpDrawItemStruct->rcItem, GetSysColor(COLOR_HIGHLIGHT)) ; 
    pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT)) ;
   }
   else
   {
    pDC->FillSolidRect(&lpDrawItemStruct->rcItem, GetSysColor(COLOR_WINDOW)) ;
    pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT)) ; 
   }
  
   pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));

UINT   uFormat    = DT_LEFT ;

::DrawText(lpDrawItemStruct->hDC, lpBuffer, strlen(lpBuffer), 
    &lpDrawItemStruct->rcItem, uFormat) ;

pDC->SelectStockObject(SYSTEM_FONT) ;
}
}

以上代码来自codeproject: http://www.codeproject.com/listctrl/changerowheight.asp

其上有一种解决方案如下,第1,2步相同,最后则如下处理:

3. 在CMyListCtrl的MESSAGE_MAP中手动添加如下宏: ON_WM_MEASUREITEM_REFLECT()

4. 重载CMyListCtrl::MeasureItem函数。同样要注意,并不是给CMyListCtrl添加消息处理函数。

备注: 此方法同样适用于Combo Box, List Control, Menu

CListCtrl行高问题最终解决方法的更多相关文章

  1. vue element UI el-table 表格调整行高的处理方法

    这是我在工作项目中遇到的问题,我想将标记处下方的表格高度调低一点,也就是想实现下面的这个效果: 代码调整如下: 说明: 缩小:行高到一定程度之后便不能缩小. 好像最小35px.各位可以试一下. 升高: ...

  2. 谈谈CListCtrl如何调整行高

    原文链接: http://blog.csdn.net/sstower/article/details/9094939 调整CListCtrl 行高通常有3种方法: 1.设定字体2.设定图片3.处理Me ...

  3. 对tableView三种计算动态行高方法的分析

    tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableV ...

  4. IOS第八天(5:UITableViewController新浪微博, 计算行高)

    在 4 的 基础上重写 以下的方法 control #pragma mark - 代理方法 /** 计算单元格行高 */ - (CGFloat)tableView:(UITableView *)tab ...

  5. python之xlwt模块列宽width、行高Heights详解

    今天用python操作excel时,发现xlwt的API中没有对width.height有更多介绍,且使用时也不知道width取多少合适.现在这做个详细介绍 使用版本: python:2.7.5 xl ...

  6. Cell 动态行高文字显示不全问题探索

    目录 问题概述 一.新建工程 二.尝试复现问题 尝试解决 修改contentLblBtmCon优先级为High(750) 修改contentLblBtmCon优先级为Low(250) 小结 其他解决思 ...

  7. line-height行高与图片的隐匿文本间隙消除方法

    (标注 文章来源 http://www.zhangxinxu.com/wordpress/2015/08/css-deep-understand-vertical-align-and-line-hei ...

  8. 改变QTreeView项高的方法(改变Delegate行高,或者::data取数据的时候,根据Qt::SizeHintRole进行判断)

    很久之前写过一篇关于QTreeView快速显示超过千万条数据项的方法,如果说那篇文章讲的是QTreeView的内功的话,今天这篇是讲QTreeView的外功,有时我们想改变视图的数据项的行高,那怎么办 ...

  9. iOS自适应行高方法及问题

    最近一周被项目的动态高度虐的很惨,感觉浪费了很多时间,但是值得高兴的是对动态高度的使用掌握了好多方法,并且知道了方法之间的区别和优缺点. 1.最常用的: UITableView+FDTemplateL ...

随机推荐

  1. windows下根据进程ID强制杀死进程

    [windows 进程ID PID]NTSD命令详解 1. ntsd -c q -p PID 2. ntsd -c q -pn ImageName 比如:ntsd -c q -pn qq.exe -c ...

  2. Mybatis源码分析之SqlSession和Excutor(二)

    通过上一篇文章的分析我们,我初步了解了它是如何创建sessionFactory的(地址:Mybatis源码分析之SqlSessionFactory(一)), 今天我们分析下Mybatis如何创建Sql ...

  3. JAVA Eclipse打开报错failed to load the jni shared library怎么办

    JRE是64位的,但是Eclipse是32位的   一般都用绿色版的了,可以直接解压运行  

  4. WinForm 之 程序启动不显示主窗体

    在 WinForm 程序启动时,不显示主窗体的实现方法主要有以下5种,第五种最简单,而且效果也不错,第四种方法也值得推荐. 实例代码如下: //隐藏窗体的方法1/5:不指定任何窗体为主窗体 //注意: ...

  5. Using a Microsoft Account to Logon and Resulting Internet Communication in Windows 8

    Using a Microsoft Account to Logon and Resulting Internet Communication in Windows 8 此主题尚未评级 - 评价此主题 ...

  6. Codeforces Round #234 (Div. 2) :A. Inna and Choose Options

    A. Inna and Choose Options time limit per test 1 second memory limit per test 256 megabytes input st ...

  7. jquery append()方法与html()方法使用方法差别

    append(content):方法在被选元素的结尾(仍然在内部)插入指定内容,有非常多朋友认为append与html差点儿相同.其他从英文意义上append是在原有基础上添加,而html中是替换当前 ...

  8. C#匿名对象在其它方法体内怎么取到相应的值(不想建立对应的类并转化的情况下)?

    public object AnonymousObj() { ", Message = "OK", Data = new {...} } } public void Ot ...

  9. ORA-01950: no privileges on tablespace xxx ORA-01950: 对表空间 'xxx'无权限

    场景: 创建用户,在用户scheme下新建了一张表,插入数据时报错 ORA-01950: 对表空间 'xxx'无权限 创建用户 /*第1步:创建临时表空间 */ create temporary ta ...

  10. Java获取本机IP

    try { Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); whil ...