CListCtrl如何失去焦点后依然高亮显示选中的行? RT.CListCtrl选中一行后会高亮显示,不过一旦失去焦点,就不再高亮显示了。需求:始终高亮显示选中的行。如何通过重载OnNMCustomdraw()函数实现呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有属性的。LVS_SHOWSELALWAYS , 创建的时候指定就可以了。 void CxxxxDlg::OnCustDrawList(NMHDR *pNMHDR,LRESULT *pResult){ // TODO: Add your message handler code here and/or call default *pResult=CDRF_NOTIFYITEMDRAW ; LPNMLVCUSTOMDRAW pDraw=(LPNMLVCUSTOMDRAW)pNMHDR; DWORD dwDrawStage=pDraw->nmcd.dwDrawStage; int nID=pDraw->nmcd.dwItemSpec;// int selID=m_List.GetNextItem(-1,LVNI_SELECTED); int subItem=pDraw->iSubItem;// if((nID==selID) && (subItem==0)) { // afxDump << selID << ";" << subItem <<"\n"; CDC* pdc=CDC::FromHandle(pDraw->nmcd.hdc);// CRect rc; m_List.GetItemRect(selID,&rc,LVIR_LABEL); CString txt=m_List.GetItemText(selID,0);// CSize sz=pdc->GetOutputTextExtent(txt); rc.right=rc.left+sz.cx+8; rc.DeflateRect(1,1);// DWORD clr=GetSysColor(COLOR_HIGHLIGHT); pdc->FillSolidRect(&rc,clr);// pdc->SetTextColor(RGB(255,255,255));//white pdc->SetBkColor(clr);// pdc->TextOut(rc.left,rc.top,txt); *pResult |= CDRF_SKIPDEFAULT; }} 乖乖。都是用的这个方法啊,连text都要通过DC自己再绘制。很郁闷的说按现在用的就是这个方法,觉得不太舒服,想讨个别的好法。。还有么?不过还是谢谢的说。结贴时候给你高分。 ;-) 我本来的想法是通过对每个单元格进行背景自绘,文字不做处理。就是:1、获取单元格rect2、绘制一个矩形透明的,着底色这样子单元格内的text不做任何处理,还是交给CListCtrl的OnLvnGetdispinfo处理.这个方法可行么? 搞个隐藏的CStatic,自己设置背景色和前景色,当CListCtrl有选择项并且失去焦点的时候,一个Item中的某一列就显示一个CStatic,有几列就显示几个,当然上面的文本,你可以通过CListCtrl::GetItemText();得到某行某列的数据。 本帖最后由 xianglitian 于 2010-07-16 10:14:35 编辑 跪求高手指点!往EXCEL里插入一个自己写的ACTIVE控件,怎么不能响应按键消息 怎样用VC编写一个登陆界面 为什么ConnectEx函数需要lpdwBytesSent这个参数 请问怎么从一个hwnd得到这个窗口所在进程的名称和执行文件的路径 简单的问题 GetWindowText() 应包含那些头文件 请教几个C/S结构程序的布署问题,能帮忙回几个是几个!谢谢! (二)请 ljn2(没有人2 (账户惨被封))来接分,感谢你回答问题,我日,终于搞定了,版主不要删啊~ 注册表里启动项的路径怎么得到??? 不过我显示完这条,还想接着"printf",用上面的函数还好使吗?不用关心什么HDC坐标吧?纯字符 如何取消显示图元文件 怎么引用其他类的函数
{
// TODO: Add your message handler code here and/or call default
*pResult=CDRF_NOTIFYITEMDRAW ;
LPNMLVCUSTOMDRAW pDraw=(LPNMLVCUSTOMDRAW)pNMHDR;
DWORD dwDrawStage=pDraw->nmcd.dwDrawStage;
int nID=pDraw->nmcd.dwItemSpec;//
int selID=m_List.GetNextItem(-1,LVNI_SELECTED);
int subItem=pDraw->iSubItem;
//
if((nID==selID) && (subItem==0))
{ // afxDump << selID << ";" << subItem <<"\n";
CDC* pdc=CDC::FromHandle(pDraw->nmcd.hdc);
//
CRect rc;
m_List.GetItemRect(selID,&rc,LVIR_LABEL);
CString txt=m_List.GetItemText(selID,0);
//
CSize sz=pdc->GetOutputTextExtent(txt);
rc.right=rc.left+sz.cx+8;
rc.DeflateRect(1,1);
//
DWORD clr=GetSysColor(COLOR_HIGHLIGHT);
pdc->FillSolidRect(&rc,clr);
//
pdc->SetTextColor(RGB(255,255,255));//white
pdc->SetBkColor(clr);
//
pdc->TextOut(rc.left,rc.top,txt);
*pResult |= CDRF_SKIPDEFAULT;
}
}
很郁闷的说按现在用的就是这个方法,觉得不太舒服,想讨个别的好法。。还有么?
不过还是谢谢的说。结贴时候给你高分。 ;-)
1、获取单元格rect
2、绘制一个矩形透明的,着底色这样子单元格内的text不做任何处理,还是交给CListCtrl的OnLvnGetdispinfo处理.这个方法可行么?