這是一個按鈕自繪的架構,其他控件也類似
<code>//.h頭檔案</code>
<code>#pragma once</code>
<code>#include "afxwin.h"</code>
<code>#include "MemDC.h"//封裝記憶體DC類</code>
<code>class</code> <code>CYuButton :</code><code>public</code> <code>CWnd</code>
<code>{</code>
<code> </code><code>private</code><code>:</code>
<code> </code><code>BOOL</code> <code>m_bIsDown;</code>
<code> </code><code>CString m_sCaption;</code>
<code> </code><code>public</code><code>:</code>
<code> </code><code>DECLARE_DYNCREATE(CYuButton)</code>
<code> </code><code>CYuButton(</code><code>void</code><code>);</code>
<code> </code><code>virtual</code> <code>~CYuButton(</code><code>void</code><code>);</code>
<code> </code><code>BOOL</code> <code>Create(</code><code>LPCTSTR</code> <code>sCpation,</code><code>DWORD</code> <code>dwStyle,CONST CRect & rt,</code>
<code> </code><code>CWnd * pParendWnd,</code><code>UINT</code> <code>uId);</code>
<code> </code>
<code> </code><code>afx_msg </code><code>void</code> <code>OnNcPaint();</code>
<code> </code><code>afx_msg </code><code>BOOL</code> <code>OnEraseBkgnd(CDC* pDC);</code>
<code> </code><code>afx_msg </code><code>void</code> <code>OnPaint();</code>
<code> </code><code>afx_msg </code><code>void</code> <code>OnLButtonDown(</code><code>UINT</code> <code>nFlags, CPoint point);</code>
<code> </code><code>afx_msg </code><code>void</code> <code>OnLButtonUp(</code><code>UINT</code> <code>nFlags, CPoint point);</code>
<code> </code><code>afx_msg </code><code>void</code> <code>OnKillFocus(CWnd* pNewWnd);</code>
<code> </code><code>DECLARE_MESSAGE_MAP()</code>
<code> </code><code>//滑鼠按下</code>
<code> </code><code>void</code> <code>DrawDown(CDC * pDC);</code>
<code> </code><code>void</code> <code>DrawNormal(CDC * pDC);</code>
<code> </code><code>//滑鼠移動</code>
<code> </code><code>void</code> <code>DrawMove(CDC * pDC);</code>
<code> </code>
<code> </code><code>//擷取目前程式路徑</code>
<code> </code><code>CString GetApplicationPath();</code>
<code>public</code><code>:</code>
<code> </code><code>//修改按鈕狀态</code>
<code> </code><code>void</code> <code>SetNormalStatus();</code>
<code>};</code>
<code>//.cpp檔案</code>
<code>#include "StdAfx.h"</code>
<code>#include "YuButton.h"</code>
<code>CYuButton::CYuButton(</code><code>void</code><code>)</code>
<code> </code><code>//WNDCLASS wd={CS_VREDRAW|CS_HREDRAW,::DefWindowProc};</code>
<code> </code><code>//wd.lpszClassName = _T("YUButton"); </code>
<code>}</code>
<code>CYuButton::~CYuButton(</code><code>void</code><code>)</code>
<code>BOOL</code> <code>CYuButton::Create(</code><code>LPCTSTR</code> <code>sCaption,</code><code>DWORD</code> <code>dwStyle,CONST CRect & rt,</code>
<code> </code><code>CWnd * pParendWnd,</code><code>UINT</code> <code>uId)</code>
<code>{ </code>
<code> </code><code>LPCTSTR</code> <code>lpszClassName = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW, </code>
<code> </code><code>AfxGetApp()->LoadStandardCursor(IDC_ARROW),</code>
<code> </code><code>(</code><code>HBRUSH</code><code>)GetStockObject(LTGRAY_BRUSH), NULL);</code>
<code> </code>
<code> </code><code>m_sCaption = sCaption;</code>
<code> </code><code>return</code> <code>CWnd::Create(lpszClassName,sCaption,dwStyle|WS_CHILD|WS_VISIBLE,</code>
<code> </code><code>rt,pParendWnd,uId);</code>
<code>IMPLEMENT_DYNCREATE(CYuButton, CWnd)</code>
<code>BEGIN_MESSAGE_MAP(CYuButton, CWnd)</code>
<code> </code><code>ON_WM_ERASEBKGND()</code>
<code> </code><code>ON_WM_PAINT()</code>
<code> </code><code>ON_WM_LBUTTONDOWN()</code>
<code> </code><code>ON_WM_LBUTTONUP()</code>
<code> </code><code>ON_WM_KILLFOCUS()</code>
<code>END_MESSAGE_MAP()</code>
<code>void</code> <code>CYuButton::OnNcPaint()</code>
<code>BOOL</code> <code>CYuButton::OnEraseBkgnd(CDC* pDC)</code>
<code> </code><code>return</code> <code>true</code><code>;</code><code>//CWnd::OnEraseBkgnd(pDC);</code>
<code>void</code> <code>CYuButton::OnPaint()</code>
<code> </code><code>CPaintDC dc(</code><code>this</code><code>); </code><code>// device context for painting</code>
<code> </code><code>if</code><code>(m_bIsDown)</code>
<code> </code><code>DrawDown(&dc);</code>
<code> </code><code>else</code>
<code> </code><code>DrawNormal(&dc);</code>
<code> </code><code>//繪按鈕上面的文字</code>
<code> </code><code>CRect rt;</code>
<code> </code><code>GetClientRect(&rt);</code>
<code> </code><code>rt.top = 70;</code>
<code> </code><code>dc.SetTextColor(RGB(255,255,255));</code>
<code> </code>
<code> </code><code>CFont font;</code>
<code> </code><code>VERIFY(font.CreatePointFont(115,_T(</code><code>"微軟雅黑"</code><code>), &dc));</code>
<code> </code><code>dc.SelectObject(&font);</code>
<code> </code><code>dc.SetBkMode(TRANSPARENT);</code>
<code> </code><code>dc.DrawText(m_sCaption,rt,DT_CENTER|DT_SINGLELINE);</code>
<code>void</code> <code>CYuButton::OnLButtonDown(</code><code>UINT</code> <code>nFlags, CPoint point)</code>
<code> </code><code>// TODO: 在此添加消息處理程式代碼和/或調用預設值</code>
<code> </code><code>m_bIsDown = TRUE;</code>
<code> </code><code>this</code><code>->SetFocus();</code>
<code> </code><code>this</code><code>->Invalidate(FALSE);</code>
<code> </code><code>CWnd * pWnd = </code><code>this</code><code>->GetParent();</code>
<code> </code><code>if</code><code>(pWnd)</code>
<code> </code><code>pWnd->SendMessage(WM_COMMAND,GetDlgCtrlID(),(</code><code>LPARAM</code><code>)</code><code>this</code><code>->GetSafeHwnd());</code>
<code> </code><code>CWnd::OnLButtonDown(nFlags, point);</code>
<code>void</code> <code>CYuButton::OnLButtonUp(</code><code>UINT</code> <code>nFlags, CPoint point)</code>
<code> </code><code>CWnd::OnLButtonUp(nFlags, point);</code>
<code>void</code> <code>CYuButton::DrawNormal(CDC * pDC)</code>
<code> </code><code>pDC->BitBlt(0,0,m_focus_MDC.Width(),m_focus_MDC.Height(),</code>
<code> </code><code>&m_CompoundDC,0,0,SRCCOPY);</code>
<code>void</code> <code>CYuButton::DrawDown(CDC * pDC)</code>
<code>void</code> <code>CYuButton::OnKillFocus(CWnd* pNewWnd)</code>
<code> </code><code>CWnd::OnKillFocus(pNewWnd);</code>
<code> </code><code>Invalidate(TRUE);</code>
<code>CString CYuButton::GetApplicationPath()</code>
<code> </code><code>WCHAR</code> <code>buff[255]={0};</code>
<code> </code><code>::GetModuleFileName(0,buff,255);</code>
<code> </code><code>CString strAppFullName;</code>
<code> </code><code>strAppFullName.Format(_T(</code><code>"%s"</code><code>),buff);</code>
<code> </code><code>CString strAppPath = _T(</code><code>""</code><code>);</code>
<code> </code><code>strAppPath = strAppFullName.Left(strAppFullName.ReverseFind(</code><code>'\\'</code><code>)+1);</code>
<code> </code><code>return</code> <code>strAppPath;</code>
<code>void</code> <code>CYuButton::SetNormalStatus()</code>
<code> </code><code>m_bIsDown = FALSE;</code>
<code> </code><code>Invalidate(FALSE);</code>
如果繼承自CEdit類,希望文字内容垂直居中。
<code>//建立時的風格,改為多行風格</code>
<code>CEdit::Create(WS_VISIBLE| ES_LEFT| WS_CHILD| ES_MULTILINE, rect, pParentWnd, nID);</code>
<code>//通知消息處理如下:</code>
<code>BOOL</code> <code>CYUEdit::OnChildNotify(</code><code>UINT</code> <code>message, </code><code>WPARAM</code> <code>wParam, </code><code>LPARAM</code> <code>lParam, </code>
<code> </code><code>LRESULT</code><code>* pLResult)</code>
<code> </code><code>if</code> <code>(message != WM_CTLCOLOREDIT)</code>
<code> </code><code>{</code>
<code> </code><code>return</code> <code>CEdit::OnChildNotify(message, wParam, lParam, pLResult);</code>
<code> </code><code>}</code>
<code> </code><code>HDC</code> <code>hdcChild = (</code><code>HDC</code><code>)wParam;</code>
<code> </code><code>SetTextColor(hdcChild, m_colFontColor);</code>
<code> </code><code>SetBkColor(hdcChild, m_colBackGround);</code>
<code> </code><code>CRect rt1;</code>
<code> </code><code>GetClientRect(&rt1);</code>
<code> </code><code>rt1.DeflateRect(0, 0, 0, 0);</code>
<code> </code><code>SetRectNP(&rt1);</code>
<code> </code><code>SetFont(&m_font,FALSE);</code>
<code> </code><code>return</code> <code>TRUE;</code>
<code> </code><code>//return CEdit::OnChildNotify(message, wParam, lParam, pLResult);</code>
<code></code>
本文轉自Chinayu201451CTO部落格,原文連結:http://blog.51cto.com/9233403/1981225 ,如需轉載請自行聯系原作者