标签:
在描绘MFC界面时,MFC自带的控件样式是绝对不满足界面的需求的。
所以我们就要在MFC自带控件基础上对控件样式进行重绘。
在采用自绘前界面样式
采用自绘后界面样式
是不是自绘控件后看起来正常了很多?
自绘控件的步骤:
我们以做一个关闭按钮为例
附一段代码为例:
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 }
添加OnEraseBkgnd()函数代码,一般都是固定的
1 BOOL CDhsButton::OnEraseBkgnd(CDC* pDC) 2 3 { 4 5 return TRUE; 6 7 }
添加虚函数PreSubclassWindow函数(PreSubclassWindow函数实际上是在CWnd::CeateEx方法中的 AfxHookWindowCreate(this)方法中实现的,AfxHookWindowCreate作用是设置钩子函数,所以你如果想在创建窗口之前将窗口与自己的派生类进行关联,这时候建立前的处理就要在PreSubclassWindow中写。
在PreSubclassWindow函数中,设置ModifyStyle(0, BS_OWNERDRAW);
BS_OWNERDRAW属性是要创建CButton的继承类,并在其中重载DrawItem方法才可以。你要是不想改变Button的外观不要用这个属性。
意思就是如果你要重载派生类按钮中的DrawItem方法,必须要设置了BS_OWNERDRAW 才能重载
7.因为是通过DDX关联的方式,所以在使用上,要用DoDataExchange方法将派生类与资源中的按钮进行关联。
8.添加按钮事件:
标签:
原文地址:http://www.cnblogs.com/poissonnotes/p/4398928.html