MFC中用Clist列表框的控件来显示数据库的问题 5C

各位高手大神,你们好:
我现在有一个问题:利用ADO读取一个文件(其实本质上是ACCSESS数据库),但是在读取的过程中,比如通过判断“状态”这个字段的值(其实这个字段只保存了两个不同的字符,不是‘E’就是‘N’),来决定这一行(不是一个单元格)显示的背景颜色,这个功能如何实现?
通过消息NM-CUSTOMDRAW?
本人菜鸟一个,不知道有没有说清楚,希望水平高的程序员帮我解解惑,不胜感激!
贴上部分代码:
在类内最开始的位置定义了一个全局变量 int型的flag=1,读取数据库的代码如下
while(!m_pRecordset->adoEOF)
{ m_Grid.InsertItem(0,"");
CString str= (char*)(_bstr_t)m_pRecordset->GetCollect("valid");

        if("E"==str)
        {
            str="有效";
            flag=1;
        }
        else
        {
            str="无效";
            flag=0;
        }

        m_Grid.SetItemText(0,0,str);//设置无效和有效
        }


        消息响应函数的代码如下:

        void CDBDlg::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)

{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast( pNMHDR );

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

// 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 )
    {


            switch (flag)
            {                           
            case 0:
                //MessageBox("3");
                pLVCD->clrTextBk=RGB(0,0,100);
                pLVCD->clrText=RGB(100,0,0);
                    break;

            case 1:
            //  MessageBox("2");
                pLVCD->clrTextBk=RGB(100,0,0);
                pLVCD->clrText=RGB(0,100,0);
                break;
            }
        *pResult = CDRF_DODEFAULT;
    }

}
代码运行的结果显示flag恒为1,不知道为什么

5个回答

你先拿到数据库的返回值,然后再调用drawitem等来修改ListCtrl的颜色

Ewenyee
Ewenyee 能有具体一点的例子么?比如drawirem怎么实现的问题
4 年多之前 回复

拿到数据,list实例化,if判断选择

DrawItem虚函数中绘制

能有具体一点的例子吗?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问