使用图像列表设置表头图像

翻译|其它|编辑:郝浩|2006-06-21 10:24:00.000|阅读 1658 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>


虽然我们可用直接指定位图设置表头图像,但我们也可以使用图像列表设置表头图像。

步骤一:从CHeaderCtrl类导出CMyHeaderCtrl类。

步骤二:添加变量

protected:
CImageList* m_pImageList;
CMap m_mapImageIndex;

步骤三:在构造函数中初始化变量

m_pImageList=NULL;

步骤四:加入下列函数

CImageList* CMyHeaderCtrl::SetImageList( CImageList* pImageList )
{
   CImageList *pPrevList = m_pImageList;
   m_pImageList = pImageList;
   return pPrevList;
}

int CMyHeaderCtrl::GetItemImage( int nItem )
{
   int imageIndex;
   if( m_mapImageIndex.Lookup( nItem, imageIndex ) )
   return imageIndex;
   return -1;
}

void CMyHeaderCtrl::SetItemImage( int nItem, int nImage )
{
   // Save the image index
   m_mapImageIndex[nItem] = nImage;

   // Change the item to ownder drawn
   HD_ITEM hditem;

   hditem.mask = HDI_FORMAT;
   GetItem( nItem, &hditem );
   hditem.fmt |= HDF_OWNERDRAW;
   SetItem( nItem, &hditem );

   // Invalidate header control so that
   // it gets redrawn

   Invalidate();
}

步骤五:重载Drawitem()函数

void CMyHeaderCtrl::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
   CDC dc;

   dc.Attach( lpDrawItemStruct->hDC );

   // Get the column rect
   CRect rcLabel( lpDrawItemStruct->rcItem );

   // Save DC
   int nSavedDC = dc.SaveDC();

   // Set clipping region to limit drawing within column
   CRgn rgn;
   rgn.CreateRectRgnIndirect( &rcLabel );
   dc.SelectObject( &rgn );
   rgn.DeleteObject();

   // Labels are offset by a certain amount
   // This offset is related to the width of
   // a space character

   int offset = dc.GetTextExtent(_T(" "), 1 ).cx*2;


  // Draw image from image list
  int imageIndex;
  if (m_pImageList &&
  m_mapImageIndex.Lookup( lpDrawItemStruct->itemID, imageIndex ) )
   {
     if( imageIndex != -1 )
      {
         m_pImageList->Draw(&dc, imageIndex,
         CPoint( rcLabel.left + offset,offset/3 ),
         ILD_TRANSPARENT );

         // Now adjust the label rectangle
         IMAGEINFO imageinfo;
         if( m_pImageList->GetImageInfo( imageIndex, &imageinfo ) )
          {
             rcLabel.left += offset/2 +
             imageinfo.rcImage.right - imageinfo.rcImage.left;
          }
      }
   }

// Get the column text and format
TCHAR buf[256];
HD_ITEM hditem;

hditem.mask = HDI_TEXT | HDI_FORMAT;
hditem.pszText = buf;
hditem.cchTextMax = 255;

GetItem( lpDrawItemStruct->itemID, &hditem );

// Determine format for drawing column label
UINT uFormat = DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP
| DT_VCENTER | DT_END_ELLIPSIS ;

if( hditem.fmt & HDF_CENTER)
   uFormat |= DT_CENTER;
    else if( hditem.fmt & HDF_RIGHT)
         uFormat |= DT_RIGHT;
    else
uFormat |= DT_LEFT;

// Adjust the rect if the mouse button is pressed on it
if( lpDrawItemStruct->itemState == ODS_SELECTED )
{
   rcLabel.left++;
   rcLabel.top += 2;
   rcLabel.right++;
}

rcLabel.left += offset;
rcLabel.right -= offset;

// Draw column label
if( rcLabel.left < rcLabel.right )
dc.DrawText(buf,-1,rcLabel, uFormat);

// Restore dc
dc.RestoreDC( nSavedDC );

// Detach the dc before returning
dc.Detach();
}

步骤六:在列表类中加入列表头类变量

步骤七:调用PreSubclassWindow,使DrawItem函数被调用。

void CMyListCtrl::PreSubclassWindow()
{
    CListCtrl::PreSubclassWindow();

    // Add initialization code
    m_headerctrl.SubclassWindow(
    ::GetDlgItem(m_hWnd,0) );
}
步骤八:调用SetImageList() and SetItemImage()设置图像。
 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP