动态创建的CListCtrl无法改变Item背景颜色的问题?--急!!!

FoxBryant 2010-12-05 08:59:36
各位大侠:
在基于CFormView的单文档应用程序中,使用如下代码动态创建了一个CListCtrl对象:

m_pListCtrl = new CListCtrl;
m_pListCtrl->Create(WS_CHILD | LVS_SINGLESEL | LVS_REPORT | \
LVS_SORTASCENDING , m_rectListTestItem, (CWnd*)&m_tabStation, ID_STATION_ITEM_LIST_MIN);

m_pListCtrl->SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); //enable full row select property


然后,手动为其添加NM_CUSTOMDRAW消息映射,消息处理函数如下:

void CxxView::OnNMCustomdrawList(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );

// Take the default processing unless we set this to something else below.
*pResult = CDRF_DODEFAULT;

//
// First thing - check the draw stage. If it's the control's prepaint
// stage, then tell Windows we want messages for every item.
if(CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage) //此条件一直成立,为什么? {
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if(CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage)
{
// This is the notification message for an item. We'll request
// notifications before each subitem's prepaint stage.
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else if((CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage)
{
COLORREF clrNewBkColor;

int nItem = static_cast<int>(pLVCD->nmcd.dwItemSpec);
//Do something to change Item color...
}

//*pResult = 0;
}


现在的问题是:
能进入消息处理函数,但pLVCD->nmcd.dwDrawStage的值总是CDDS_PREPAINT,为什么无法接收到CDDS_ITEMPREPAINT消息呢?

百度上也有人遇到过类似的问题,但没有给出原因及解决方法,求助!!!
谢谢!
...全文
323 11 打赏 收藏 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
FoxBryant 2010-12-06
  • 打赏
  • 举报
回复
谢谢各位的指点!
问题解决啦:
首先通过类向导生成一个从CListCtrl继承的类,然后为这个类添加NM_CUSTOMDRAW消息,消息处理函数如下:

void CxxListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
int iRow = 0;

LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;

switch(lplvcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
*pResult = CDRF_DODEFAULT;

iRow = lplvcd->nmcd.dwItemSpec;
if (this->GetItemText(iRow, ITEM_STATUS) == _T("PASS")) //对Item进行条件筛选
{
lplvcd->clrTextBk = RGB(0, 255, 0);
}
else if (this->GetItemText(iRow, ITEM_STATUS) == _T("FAIL"))
{
lplvcd->clrTextBk = RGB(255, 0, 0);
}
*pResult = CDRF_NOTIFYSUBITEMDRAW;
break;
default:
*pResult = CDRF_DODEFAULT;

}
}


然后,动态创建CxxListCtrl对象(我同时指定了LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT风格),此时,当有Item的数据更新且满足筛选条件时,Item出现部分变色的现象(即新更改的颜色没有作用到整条Item上面),在更新Item数据后调用Invalidate(FALSE)可以使整个CxxListCtrl重绘,但同时也出现了闪烁的问题。所以,最终是在更新Item的数据之后,调用一下Update(nItem),此时刷新时出现的闪烁问题就消失啦。

再次感谢大家的指点!
Sou2012 2010-12-06
  • 打赏
  • 举报
回复
背景要自己画。。。不过。 有没有调用到你写的那句呢?
向立天 2010-12-06
  • 打赏
  • 举报
回复
是不是需要设置OwnDraw属性
FoxBryant 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zgl7903 的回复:]
加 LVS_OWNERDRAWFIXED 风格看看
[/Quote]

还是不行,现象和不加的时候一样
zgl7903 2010-12-06
  • 打赏
  • 举报
回复
加 LVS_OWNERDRAWFIXED 风格看看
hahaking119 2010-12-06
  • 打赏
  • 举报
回复
void CxxView::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVCUSTOMDRAW* lpLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
*pResult = CDRF_DODEFAULT;

