文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>CListCtrl行高的修改

CListCtrl行高的修改

时间:2010-10-09  来源:ribut9225

CListCtrl行高的修改

用一个空白Image撑起来就可以了
CImageList   m_l;
m_l.Create(1,24,TRUE|ILC_COLOR32,1,0);
m_list.SetImageList(&m_l,LVSIL_SMALL);

我也认为重载CListCtrl::DrawItem函数能自绘item,但实际上子类的DrawItem死活没反应。不知道怎么回事。style已设置好了的。奇怪!

   谁能告诉我为什么?

 

=============================

 

解决方案:

   1. 设置List Control的属性 Owen Draw Fixed.//我RALF曾经试过,直接用鼠标拉个控件上去勾选上不行,除非自己创建m_lst.Create(LVS_OWNERDRAWFIXED | WS_VISIBLE  |LVS_REPORT  , CRect(40,80,670,491),this,UINT(1701));否则许多虚函数都不会运行,包括MeasureItem消息也不产生。

   2. 自定义CMyListCtrl, 继承于CListCtrl,并重载CListCtrl::DrawItem.
         必须重载DrawItem函数,而不能自己处理WM_DRAWITEM,否则MFC处理时运行到CListCtrl::DrawItem会抱错。( 此函数的内容只有一条语句: ASSERT(FALSE),所以,坚决不能运行^_^)(转注:WM_DRAWITEM消息貌似也是发送给Control的Owner的。List Control接收不到该消息。)

   3. 为List Control所在的对话框添加对WM_MEASUREITEM消息的处理OnMeasureItem。在响应过程中修改结构中的itemHeight参数。

注意: 不能简单地在CMyListCtrl中响应WM_MEASUREITEM消息,原因很简单,它根本收不到此消息。如果要更好的实现,可以提供一个CMyListCtrl::MeasureItem的函数,在对话框的消息OnMeasureItem中,调用此方法。

以下DrawItem实现片断:


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

LV_ITEM lvi;

lvi.mask = LVIF_TEXT | LVIF_PARAM ;
lvi.iItem = lpDrawItemStruct->itemID ;
lvi.iSubItem = 0;
lvi.pszText = lpBuffer ;
lvi.cchTextMax = sizeof(lpBuffer);
VERIFY(GetItem(&lvi));

LV_COLUMN lvc, lvcprev ;
::ZeroMemory(&lvc, sizeof(lvc));
::ZeroMemory(&lvcprev, sizeof(lvcprev));
lvc.mask = LVCF_WIDTH | LVCF_FMT;
lvcprev.mask = LVCF_WIDTH | LVCF_FMT;

for ( int nCol=0; GetColumn(nCol, &lvc); nCol++)
{
   if ( nCol > 0 )
   {
    // Get Previous Column Width in order to move the next display item
    GetColumn(nCol-1, &lvcprev) ;
    lpDrawItemStruct->rcItem.left += lvcprev.cx ;
    lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left ;
   }

   // Get the text
   ::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, GetSysColor(COLOR_HIGHLIGHT)) ;
    pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT)) ;
   }
   else
   {
    pDC->FillSolidRect(&lpDrawItemStruct->rcItem, GetSysColor(COLOR_WINDOW)) ;
    pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT)) ;
   }
 
   pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));

   UINT   uFormat    = DT_LEFT ;

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

   pDC->SelectStockObject(SYSTEM_FONT) ;
}
}

以上代码来自codeproject:

相关阅读 更多 +
排行榜 更多 +
枪战大乱斗2

枪战大乱斗2

飞行射击 下载
猎鸭挑战安卓版

猎鸭挑战安卓版

飞行射击 下载
空军

空军

飞行射击 下载