天天看点

VC自绘控件框架

这是一个按钮自绘的框架,其他控件也类似

<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 &amp; 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 &amp; 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()-&gt;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(&amp;dc);</code>

<code>    </code><code>else</code>

<code>        </code><code>DrawNormal(&amp;dc);</code>

<code>    </code><code>//绘按钮上面的文字</code>

<code>    </code><code>CRect rt;</code>

<code>    </code><code>GetClientRect(&amp;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>), &amp;dc));</code>

<code>    </code><code>dc.SelectObject(&amp;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>-&gt;SetFocus();</code>

<code>    </code><code>this</code><code>-&gt;Invalidate(FALSE);</code>

<code>    </code><code>CWnd * pWnd = </code><code>this</code><code>-&gt;GetParent();</code>

<code>    </code><code>if</code><code>(pWnd)</code>

<code>        </code><code>pWnd-&gt;SendMessage(WM_COMMAND,GetDlgCtrlID(),(</code><code>LPARAM</code><code>)</code><code>this</code><code>-&gt;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-&gt;BitBlt(0,0,m_focus_MDC.Width(),m_focus_MDC.Height(),</code>

<code>                </code><code>&amp;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(&amp;rt1);</code>

<code>    </code><code>rt1.DeflateRect(0, 0, 0, 0);</code>

<code>    </code><code>SetRectNP(&amp;rt1);</code>

<code>    </code><code>SetFont(&amp;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 ,如需转载请自行联系原作者

继续阅读