最近搜索了一下,大都是使用CListCtrl的派生类实现改变某一行颜色的功能。能不能直接处理呢?比如,基于对话框的界面上,放一个ListCtrl控件,通过增加消息映射的功能改变颜色呢?我看到网上有一个代码,如下:使用NM_CUSTOMDRAW消息映射(1)声明消息处理函数:afx_msg void OnCustomDrawList ( NMHDR* pNMHDR, LRESULT* pResult );(2)手动添加消息映射:ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomDrawList )(3)编写自绘消息处理函数(4)触发消息
代码如下,好像没有问题,但就是不触发这个消息CMap< DWORD , DWORD& , COLORREF , COLORREF& > MapItemColor;//声明MapItemColor//消息映射
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart)//想通过点击一个按钮直接触发NM_CUSTOMDRAW ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDrawList)//这里 //}}AFX_MSG_MAP
END_MESSAGE_MAP()//{{AFX_MSG(CMyDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButtonStart(); afx_msg void OnCustomDrawList( NMHDR* pNMHDR, LRESULT* pResult );//这里//}}AFX_MSG
void CMyDlg::OnCustomDrawList(NMHDR* pNMHDR, LRESULT* pResult)
{
*pResult = CDRF_DODEFAULT;
NMLVCUSTOMDRAW *lplvdr=(NMLVCUSTOMDRAW*)pNMHDR;
NMCUSTOMDRAW &nmcd = lplvdr->nmcd;
switch(lplvdr->nmcd.dwDrawStage)//判断状态
{
case CDDS_PREPAINT:
{
*pResult = CDRF_NOTIFYITEMDRAW;
break;
}
case CDDS_ITEMPREPAINT://如果为画ITEM之前就要进行颜色的改变
{
COLORREF ItemColor;
if(MapItemColor.Lookup(nmcd.dwItemSpec, ItemColor))
//根据在SetItemColor(DWORD iItem, COLORREF color) 设置的//ITEM号和COLORREF 在摸板中查找,然后进行颜色赋值。
{
lplvdr->clrTextBk = ItemColor;
*pResult = CDRF_DODEFAULT;
}
break;
}
default:
break;
}}void CMyDlg::SetItemColor(DWORD iItem, COLORREF color)
{
MapItemColor.SetAt(iItem, color);//设置某行的颜色。
m_ListCtrl.RedrawItems(iItem,iItem);//重新染色 UpdateWindow();
}为什么我在OnButtonStart();里面直接调用SetItemColor不行呢?void CEMailAssist2Dlg::OnButtonStart()
{
// TODO: Add your control notification handler code here
SetItemColor(0, RGB(0, 255, 0));
}通过设置断点调试,发现根本就没有相应NM_CUSTOMDRAW这个消息,是什么原因啊?请朋友们指点一下,谢谢。
代码如下,好像没有问题,但就是不触发这个消息CMap< DWORD , DWORD& , COLORREF , COLORREF& > MapItemColor;//声明MapItemColor//消息映射
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart)//想通过点击一个按钮直接触发NM_CUSTOMDRAW ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDrawList)//这里 //}}AFX_MSG_MAP
END_MESSAGE_MAP()//{{AFX_MSG(CMyDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButtonStart(); afx_msg void OnCustomDrawList( NMHDR* pNMHDR, LRESULT* pResult );//这里//}}AFX_MSG
void CMyDlg::OnCustomDrawList(NMHDR* pNMHDR, LRESULT* pResult)
{
*pResult = CDRF_DODEFAULT;
NMLVCUSTOMDRAW *lplvdr=(NMLVCUSTOMDRAW*)pNMHDR;
NMCUSTOMDRAW &nmcd = lplvdr->nmcd;
switch(lplvdr->nmcd.dwDrawStage)//判断状态
{
case CDDS_PREPAINT:
{
*pResult = CDRF_NOTIFYITEMDRAW;
break;
}
case CDDS_ITEMPREPAINT://如果为画ITEM之前就要进行颜色的改变
{
COLORREF ItemColor;
if(MapItemColor.Lookup(nmcd.dwItemSpec, ItemColor))
//根据在SetItemColor(DWORD iItem, COLORREF color) 设置的//ITEM号和COLORREF 在摸板中查找,然后进行颜色赋值。
{
lplvdr->clrTextBk = ItemColor;
*pResult = CDRF_DODEFAULT;
}
break;
}
default:
break;
}}void CMyDlg::SetItemColor(DWORD iItem, COLORREF color)
{
MapItemColor.SetAt(iItem, color);//设置某行的颜色。
m_ListCtrl.RedrawItems(iItem,iItem);//重新染色 UpdateWindow();
}为什么我在OnButtonStart();里面直接调用SetItemColor不行呢?void CEMailAssist2Dlg::OnButtonStart()
{
// TODO: Add your control notification handler code here
SetItemColor(0, RGB(0, 255, 0));
}通过设置断点调试,发现根本就没有相应NM_CUSTOMDRAW这个消息,是什么原因啊?请朋友们指点一下,谢谢。
解决方案 »
- SetButtonText问题
- vc怎么获取路由器的IP地址???????
- 基于对话框的MFC程序对话框拖动问题
- 如何检测驱动是否安装
- wxWidgets安装问题,我刚下载下来了一个wxWidgets,但是没有应用程序,我想是要编译配置的,请问如何编译配置?
- 使用UDP发送数据时遇到问题。(ADSL + 路由器),急急急急急急急急急!!!!!
- 好久没来了,大家新年好!!!都来站各喜气吧,25号放假来揭帖~~~
- 怎么在WM_DRAWITEM自画LISTVIEW?
- 解释性语言(脚本语言,标识性语言)可以很多,而且程序员可以自定义语言格式和自己写解析器。但编译性语言过多就是软件的祸患,越多祸患越大!
- 开两个一样的浏览器 用c#语言怎么分别操作第一个和第二个呢
- csplitterWnd 拆分窗口 拆分了三个窗口,固定一个,怎么办
- vc6.0如何让静态文本框画在进度条上
Posted By EasyCsdn1.0