MFC 自绘CListCtrl如何让选中行高亮
我重载了CListCtrl的PreSubclassWindow方法中,添加了如下代码:voidCEditListCtrl::PreSubclassWindow(){Mod...
我重载了CListCtrl的PreSubclassWindow方法中,添加了如下代码:
void CEditListCtrl::PreSubclassWindow()
{
ModifyStyle(0, LVS_OWNERDRAWFIXED | LVS_REPORT, 0);
CListCtrl::PreSubclassWindow();
}
似乎CListCtrl在设置了LVS_OWNERDRAWFIXED后画面上的被选中行就无法被高亮显示了,但是我用GetFirstSelectedItemPosition()去取得选中的行对象的POSITION的时候还是能正常的取得的,请问这是为什么?该怎么解决。
因为我想在CListCtrl里面设定每个单元格的字体颜色,所以似乎必须要将单元格设置为LVS_OWNERDRAWFIXED的。
求各位大侠帮忙,谢谢,解决加分 展开
void CEditListCtrl::PreSubclassWindow()
{
ModifyStyle(0, LVS_OWNERDRAWFIXED | LVS_REPORT, 0);
CListCtrl::PreSubclassWindow();
}
似乎CListCtrl在设置了LVS_OWNERDRAWFIXED后画面上的被选中行就无法被高亮显示了,但是我用GetFirstSelectedItemPosition()去取得选中的行对象的POSITION的时候还是能正常的取得的,请问这是为什么?该怎么解决。
因为我想在CListCtrl里面设定每个单元格的字体颜色,所以似乎必须要将单元格设置为LVS_OWNERDRAWFIXED的。
求各位大侠帮忙,谢谢,解决加分 展开
1个回答
展开全部
问题:CListCtrl如何高亮选中一行 http://zhidao.baidu.com/question/100664911.html
扩展:单行、双行及完成状态的字体等等。。。
主要是改写CListCtrl中的ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)消息,
1、在ListCtrlEx.h中增加 http://hi.baidu.com/juncox/blog/item/cf1f310fa5f2d0c37bcbe12d.html
//{{AFX_MSG(CListCtrlEx)
afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
2、进行消息映射
BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
//{{AFX_MSG_MAP(CListCtrlEx)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
3、函数本体如下
//////////////////////////////////////////////////////////////////////////
void CListCtrlEx::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVCUSTOMDRAW* lplvcd = (NMLVCUSTOMDRAW*)(pNMHDR);
int nRow = (int)lplvcd->nmcd.dwItemSpec;
switch (lplvcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult |= CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
//------------------------------------------------------
// 单行与双行的颜色 [Juncox 6月15日 11:57:29]
if(nRow & 1){ // 单行
lplvcd->clrTextBk = RGB(0xFF,0xFF,0xFF);
lplvcd->clrText = RGB(0x00,0x00,0x00);
*pResult = CDRF_NEWFONT;
}else{ // 双行
lplvcd->clrTextBk = RGB(0xBB,0xCC,0xFF);
lplvcd->clrText = RGB(0x44,0x33,0x00);
*pResult = CDRF_NEWFONT;
}
//------------------------------------------------------
// 打勾项 [Juncox 6月15日 11:57:38]
if(GetCheck(nRow) && (GetExtendedStyle() & LVS_EX_CHECKBOXES))
{
lplvcd->clrTextBk = RGB(0x00,0x00,0x80);
lplvcd->clrText = RGB(0xFF,0xFF,0x00);
//--------------------------------------------
// 设置字体
HFONT hFont = (HFONT)this->SendMessage(WM_GETFONT);
LOGFONT lf; GetObject(hFont, sizeof(lf), &lf);
lf.lfStrikeOut = TRUE; // 删除线
lf.lfItalic = TRUE; // 斜体
hFont = CreateFontIndirect(&lf);
SelectObject(lplvcd->nmcd.hdc, hFont);
DeleteObject(hFont);
*pResult = CDRF_NEWFONT;
}
//------------------------------------------------------
// 选中行 [Juncox 6月15日 11:57:42]
if( GetItemState(nRow, CDIS_SELECTED) )
{ // 预留BUG,看有多少人是摘自这里, CDIS_SELECTED前少取反号,且把异或为与
// 使用此代码段,请留下Juncox@163.com说明
lplvcd->nmcd.uItemState ^= CDIS_SELECTED;// 预留BUG
lplvcd->clrTextBk =RGB(255, 0, 0);
lplvcd->clrText = RGB(0, 0, 255);
*pResult = CDRF_NEWFONT;
}
break;
default:
*pResult = CDRF_DODEFAULT;
break;
}
}
扩展:单行、双行及完成状态的字体等等。。。
主要是改写CListCtrl中的ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)消息,
1、在ListCtrlEx.h中增加 http://hi.baidu.com/juncox/blog/item/cf1f310fa5f2d0c37bcbe12d.html
//{{AFX_MSG(CListCtrlEx)
afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
2、进行消息映射
BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
//{{AFX_MSG_MAP(CListCtrlEx)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
3、函数本体如下
//////////////////////////////////////////////////////////////////////////
void CListCtrlEx::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVCUSTOMDRAW* lplvcd = (NMLVCUSTOMDRAW*)(pNMHDR);
int nRow = (int)lplvcd->nmcd.dwItemSpec;
switch (lplvcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult |= CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
//------------------------------------------------------
// 单行与双行的颜色 [Juncox 6月15日 11:57:29]
if(nRow & 1){ // 单行
lplvcd->clrTextBk = RGB(0xFF,0xFF,0xFF);
lplvcd->clrText = RGB(0x00,0x00,0x00);
*pResult = CDRF_NEWFONT;
}else{ // 双行
lplvcd->clrTextBk = RGB(0xBB,0xCC,0xFF);
lplvcd->clrText = RGB(0x44,0x33,0x00);
*pResult = CDRF_NEWFONT;
}
//------------------------------------------------------
// 打勾项 [Juncox 6月15日 11:57:38]
if(GetCheck(nRow) && (GetExtendedStyle() & LVS_EX_CHECKBOXES))
{
lplvcd->clrTextBk = RGB(0x00,0x00,0x80);
lplvcd->clrText = RGB(0xFF,0xFF,0x00);
//--------------------------------------------
// 设置字体
HFONT hFont = (HFONT)this->SendMessage(WM_GETFONT);
LOGFONT lf; GetObject(hFont, sizeof(lf), &lf);
lf.lfStrikeOut = TRUE; // 删除线
lf.lfItalic = TRUE; // 斜体
hFont = CreateFontIndirect(&lf);
SelectObject(lplvcd->nmcd.hdc, hFont);
DeleteObject(hFont);
*pResult = CDRF_NEWFONT;
}
//------------------------------------------------------
// 选中行 [Juncox 6月15日 11:57:42]
if( GetItemState(nRow, CDIS_SELECTED) )
{ // 预留BUG,看有多少人是摘自这里, CDIS_SELECTED前少取反号,且把异或为与
// 使用此代码段,请留下Juncox@163.com说明
lplvcd->nmcd.uItemState ^= CDIS_SELECTED;// 预留BUG
lplvcd->clrTextBk =RGB(255, 0, 0);
lplvcd->clrText = RGB(0, 0, 255);
*pResult = CDRF_NEWFONT;
}
break;
default:
*pResult = CDRF_DODEFAULT;
break;
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询