快被MFC的控件气得吐血了,我决定做完这个小软件后自己写控件了....
如题,我想改变ListCtrl选中一行时的颜色

解决方案 »

  1.   

    继承OnDrawItem事件,把控件设置成自绘,
    OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
    LPDRAWITEMSTRUCT 有hdc和控件选择状态等,自己随便绘制
      

  2.   


    把控件设置成自绘就不能用InsertItem了,我还想用它的...
      

  3.   

    你可以在NM_CUSTOMDRAW消息处理里面修改iten的state,画完了再改回来
      

  4.   

    VC6只能自己添加NM_CUSTOMDRAW的消息映射。
    做过一次类似的项目之后,下次可以直接把代码复制过来,减少开发时间。如果觉得MFC不方便,可以考虑换其它语言,我现在都是用.net做界面。
      

  5.   

    好像不行,选中那一行只会在程序结束时才瞬间显示一下我设置的颜色?void MyListCtrl2::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
    {
      LPNMLVCUSTOMDRAW lpvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    int index = pNMListView->iItem;
    if   (   CDDS_PREPAINT   ==   lpvcd->nmcd.dwDrawStage   )   
    {   
    *pResult   =   CDRF_NOTIFYITEMDRAW;   
    }   
    else   if   (   CDDS_ITEMPREPAINT   ==   lpvcd->nmcd.dwDrawStage   )   
    {   
    *pResult   =   CDRF_NOTIFYSUBITEMDRAW;   
    }   
    else   if   (   (CDDS_ITEMPREPAINT   |   CDDS_SUBITEM)   ==   lpvcd->nmcd.dwDrawStage   )   
    {
    int   nItem=(int)(lpvcd->nmcd.dwItemSpec);   
    if((GetItemState(nItem,   LVIS_SELECTED)==LVIS_SELECTED))
    {   
    lpvcd->clrText   =   RGB(255,155,255);   
    lpvcd->clrTextBk   =   RGB(255,25,25);

    *pResult   =   CDRF_DODEFAULT;
    }  }
      

  6.   


    用.net做界面的话就要求客户机装.net Framework吧?
      

  7.   

    对。这个是可再发行的,可以带在自己的软件里面发布,而且用.net开发的软件很多,很多电脑上都已经安装好了。
      

  8.   

    使用customdraw,方便好用,codeperject上有一篇文章说的这个。
      

  9.   

    脑袋一发热就打出去了,其实我是想说,自定义customdraw
      

  10.   


    redrawitem在哪里加?在lpvcd->clrTextBk后加吗?
      

  11.   

    可以试试6楼的方法,或者自己绘制选中的Item,然后返回CDRF_SKIPDEFAULT。
      

  12.   

    老实说,CUSTOMDRAW跟OWNERDRAW相比,对简单控件的简单自绘前者好用,对复杂控件或者复杂自绘还是选择后者吧,LISTBOX是简单控件,但LISTCTRL是复杂控件。对于楼主的仅仅修改选中项的颜色来说,用OWNERDRAW的代码量比CUSTOMDRAW的代码量还小。
      

  13.   


    但用了ownerdraw就不能再用InsertItem了,会报错。。
      

  14.   

    参考一下我做过的一个例子:
    void CXXXDlg::OnNMCustomdrawListHistory(NMHDR *pNMHDR, LRESULT *pResult)
    {
    LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
    switch (pNMCD->hdr.code)
    {
    case NM_CUSTOMDRAW:
    LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
    switch(lplvcd->nmcd.dwDrawStage)
    {
    case CDDS_PREPAINT :
    *pResult = CDRF_NOTIFYITEMDRAW;
    return;
    case CDDS_ITEMPREPAINT:
    *pResult = CDRF_NOTIFYSUBITEMDRAW;
    return;
    case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
    if (GetColorOrder(lplvcd->nmcd.dwItemSpec)%2 == 1)
    {
    lplvcd->clrText = RGB(255,0,0);
    lplvcd->clrTextBk = RGB(255,255,0);
    }
    else
    {
    lplvcd->clrText = RGB(0,0,0);
    lplvcd->clrTextBk = RGB(255,255,255);
    }
    *pResult = CDRF_NEWFONT;
    return;
    }
    }
    *pResult = 0;
    }
      

  15.   

    顺便说一句,那是我用vs2002做的,在vc6里头要自己去加那个消息映射,没有wizard可用