加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MFC中listControl的用法:字体颜色,列高

(2011-03-02 17:47:20)
标签:

it

分类: VC与C#

改变里面的内容:特别是字体,有二种方法:

  • (一)系统画,但会出现选中时有系统的"蓝条"存在,字体本身的颜色看不到

具体查看:NM_CUSTOMDRAW 的使用方法

 XXX.h中

afx_msg void onCustomDrawList ( NMHDR* pNMHDR, LRESULT* pResult );

 

XXX.cpp

 

 BEGIN_MESSAGE_MAP(CControlListCtrl, CEditableListCtrl)
  //{{AFX_MSG_MAP(CControlListCtrl)
  //}}AFX_MSG_MAP
     ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, onCustomDrawList )
 END_MESSAGE_MAP()

 

void CControlListCtrl::onCustomDrawList( NMHDR* pNMHDR, LRESULT* pResult )
    
 NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );

 if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
 {
  *pResult = CDRF_NOTIFYITEMDRAW;
 }
 else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
 {
  *pResult |= CDRF_DODEFAULT;
  *pResult |= CDRF_NOTIFYSUBITEMDRAW;
 }
 else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage)
 {
  pLVCD->clrText = COLOUR_ALARM;

  std::map<unsigned int, bool>::iterator it =
   m_setValueActionAllowed.find(static_cast<unsigned int>(pLVCD->nmcd.lItemlParam));

  try
  {
   if (it != m_setValueActionAllowed.end() && (*it).second)
   {
    // normal colour
    pLVCD->clrText = COLOUR_NORMAL;   // black
   }
   else
   {
    pLVCD->clrText = COLOUR_DISABLE;  // grey 
   }
  }
  catch(...)
  {
   pLVCD->clrText = COLOUR_DISABLE;  // grey
  }
  if (CONTROL_STATE_COLUMN == pLVCD->iSubItem )
  {
   try
   {
    TA_Base_Bus::EDataPointControlState controlState = noControl;
    TA_Base_Bus::DataPointProxySmartPtr& dataPoint = m_equipment->getChildDataPoint(static_cast<unsigned int>(pLVCD->nmcd.lItemlParam));
    controlState = dataPoint->getControlState();

    if ((controlState == LCC_failed) ||
     (controlState == RCC_failed) ||
     (controlState == comms_failed))
    {
    pLVCD->clrText = COLOUR_ALARM;    // red      
    }
   }
   catch (...)
   {
      
  }
  *pResult = CDRF_DODEFAULT;      
 }

}

  • (二)自己画,将LIST属性表中的owner draw fixed设成true.然后得载DrawItem
  • 此时可以自己画不受系统的选中颜色干扰

void TrainList::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 TCHAR lpBuffer[256];

 LV_COLUMN lvc, lvcprev ;
 ::ZeroMemory(&lvc, sizeof(lvc));
 lvc.mask = LVCF_WIDTH | LVCF_FMT;
 long hight = 0;
 for ( int nCol=0; GetColumn(nCol, &lvc); nCol++)
 {
  lpDrawItemStruct->rcItem.left += hight ;
  lpDrawItemStruct->rcItem.right += hight ;
  hight = lvc.cx ;

  LV_ITEM lvi;
  ::ZeroMemory(&lvi, sizeof(lvi));
  lvi.iItem = lpDrawItemStruct->itemID;
  lvi.mask = LVIF_TEXT | LVIF_PARAM;
  lvi.iSubItem = nCol;
  lvi.pszText = lpBuffer;
  lvi.cchTextMax = sizeof(lpBuffer);
  VERIFY(GetItem(&lvi));

  CDC* pDC;
  pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

  if ( lpDrawItemStruct->itemState & ODS_SELECTED )
  {
   pDC->FillSolidRect(&lpDrawItemStruct->rcItem,RGB(231, 243, 229)) ;
   pDC->SetTextColor(RGB(255, 0, 0)) ;
  }
  else
  {
   pDC->FillSolidRect(&lpDrawItemStruct->rcItem, GetSysColor(COLOR_WINDOW)) ;
   pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT)) ;
  }
  //CFont lfont;
  //lfont.CreateFont(14, 0, 0, 0, FW_BOLD ,0, 1, 0, GB2312_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH ,"Consolas");
  //CFont* pold = pDC->SelectObject(&lfont);

  ::DrawText(lpDrawItemStruct->hDC, lpBuffer, strlen(lpBuffer), &lpDrawItemStruct->rcItem, DT_LEFT) ;

  //pDC->SelectStockObject(SYSTEM_FONT) ;
 }
}

 

