CListCtrl 设置字体样式为粗体
CListCtrl set font style to bold
我想将CListCtrl 控件的任何单元格的字体更改为粗体。任何人都可以告诉如何为 CList Ctrl 做到这一点。
我已经为 CTreeCtrl 做了这个,像这样
pTC->SetItemState(hItemCur, TVIS_BOLD, TVIS_BOLD);
我们有类似的 CListCtrl 吗?
提前致谢。
如果可以使用CMFCListCtrl (VS2008 SP1 and up), you can derive a class from it and override OnGetCellFont。从那里你 return 你的粗体字体(你可以创建你自己的或 return AFX_GLOBAL_DATA::fontBold):
HFONT CMyListCtrl::OnGetCellFont( int nRow, int nColumn, DWORD dwData /*= 0*/ )
{
if (UseBoldFont(/* params */))
{
return GetGlobalData()->fontBold;
}
return NULL;
}
如果您必须坚持使用普通的旧 CListCtrl,最简单的方法是使用自定义绘图,您可以在其中根据自己的需要调整绘图过程。不要将它与 Owner Draw 混淆,在 Owner Draw 中,您必须自己完成 所有 绘图。
Here's an article 解释使用 CListCtrl 自定义绘图的基础知识。
添加
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomdraw)
到你的消息映射。
现在您可以在此功能中随意修改项目。在这里您可以更改对齐方式、字体、背景颜色、文本颜色、[...],并且可以将项目设置为粗体 -> example。 IMO 的最佳方法是存储指向结构的指针 class 或只是在控件中项目的 LPARAM 中存储一个标志。此函数适用于 CListCtrl 和 CTreeCtrl。
这是带有标志的示例:
enum ColorFlags
{
F_COLOR_BLACK = 0x1,
F_COLOR_WHITE = 0x2
//and more...
};
enum CustomColors
{
COLOR_BLACK = RGB(0, 0, 0),
COLOR_WHITE = RGB(255, 255, 255)
};
afx_msg
void CMyListCtrl::OnCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVCUSTOMDRAW *pDraw = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
switch (pDraw->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW; //Do not forget this...
break;
case CDDS_ITEMPREPAINT:
{
switch (pDraw->nmcd.lItemlParam) //Extract color from flags
{
case F_COLOR_BLACK:
{
pDraw->clrText = COLOR_BLACK;
} break;
case F_COLOR_WHITE:
{
pDraw->clrText = COLOR_WHITE;
} break;
default:
break;
} //switch
} break;
} //switch
}
我想将CListCtrl 控件的任何单元格的字体更改为粗体。任何人都可以告诉如何为 CList Ctrl 做到这一点。
我已经为 CTreeCtrl 做了这个,像这样
pTC->SetItemState(hItemCur, TVIS_BOLD, TVIS_BOLD);
我们有类似的 CListCtrl 吗?
提前致谢。
如果可以使用CMFCListCtrl (VS2008 SP1 and up), you can derive a class from it and override OnGetCellFont。从那里你 return 你的粗体字体(你可以创建你自己的或 return AFX_GLOBAL_DATA::fontBold):
HFONT CMyListCtrl::OnGetCellFont( int nRow, int nColumn, DWORD dwData /*= 0*/ )
{
if (UseBoldFont(/* params */))
{
return GetGlobalData()->fontBold;
}
return NULL;
}
如果您必须坚持使用普通的旧 CListCtrl,最简单的方法是使用自定义绘图,您可以在其中根据自己的需要调整绘图过程。不要将它与 Owner Draw 混淆,在 Owner Draw 中,您必须自己完成 所有 绘图。
Here's an article 解释使用 CListCtrl 自定义绘图的基础知识。
添加
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomdraw)
到你的消息映射。
现在您可以在此功能中随意修改项目。在这里您可以更改对齐方式、字体、背景颜色、文本颜色、[...],并且可以将项目设置为粗体 -> example。 IMO 的最佳方法是存储指向结构的指针 class 或只是在控件中项目的 LPARAM 中存储一个标志。此函数适用于 CListCtrl 和 CTreeCtrl。
这是带有标志的示例:
enum ColorFlags
{
F_COLOR_BLACK = 0x1,
F_COLOR_WHITE = 0x2
//and more...
};
enum CustomColors
{
COLOR_BLACK = RGB(0, 0, 0),
COLOR_WHITE = RGB(255, 255, 255)
};
afx_msg
void CMyListCtrl::OnCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVCUSTOMDRAW *pDraw = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
switch (pDraw->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW; //Do not forget this...
break;
case CDDS_ITEMPREPAINT:
{
switch (pDraw->nmcd.lItemlParam) //Extract color from flags
{
case F_COLOR_BLACK:
{
pDraw->clrText = COLOR_BLACK;
} break;
case F_COLOR_WHITE:
{
pDraw->clrText = COLOR_WHITE;
} break;
default:
break;
} //switch
} break;
} //switch
}