CLIstCtrl更改行颜色!

    技术2022-05-11  7

    void   CListCtrlPro::DrawItem(LPDRAWITEMSTRUCT   lpDrawItemStruct)     {     //得到dc     LPDRAWITEMSTRUCT   lpDIS   =   lpDrawItemStruct;     CDC*   pDC   =   CDC::FromHandle(lpDIS->hDC);         LVITEM   lvi   =   {0};     lvi.mask   =   LVIF_STATE;//|LVIF_IMAGE;     lvi.stateMask   =   LVIS_FOCUSED   |   LVIS_SELECTED   ;     lvi.iItem   =   lpDIS->itemID;     BOOL   bGet   =   GetItem(&lvi);         BOOL   bHighlight   =((lvi.state   &   LVIS_DROPHILITED)||                                         (   (lvi.state   &   LVIS_SELECTED)   &&                         (             (GetFocus()   ==   this)||   (GetStyle()   &   LVS_SHOWSELALWAYS)               )                 )               );         //   画文本背景     CRect   rcBack   =   lpDIS->rcItem;     CMemDC   dc(pDC,rcBack);     dc.SetBkMode(TRANSPARENT);     if(   bHighlight   )     {     dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));     dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));         dc.FillRect(rcBack,   &CBrush(::GetSysColor(COLOR_HIGHLIGHT)));     }     else     {     dc.SetTextColor(0x0C0F80);     if   (lpDIS->itemID%2   ==0)     dc.FillRect(rcBack,   &CBrush(0xEEF1E3));     else     dc.FillRect(rcBack,   &CBrush(0xE3e3e3));     }         //设置字体颜色     CString   str;         //得到焦点大小     CRect   rcFocus   =   lpDIS->rcItem;     rcFocus.DeflateRect(1,1,1,1);         if   (lpDIS->itemAction   &   ODA_DRAWENTIRE)     {     //写文本     CString   szText;         //设置字体         //返回当前选择的CFont的指针,获得Windows默认的字体     CFont*   font   =   CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT));     CFont*   pOldFont   =   dc.SelectObject(font);     /*     font.DeleteObject();     LOGFONT   lf={0};     pDC->GetCurrentFont()->GetLogFont(&lf);     lf.lfHeight   =13;//   -13;//14;     //与Windows字体关联     font.CreateFontIndirect(&lf);     */     for   (int   i   =   0;   i   <   GetColumnCount();   i++)     {   //循环得到文本     CRect   rcItem;     if   (   !GetSubItemRect(lpDIS->itemID,   i,   LVIR_LABEL,   rcItem   ))     continue;     szText   =   GetItemText(   lpDIS->itemID,   i   );         rcItem.left   +=   5;   rcItem.right   -=   1;     dc.DrawText(szText,   lstrlen(szText),   &rcItem,   DT_VCENTER|DT_NOPREFIX|DT_SINGLELINE);     }     dc.SelectObject(pOldFont);     }         }

     

     

     

     

     

     

     

     

     

     

    2008-01-30 | 找了一天,改变CListCtrl控件指定行颜色的方法终于找到

    标签: CListCtrl  颜色   

    昨天晚上就把SSDT查看/恢复工具编写完毕,但美中不足的是,对于修改过的SSDT项在用CListCtrl列出来后,无法修改指定这行的颜色!郁闷中,今天下午起来又继续找方法,最后终于找到了,我的工具也可以说是圆满结束了!

    首先是添加以下消息

    ON_NOTIFY( NM_CUSTOMDRAW, IDC_LIST1, OnDrawColorForMyList )  //为改变颜色添加的消息

    再添加类成员函数,就OK了:

    //改变 m_List 控件单行的颜色void CSSDTDlg::OnDrawColorForMyList( NMHDR *pNmHdr, LRESULT *pResult ){ NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNmHdr );

        *pResult = CDRF_DODEFAULT;

     if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage ) {        *pResult = CDRF_NOTIFYITEMDRAW; }    else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage ) {        *pResult = CDRF_NOTIFYSUBITEMDRAW; }    else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage ) {  COLORREF clrNewTextColor, clrNewBkColor;          int    nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );

      //如果当前SSDT地址与原始地址不一样,则显示字体为红色,否则为黑色  if( /   ((pSSDTSaveTable)((ULONG)pSSDTST + nItem * sizeof(SSDTSaveTable)))->ulCurrentFunctionAddress /   != ((pSSDTSaveTable)((ULONG)pSSDTST + nItem * sizeof(SSDTSaveTable)))->ulOriginalFunctionAddress /   )  //设置为红色  {   clrNewTextColor = RGB( 255, 0, 0 );  }  else  //设置为黑色  {   clrNewTextColor = RGB( 0, 0, 0 );  }

      //设置背景色  if( nItem%2 ==0 )  {   clrNewBkColor = RGB( 240, 240, 240 ); //偶数行背景色为灰色  }  else  {   clrNewBkColor = RGB( 255, 255, 255 ); //奇数行背景色为白色  }

      pLVCD->clrText = clrNewTextColor;  pLVCD->clrTextBk = clrNewBkColor;

            *pResult = CDRF_DODEFAULT; }}

     

     

     

    高亮及取消高亮

     

       m_List.SetItemState(0,LVIS_DROPHILITED,LVIS_DROPHILITED);   UINT   nState=m_List.GetItemState(1,LVIF_STATE);      nState&=!nState;      m_List.SetItemState(1,nState,LVIF_STATE);

     


    最新回复(0)