(三)这个是用来设置行高的.这个做得很不好...

CImageList m_imagelist;

 m_imagelist.Create(48, 48, ILC_COLOR32 , 5, 5);
 this->m_ListCtr.SetImageList(&m_imagelist, LVSIL_SMALL);

 

(四)这个是用来设置字体写入的位置

void CControlListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
 {

    CRect lrect = lpDrawItemStruct->rcItem;
    lrect.DeflateRect(85, 0, 0, 0);

    DrawText(lpDrawItemStruct->hDC, lpBuffer, strlen(lpBuffer), &lrect, DT_LEFT) ;

http://s15/middle/52cbfc3fg9d8b8ca471ce&690


void CNewListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 TRACE("need draw item\n");
 CDC *pdc = CDC::FromHandle(lpDrawItemStruct->hDC);
 CRect lrect = lpDrawItemStruct->rcItem;
 CBrush lb;
 lb.CreateSolidBrush(RGB(234,233, 225));
 pdc->FrameRect(&lrect, &lb);
 lrect.DeflateRect(0, 0, 1, 1);

 
 LVITEM rItem;
 char buf[255];
 rItem.mask = LVIF_TEXT | LVIF_STATE;
 rItem.iItem = lpDrawItemStruct->itemID;
 rItem.iSubItem = 1;
 memset(buf, 0, 255);
 rItem.pszText = buf;
 rItem.cchTextMax = 255;
 rItem.stateMask = LVIS_SELECTED;
 BOOL ret = this->GetItem(&rItem);

 if (rItem.state & LVIS_SELECTED)
  pdc->FillSolidRect(lrect, RGB(231, 243, 229));
 else
  pdc->FillSolidRect(lrect, RGB(255, 255, 255));
  

 CDC ldc;
 ldc.CreateCompatibleDC(pdc);
 CBitmap lbmp;
 lbmp.CreateCompatibleBitmap(pdc, ICON_SHOW_SIZE, ICON_SHOW_SIZE);
 ldc.SelectObject(lbmp);
 //ldc.DrawIcon(0, 0, m_hIcon);
 m_imagelist.Draw(&ldc, lpDrawItemStruct->itemID % 2, CPoint(0, 0), ILD_TRANSPARENT);
 BLENDFUNCTION ab;
 ab.BlendOp = AC_SRC_OVER;
 ab.BlendFlags = 0;
 ab.SourceConstantAlpha = 0xFF;
 ab.AlphaFormat = AC_SRC_ALPHA;

 AlphaBlend(pdc->GetSafeHdc(), lrect.left, lrect.top, ICON_SHOW_SIZE, ICON_SHOW_SIZE, ldc.GetSafeHdc(), 0, 0, ICON_SHOW_SIZE, ICON_SHOW_SIZE, ab);

 CFont lfont;
 lfont.CreateFont(12, 0, 0, 0, FW_BOLD ,0, 1, 0, GB2312_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH ,"宋体");
 CFont* pold = pdc->SelectObject(&lfont);


 lrect.DeflateRect(ICON_SHOW_SIZE + 2, 6, 0, 0);
 pdc->DrawText("ACESEE 10", lrect, DT_LEFT | DT_TOP | DT_SINGLELINE);
 pdc->SelectObject(pold);

 CString itemtext = rItem.pszText;
 pdc->SetTextColor(RGB(223, 0, 0));
 lrect.DeflateRect(85, 0, 0, 0);
 pdc->DrawText("热", lrect, DT_LEFT | DT_TOP | DT_SINGLELINE);


 pdc->SetTextColor(RGB(0,128,0));
 lrect.DeflateRect(-85, 17, 0, 0);
 pdc->DrawText(itemtext, lrect, DT_VCENTER | DT_LEFT | DT_SINGLELINE);
 pdc->SetTextColor(RGB(0,0,0));


}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有