在 MFC C++ 中更改文本颜色?
Change Text Color in MFC C++?
我想改变 LVITEM 的颜色?
m_szList 是 CListCtrl。
LVITEM lvItem;
lvItem.mask = LVIF_TEXT;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.pszText = _T("Sandra");
m_szList.InsertItem(&lvItem);
m_szList.SetTextColor(RGB(255, 78, 12));
lvItem.mask = LVIF_TEXT;
lvItem.iItem = 1;
lvItem.iSubItem = 0;
lvItem.pszText = _T("Roger");
m_szList.InsertItem(&lvItem);
这段代码可以改变sandra和roger的颜色。
但我只想将桑德拉的颜色改为红色。
罗杰默认(黑色)。
您可以为此作业使用自定义绘制列表控件。
您通过响应 NM_CUSTOMDRAW
消息使控件自定义绘制。这是 从 控件发送的通知消息。使用 MFC,您的函数头将如下所示:
void CCustomLvView::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
要添加此处理程序,您通常使用 CListCtrl(或 CListView)的属性列表,如下所示:
这将创建一个类似这样的处理程序:
void CCustomLV2View::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) {
LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
*pResult = CDRF_DODEFAULT;
}
[如果没记错的话,这里还有一两条评论。]
您需要添加一些代码来更改文本颜色,顺序如下:
void CCustomLV2View::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) {
LPNMLVCUSTOMDRAW pNMCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
*pResult = CDRF_DODEFAULT;
switch (pNMCD->nmcd.dwDrawStage) {
// this tells the control, before any painting begins, that we
// want to be notified just before any item in the control is drawn.
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;
break;
// This will be called before an item is drawn.
// We check what item is being drawn, and set the text color appropriately
case CDDS_ITEMPREPAINT:
if (pNMCD->nmcd.dwItemSpec == 0)
pNMCD->clrText = RGB(0, 0, 0);
else
pNMCD->clrText = RGB(255, 78, 12);
break;
}
}
就像现在一样,这会将第一个项目的文本绘制为黑色,将所有后续项目的文本绘制为红色。 if (pNMCD->nmcd.dwItemSpec == 0)
用于选择项目,(当然)pNMCD->clrText = RGB...
用于设置文本颜色。
另请注意,我对它生成的代码进行了相当小的修改,因此我使用 LPNMLVCUSTOMDRAW
而不是 LPNMCUSTOMDRAW
。这允许访问传递给自定义绘制处理程序的特定于 ListView 的字段。否则,我们将无法访问我们正在使用的某些(任何?)字段。
我想改变 LVITEM 的颜色? m_szList 是 CListCtrl。
LVITEM lvItem;
lvItem.mask = LVIF_TEXT;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.pszText = _T("Sandra");
m_szList.InsertItem(&lvItem);
m_szList.SetTextColor(RGB(255, 78, 12));
lvItem.mask = LVIF_TEXT;
lvItem.iItem = 1;
lvItem.iSubItem = 0;
lvItem.pszText = _T("Roger");
m_szList.InsertItem(&lvItem);
这段代码可以改变sandra和roger的颜色。 但我只想将桑德拉的颜色改为红色。 罗杰默认(黑色)。
您可以为此作业使用自定义绘制列表控件。
您通过响应 NM_CUSTOMDRAW
消息使控件自定义绘制。这是 从 控件发送的通知消息。使用 MFC,您的函数头将如下所示:
void CCustomLvView::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
要添加此处理程序,您通常使用 CListCtrl(或 CListView)的属性列表,如下所示:
这将创建一个类似这样的处理程序:
void CCustomLV2View::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) {
LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
*pResult = CDRF_DODEFAULT;
}
[如果没记错的话,这里还有一两条评论。]
您需要添加一些代码来更改文本颜色,顺序如下:
void CCustomLV2View::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) {
LPNMLVCUSTOMDRAW pNMCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
*pResult = CDRF_DODEFAULT;
switch (pNMCD->nmcd.dwDrawStage) {
// this tells the control, before any painting begins, that we
// want to be notified just before any item in the control is drawn.
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;
break;
// This will be called before an item is drawn.
// We check what item is being drawn, and set the text color appropriately
case CDDS_ITEMPREPAINT:
if (pNMCD->nmcd.dwItemSpec == 0)
pNMCD->clrText = RGB(0, 0, 0);
else
pNMCD->clrText = RGB(255, 78, 12);
break;
}
}
就像现在一样,这会将第一个项目的文本绘制为黑色,将所有后续项目的文本绘制为红色。 if (pNMCD->nmcd.dwItemSpec == 0)
用于选择项目,(当然)pNMCD->clrText = RGB...
用于设置文本颜色。
另请注意,我对它生成的代码进行了相当小的修改,因此我使用 LPNMLVCUSTOMDRAW
而不是 LPNMCUSTOMDRAW
。这允许访问传递给自定义绘制处理程序的特定于 ListView 的字段。否则,我们将无法访问我们正在使用的某些(任何?)字段。