我照网上的代码改变Clistctrl单元格的颜色,用hitsubitem捕捉单元格后,SetItemColor(25,3,RGB(255,0,0));//改变25行3列为红色。
updatadata(true);//我也试过updatadata(false);前几天实现的很好,今天不知什么原因,鼠标点击单元格后,不立即变色,必须有另外一个窗口覆盖该单元格再挪开,颜色才改变。请教大家如何处理。下面是网上的代码:BEGIN_MESSAGE_MAP(CColorListCtrl, CListCtrl)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw)
END_MESSAGE_MAP() COLORREF CColorListCtrl::SetItemColor(int nRow, int nCol, COLORREF clrItem)
{
int nCols = GetHeaderCtrl()-> GetItemCount();
int nRows = GetItemCount();
if (nCol > = nCols || nRow > = nRows)
return COLORREF(-1); for (int i = m_lstItemColor.GetCount(); i < nRow + 1; i++)
{
COLORREF *clrCol = new COLORREF[nCols];
ZeroMemory(clrCol, sizeof(clrCol));
m_lstItemColor.AddTail(clrCol);
} for (int i = 0; i < nRows; i++)
{
if (i == nRow)
{
COLORREF *clrCol = m_lstItemColor.GetAt(m_lstItemColor.FindIndex(nRow));
COLORREF clrRet = clrCol[nCol];
clrCol[nCol] = clrItem;
return clrRet;
}
} return COLORREF(-1);
} void CColorListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLVCUSTOMDRAW pNMCD = reinterpret_cast <LPNMLVCUSTOMDRAW> (pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0; int nRows = m_lstItemColor.GetCount();
int nRow = int(pNMCD-> nmcd.dwItemSpec);
COLORREF *clrCol = NULL;
if (nRows && nRow < nRows)
{
clrCol = m_lstItemColor.GetAt(m_lstItemColor.FindIndex(nRow));
} switch(pNMCD-> nmcd.dwDrawStage)
{
case CDDS_PREPAINT :
*pResult = CDRF_NOTIFYITEMDRAW;
return; case CDDS_ITEMPREPAINT:
if (clrCol)
pNMCD-> clrText = clrCol[0];
*pResult = CDRF_NOTIFYSUBITEMDRAW;
return; case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
if (clrCol)
pNMCD-> clrText = clrCol[pNMCD-> iSubItem];
*pResult = CDRF_NEWFONT;
return;
} }
updatadata(true);//我也试过updatadata(false);前几天实现的很好,今天不知什么原因,鼠标点击单元格后,不立即变色,必须有另外一个窗口覆盖该单元格再挪开,颜色才改变。请教大家如何处理。下面是网上的代码:BEGIN_MESSAGE_MAP(CColorListCtrl, CListCtrl)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw)
END_MESSAGE_MAP() COLORREF CColorListCtrl::SetItemColor(int nRow, int nCol, COLORREF clrItem)
{
int nCols = GetHeaderCtrl()-> GetItemCount();
int nRows = GetItemCount();
if (nCol > = nCols || nRow > = nRows)
return COLORREF(-1); for (int i = m_lstItemColor.GetCount(); i < nRow + 1; i++)
{
COLORREF *clrCol = new COLORREF[nCols];
ZeroMemory(clrCol, sizeof(clrCol));
m_lstItemColor.AddTail(clrCol);
} for (int i = 0; i < nRows; i++)
{
if (i == nRow)
{
COLORREF *clrCol = m_lstItemColor.GetAt(m_lstItemColor.FindIndex(nRow));
COLORREF clrRet = clrCol[nCol];
clrCol[nCol] = clrItem;
return clrRet;
}
} return COLORREF(-1);
} void CColorListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLVCUSTOMDRAW pNMCD = reinterpret_cast <LPNMLVCUSTOMDRAW> (pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0; int nRows = m_lstItemColor.GetCount();
int nRow = int(pNMCD-> nmcd.dwItemSpec);
COLORREF *clrCol = NULL;
if (nRows && nRow < nRows)
{
clrCol = m_lstItemColor.GetAt(m_lstItemColor.FindIndex(nRow));
} switch(pNMCD-> nmcd.dwDrawStage)
{
case CDDS_PREPAINT :
*pResult = CDRF_NOTIFYITEMDRAW;
return; case CDDS_ITEMPREPAINT:
if (clrCol)
pNMCD-> clrText = clrCol[0];
*pResult = CDRF_NOTIFYSUBITEMDRAW;
return; case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
if (clrCol)
pNMCD-> clrText = clrCol[pNMCD-> iSubItem];
*pResult = CDRF_NEWFONT;
return;
} }
解决方案 »
- 实时像素扫描框,各位大虾请进~
- 关于类指针的请教
- 问个ATLTRACE输出BSTR的问题
- 使用windows管道,要获取控制台(cmd)输出结果,可是ReadFile只能读1024字节,不知问什么?
- 『急救!!!』在VC下获得了Delphi做的执行程序中一个TMemo类型控件的句柄,但是如何控制改控件的文本内容?
- 怎样改变树形控件的字体大小啊?求救!
- 应用CSerialPort类编写基于dialog的MFC应用程序时出现linking错误...(在线等大侠指教)
- 请问大伙,能不能修改CEditView类的容量,它好像只能容纳16k字节的内容
- 改变控件大小的问题
- 请问高手,如何在VC++中调用EXCEL的相关组件?
- 关于网页上的验证码,用VC怎么做识别?
- 如何将制作好的activex控件嵌入到html网页中(急死了)
Invalidate(TRUE);
UpdataWindow();