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

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

 2008-01-19 20:25:19 来源:WEB开发网   
核心提示:对于ControlMania2,它从ControlMania1中的树控件开始,MFC程序员WTL指南(6)高级对话框用户界面类(3),添加了自画按钮处理反射的WM_DRAWITEM消息,下面是资源编辑器中的新按钮:现在我们需要一个新类实现自画按钮:class CODButtonImpl : public CWindow

对于ControlMania2,它从ControlMania1中的树控件开始,添加了自画按钮处理反射的WM_DRAWITEM消息,下面是资源编辑器中的新按钮:

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

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

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