CListCtrl 行高问题最终解决方法[转]
来源:互联网 发布:unity3d手机赛车游戏 编辑:程序博客网 时间:2024/05/04 22:07
下文转自:http://hi.baidu.com/mingyuejingque/blog/item/23413ceeeedb54ffb3fb95f5.html
我也认为重载CListCtrl::DrawItem函数能自绘item,但实际上子类的DrawItem死活没反应。不知道怎么回事。style已设置好了的。奇怪!
谁能告诉我为什么?
=============================
解决方案:
1. 设置List Control的属性 Owen Draw Fixed.
2. 自定义CMyListCtrl, 继承于CListCtrl,并重载CListCtrl::DrawItem.
必须重载DrawItem函数,而不能自己处理WM_DRAWITEM,否则MFC处理时运行到CListCtrl::DrawItem会抱错。( 此函数的内容只有一条语句: ASSERT(FALSE),所以,坚决不能运行^_^)(转注:WM_DRAWITEM消息貌似也是发送给Control的Owner的。List Control接收不到该消息。)
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
========================
转贴版权归原作者所有,声明为原创文章和blog版权归
lonefox (http://blog.csdn.net/boythl)
所有,转载请保留版权信息!
- CListCtrl 行高问题最终解决方法[转]
- CListCtrl行高问题最终解决方法
- 【转】CListCtrl 设置行高
- 改变CListCtrl行高
- CListCtrl行高设置
- CListCtrl 设置行高
- CListCtrl 设置行高
- CListCtrl修改行高
- CListCtrl 设置行高
- CListCtrl 修改行高
- CListCtrl行高的修改
- CListCtrl行高的修改
- CListCtrl行高的修改
- CListCtrl行高的修改
- CListCtrl行高的修改
- MFC-CListCtrl设置行高
- 重复登录问题最终解决方法 fsz521job
- clistCtrl 自绘 设置行高 行宽
- Java程序性能优化
- 工作搞研究
- larbin的使用心得 重构成定向网页爬虫
- Linux关机命令详解
- 融资融券通俗易懂的解释
- CListCtrl 行高问题最终解决方法[转]
- 融资融券大解析
- 超级大户谈融资融券
- 答朋友问
- java.lang.NoSuchMethodError: net.sf.cglib.proxy.Enhancer.setInterceptDuringConstruction(Z)V
- 写写文章
- 数据库的物理设计
- 青 春
- Clamav杀毒软件源码分析笔记[八]