switch (lpLVCD->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;
break;

case CDDS_PREPAINT | CDDS_ITEM:
*pResult = CDRF_NOTIFYSUBITEMDRAW;
break;
case CDDS_PREPAINT | CDDS_ITEM | CDDS_SUBITEM:
{
lpLVCD->clrText = ::GetSysColor(COLOR_WINDOWTEXT);
lpLVCD->clrTextBk = ::GetSysColor(COLOR_WINDOW);
}
break;
}
}
FoxBryant 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 visualeleven 的回复:]
http://blog.csdn.net/VisualEleven/archive/2010/10/18/5948057.aspx
[/Quote]

请问这位大哥,函数中为什么只能收到CDDS_PREPAINT消息呢,如果不自绘CListCtrl的话可以实现么?
FoxBryant 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cnzdgs 的回复:]
调试时只在CDDS_ITEMPREPAINT分支设置断点看能否执行到,CDDS_PREPAINT分支不要设置断点。
[/Quote]

不能执行到ITEMPREPAINT,dwDrawStage的值一直是CDDS_PREPAINT。
cnzdgs 2010-12-05
  • 打赏
  • 举报
回复
调试时只在CDDS_ITEMPREPAINT分支设置断点看能否执行到,CDDS_PREPAINT分支不要设置断点。
摘 要 针对高校教师教学业绩管理流程复杂、数据填报不规范、多级审核效率低、统计分析滞后等问题,本文设计并实现一套基于SpringBoot+Vue前后端分离架构的高校教师教学业绩综合管理系统。系统后端以SpringBoot处理业务逻辑与接口开发,前端用Vue构建交互界面,MySQL存储数据,MD5加密保障账号安全,具备低耦合、易扩展、易维护特性。 系统按权限划分为教师、学院管理员、学校管理员三级角色,构建闭环式业绩管理体系。教师可完成信息维护、业绩录入、成果申报、审核跟踪、档案导出、智能咨询与社区互动;学院管理员负责教师管理、业绩初审、数据汇总、通知发布与修正申请;学校管理员承担权限分配、数据维护、业绩终审、统计分析、公告发布与日志审计。 系统实现业绩填报、初审、终审、统计归档全流程线上化,支持批量导入、敏感词过滤、数据可视化、7×24小时AI咨询等功能,规范管理流程、减少统计误差、提升审核效率。测试表明,系统满足高校教学业绩精细化、规范化、信息化管理需求,为教师考核、绩效评定、教学评估提供数据支撑,提升高校教学管理智能化水平。 关键词: SpringBoot;Vue;教学业绩管理;三级权限;前后端分离
内容概要:本文围绕“基于雅可比伪逆迭代的双臂协同轨迹规划与跟踪误差收敛性研究”展开,通过Matlab代码实现双机械臂系统的协同运动控制与轨迹跟踪。研究采用雅可比伪逆法求解冗余机械臂的逆运动学问题,实现末端执行器在笛卡尔空间中的精确轨迹规划,并引入迭代优化机制提升双臂协同作业的精度与稳定性。重点分析了轨迹跟踪过程中误差的收敛特性,验证了所提控制算法在多自由度强耦合系统中的有效性和鲁棒性,适用于复杂环境下需要高精度配合的机器人协同操作任务。该研究属于科研仿真复现类工作,融合了机器人运动学理论、数值计算方法与控制算法设计,为多机械臂系统提供了可行的轨迹规划与控制策略参考。; 适合人群:具备扎实的机器人学基础、自动控制理论知识以及良好Matlab编程能力的科研人员或研究生,尤其适合从事多机械臂协同控制、运动规划、逆运动学求解及误差分析等方向的研究者。; 使用场景及目标:①用于多机械臂系统的协同轨迹规划与运动控制算法研究;②深入理解基于雅可比伪逆法的逆运动学求解原理及其在冗余机构中的应用;③分析轨迹跟踪误差的收敛行为,评估控制策略的稳定性与精度;④作为高质量论文复现资源,支撑相关课题的仿真验证、算法对比与改进创新。; 阅读建议:建议结合Matlab代码与机器人运动学经典理论同步学习,重点关注雅可比矩阵的构建、伪逆运算的实现方式、误差反馈机制的设计以及迭代过程中的数值稳定性处理,同时可进一步拓展至非线性优化、避免奇异位形及实时控制策略的改进研究。

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