
在 MFC 中修改 ListCtrl 控件的行背景颜色,需要通过自绘(Owner-Draw)机制实现。以下是详细的实现方法:
方法一:通过自绘(Owner-Draw)实现
步骤 1:启用自绘属性
在对话框设计器中选择 ListCtrl 控件,右键点击属性 → 样式 → 勾选 “自绘”(Owner Draw Fixed)。
步骤 2:处理 NM_CUSTOMDRAW 消息
在 ListCtrl 所在的对话框类(如 CMyDialog)中添加消息处理函数:
// 在对话框类头文件(.h)中声明
afx_msg void OnNMCustomdrawList1(NMHDR *pNMHDR, LRESULT *pResult);
// 在对话框类实现文件(.cpp)中添加消息映射
BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
// ... 其他消息映射 ...
ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST1, &CMyDialog::OnNMCustomdrawList1)
END_MESSAGE_MAP()
// 实现消息处理函数
void CMyDialog::OnNMCustomdrawList1(NMHDR *pNMHDR, LRESULT *pResult) {
LPNMLVCUSTOMDRAW pLVCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
*pResult = CDRF_DODEFAULT;
// 阶段 1:预处理
if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage) {
*pResult = CDRF_NOTIFYITEMDRAW;
}
// 阶段 2:绘制项目
else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage) {
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
// 阶段 3:绘制子项
else if ((CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage) {
int nItem = static_cast<int>(pLVCD->nmcd.dwItemSpec); // 当前行
int nSubItem = pLVCD->iSubItem;

最低0.47元/天 解锁文章
1467

被折叠的 条评论
为什么被折叠?



