码迷,mamicode.com
首页 > 编程语言 > 详细

MFC之自绘控件

时间:2015-04-07 19:05:31      阅读:376      评论:0      收藏:0      [点我收藏+]

标签:

 

在描绘MFC界面时,MFC自带的控件样式是绝对不满足界面的需求的。

所以我们就要在MFC自带控件基础上对控件样式进行重绘。

技术分享

在采用自绘前界面样式

 

技术分享

采用自绘后界面样式

 

是不是自绘控件后看起来正常了很多?

自绘控件的步骤:

我们以做一个关闭按钮为例

  1. 先创建一个MFC类继承自CButton。
  2. 给这个类添加 一个虚函数DrawItem()和 一个afx BOOL OnEraseBkgnd()函数(一般以afx开头的函数都会在消息映射里面有一条映射)
  3. DrawItem()是控件的自绘处理函数,在这个函数中可以对控件的样式进行描绘。

    附一段代码为例: 

      1 void CDhsButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
      2 
      3 {
      4 
      5     CDC* pDC= CDC::FromHandle(lpDrawItemStruct->hDC);
      6 
      7     CRect rect = &lpDrawItemStruct->rcItem;
      8 
      9     UINT uID = lpDrawItemStruct->CtlID;
     10 
     11  
     12 
     13     Graphics g(pDC->m_hDC);
     14 
     15     g.SetSmoothingMode(SmoothingModeHighQuality);
     16 
     17  
     18 
     19     if (::GetWindowLong(m_hWnd, GWL_STYLE) & WS_DISABLED)
     20 
     21     {
     22 
     23         if (m_pImageDisable != NULL)
     24 
     25             g.DrawImage(m_pImageDisable, 0, 0, rect.Width(), rect.Height());
     26 
     27         else
     28 
     29             g.DrawImage(m_pImageNormal, 0, 0, rect.Width(), rect.Height());
     30 
     31     }
     32 
     33     else if (m_nMouseState == Down)
     34 
     35     {
     36 
     37         if (m_pImageOver != NULL)
     38 
     39             g.DrawImage(m_pImageOver, 0, 0, rect.Width(), rect.Height());
     40 
     41         else
     42 
     43             g.DrawImage(m_pImageNormal, 0, 0, rect.Width(), rect.Height());
     44 
     45     }
     46 
     47     else if (m_bSelected)
     48 
     49     {
     50 
     51         if (m_pImageSelected != NULL)
     52 
     53             g.DrawImage(m_pImageSelected, 0, 0, rect.Width(), rect.Height());
     54 
     55         else
     56 
     57             g.DrawImage(m_pImageNormal, 0, 0, rect.Width(), rect.Height());
     58 
     59     }
     60 
     61     else
     62 
     63     {
     64 
     65         g.DrawImage(m_pImageNormal, 0, 0, rect.Width(), rect.Height());
     66 
     67     }
     68 
     69  
     70 
     71     if (!m_strCaption.IsEmpty())
     72 
     73     {
     74 
     75         rect.left += 5;
     76 
     77  
     78 
     79         if (::GetWindowLong(m_hWnd, GWL_STYLE) & WS_DISABLED)
     80 
     81         {
     82 
     83             PublicFun::GDIDrawText(pDC, m_strCaption, rect, m_pFont, RGB(120, 120, 120), FALSE, TRUE);
     84 
     85         }
     86 
     87         else if (m_bSelected)
     88 
     89         {
     90 
     91             PublicFun::GDIDrawText(pDC, m_strCaption, rect, m_pFont, RGB(0, 0, 0), FALSE, TRUE);
     92 
     93         }
     94 
     95         else if (m_nMouseState == Over)
     96 
     97         {
     98 
     99             PublicFun::GDIDrawText(pDC, m_strCaption, rect, m_pFont, RGB(0, 0, 0), FALSE, TRUE);
    100 
    101         }
    102 
    103         else
    104 
    105         {
    106 
    107             PublicFun::GDIDrawText(pDC, m_strCaption, rect, m_pFont, RGB(0, 0, 0), FALSE, TRUE);
    108 
    109         }
    110 
    111     }
    112 
    113  
    114 
    115     ReleaseDC(pDC);
    116 
    117 }
  4. 添加OnEraseBkgnd()函数代码,一般都是固定的

    1 BOOL CDhsButton::OnEraseBkgnd(CDC* pDC)
    2 
    3 {
    4 
    5 return TRUE;
    6 
    7 }

     

  5. 添加虚函数PreSubclassWindow函数(PreSubclassWindow函数实际上是在CWnd::CeateEx方法中的 AfxHookWindowCreate(this)方法中实现的,AfxHookWindowCreate作用是设置钩子函数,所以你如果想在创建窗口之前将窗口与自己的派生类进行关联,这时候建立前的处理就要在PreSubclassWindow中写。

  6. 具体来说,
  • 如果你定义一个窗口(CButton派生类CMyButton),然后使用对话框数据交换比如通过DDX将一个按钮与自己的派生类对象关联,这时候,一些"建立前"的处理就应该写在"PreSubclassWindow"中。 
  • 如果你用的不是"对话框数据关联",而是在OnInitDialg中自己创建.这时候,一些"建立前"的处理就应该写在   "PreCreateWindow"中。

在PreSubclassWindow函数中,设置ModifyStyle(0, BS_OWNERDRAW);

BS_OWNERDRAW属性是要创建CButton的继承类,并在其中重载DrawItem方法才可以。你要是不想改变Button的外观不要用这个属性。

意思就是如果你要重载派生类按钮中的DrawItem方法,必须要设置了BS_OWNERDRAW 才能重载

 

  7.因为是通过DDX关联的方式,所以在使用上,要用DoDataExchange方法将派生类与资源中的按钮进行关联。技术分享

 

  8.添加按钮事件:

技术分享

MFC之自绘控件

标签:

原文地址:http://www.cnblogs.com/poissonnotes/p/4398928.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!