WEB开发网
开发学院软件开发VC MFC程序员的WTL指南(6)高级对话框用户界面类 阅读

MFC程序员的WTL指南(6)高级对话框用户界面类

 2006-07-22 22:03:25 来源:WEB开发网   
核心提示: 现在我们需要一个新类实现自画按钮:class CODButtonImpl : public CWindowImpl<CODButtonImpl, CButton>,public COwnerDraw<CODButtonImpl>{public:BEGIN_MSG_M

现在我们需要一个新类实现自画按钮:

class CODButtonImpl : public CWindowImpl<CODButtonImpl, CButton>,
           public COwnerDraw<CODButtonImpl>
{
public:
  BEGIN_MSG_MAP_EX(CODButtonImpl)
    CHAIN_MSG_MAP_ALT(COwnerDraw<CODButtonImpl>, 1)
    DEFAULT_REFLECTION_HANDLER()
  END_MSG_MAP()
  void DrawItem ( LPDRAWITEMSTRUCT lpdis );
};

DrawItem()使用了像BitBlt()这样的GDI函数向按钮的表面画位图,代码应该很容易理解,因为WTL使用的类名和函数名都和MFC类似。

void CODButtonImpl::DrawItem ( LPDRAWITEMSTRUCT lpdis )
{
// NOTE: m_bmp is a CBitmap init''ed in the constructor.
CDCHandle dc = lpdis->hDC;
CDC dcMem;
  dcMem.CreateCompatibleDC ( dc );
  dc.SaveDC();
  dcMem.SaveDC();
  // Draw the button''s background, red if it has the focus, blue if not.
  if ( lpdis->itemState & ODS_FOCUS )
    dc.FillSolidRect ( &lpdis->rcItem, RGB(255,0,0) );
  else
    dc.FillSolidRect ( &lpdis->rcItem, RGB(0,0,255) );
  // Draw the bitmap in the top-left, or offset by 1 pixel if the button
  // is clicked.
  dcMem.SelectBitmap ( m_bmp );
  if ( lpdis->itemState & ODS_SELECTED )
    dc.BitBlt ( 1, 1, 80, 80, dcMem, 0, 0, SRCCOPY );
  else
    dc.BitBlt ( 0, 0, 80, 80, dcMem, 0, 0, SRCCOPY );
  dcMem.RestoreDC(-1);
  dc.RestoreDC(-1);
}

我们的按钮看起来是这个样子:

上一页  1 2 3 4 5 6 7 8  下一页

Tags:MFC 程序员 WTL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接