这是一个按钮自绘的框架,其他控件也类似
//.h头文件
#pragma once
#include "afxwin.h"
#include "MemDC.h"//封装内存DC类
class CYuButton :public CWnd
{
private:
BOOL m_bIsDown;
BOOL m_bIsMove;
BOOL _bMouseTrack;
CString m_sCaption;
CFont *m_pFont;
INT m_nFocusPic;//焦点图片
INT m_nForePic; //前景图片
CMemoryDC m_Icon_MDC;
CMemoryDC m_focus_MDC;
CMemoryDC m_fore_MDC;
CMemoryDC m_CompoundDC;//合成位图DC
bool m_bTracking = TRUE;
public:
DECLARE_DYNCREATE(CYuButton)
CYuButton(void);
virtual ~CYuButton(void);
BOOL Create(LPCTSTR strCaption,const CRect &rt,CWnd *
pParendWnd,UINT uId,UINT strFocusPic,UINT strForePic);
afx_msg void OnNcPaint();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnKillFocus(CWnd* pNewWnd);
DECLARE_MESSAGE_MAP()
//鼠标按下
void DrawDown(CDC * pDC);
void DrawNormal(CDC * pDC);
//鼠标移动
void DrawMove(CDC * pDC);
//字体
void SetFont(CFont * pFont);
CFont * GetFont();
//获取当前程序路径
CString GetApplicationPath();
public:
//修改按钮状态
void SetNormalStatus();
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnMouseHover(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnMouseLeave();
afx_msg void OnSetFocus(CWnd* pOldWnd);
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
};
//.cpp文件
#include "StdAfx.h"
#include "YuButton.h"
CYuButton::CYuButton(void)
{
// WNDCLASS wd={CS_VREDRAW|CS_HREDRAW,::DefWindowProc};
// wd.lpszClassName = _T("YUButton");
//
// AfxRegisterClass(&wd);
m_bIsDown = FALSE;
m_bIsMove = FALSE;
_bMouseTrack = TRUE;
}
CYuButton::~CYuButton(void)
{
}
BOOL CYuButton::Create(LPCTSTR strCaption,const CRect &rt,CWnd * pParendWnd,
UINT uId,UINT strFocusPic,UINT strForePic)
{
LPCTSTR lpszClassName = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW | WS_TABSTOP,
AfxGetApp()->LoadStandardCursor(IDC_ARROW),
(HBRUSH)GetStockObject(LTGRAY_BRUSH), NULL);
m_sCaption = strCaption;
m_nFocusPic = strFocusPic;
m_nForePic = strForePic;
BOOL re = m_Icon_MDC.LoadBitmap(m_nForePic);
re = m_focus_MDC.LoadBitmap(m_nFocusPic);//画焦点图片85*110
re = m_fore_MDC.LoadBitmap(m_nForePic); //显示图标
m_CompoundDC.Create(m_focus_MDC.Width(),m_focus_MDC.Height());//空白内存位图
m_pFont = pParendWnd->GetFont();
return CWnd::Create(lpszClassName,strCaption,WS_VISIBLE|WS_CHILD,rt,pParendWnd,uId);
}
BOOL CYuButton::CreateEx(DWORD dwExStyle,LPCTSTR sCaption,DWORD dwStyle,
CONST CRect & rt,CWnd * pParendWnd,UINT uId)
{
m_sCaption = sCaption;
return CWnd::CreateEx(dwExStyle,_T("YUButton"),sCaption,
dwStyle|WS_CHILD,rt,pParendWnd,uId);
}
IMPLEMENT_DYNCREATE(CYuButton, CWnd)
BEGIN_MESSAGE_MAP(CYuButton, CWnd)
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_KILLFOCUS()
ON_WM_LBUTTONDBLCLK()
ON_WM_MOUSEHOVER()
ON_WM_MOUSEMOVE()
ON_WM_MOUSELEAVE()
ON_WM_SETFOCUS()
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
void CYuButton::OnNcPaint()
{
}
BOOL CYuButton::OnEraseBkgnd(CDC* pDC)
{
return true;//CWnd::OnEraseBkgnd(pDC);
}
void CYuButton::OnPaint()
{
CPaintDC dc(this); // device context for painting
if(m_bIsDown)
DrawNormal(&dc);
else
DrawDown(&dc);
//绘按钮上面的文字
CRect rt;
GetClientRect(&rt);
rt.top = 69;
dc.SetTextColor(RGB(0,120,215));
CFont font;
VERIFY(font.CreatePointFont(90,_T("微软雅黑"), &dc));
CFont * pOldFont = dc.SelectObject(&font);
dc.SetBkMode(TRANSPARENT);
rt.top = 40;
dc.DrawText(m_sCaption,rt,DT_CENTER);
dc.SelectObject(pOldFont);
}
void CYuButton::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CWnd::OnLButtonDown(nFlags, point);
m_bIsDown = TRUE;
this->Invalidate(FALSE);
SetFocus();
//TRACE(_T("点击按钮!\n"));
}
void CYuButton::OnLButtonUp(UINT nFlags, CPoint point)
{
CWnd::OnLButtonUp(nFlags, point);
CWnd * pWnd = this->GetParent();
if (pWnd)
pWnd->SendMessage(WM_COMMAND, GetDlgCtrlID(), (LPARAM)this->GetSafeHwnd());
}
void CYuButton::DrawNormal(CDC * pDC)
{
//m_CompoundDC.BitBlt(0,0,m_focus_MDC.Width(),m_focus_MDC.Height(),
//&m_focus_MDC,0,0,SRCCOPY);
//m_fore_MDC.BitTrans(0,0,m_fore_MDC.Width(),m_fore_MDC.Height(),
//&m_CompoundDC,0,0,RGB(135,200,241));
//pDC->BitBlt(0,0,m_focus_MDC.Width(),m_focus_MDC.Height(),
//&m_CompoundDC,0,0,SRCCOPY);
pDC->BitBlt(0, 0, m_Icon_MDC.Width(), m_Icon_MDC.Height(),
&m_fore_MDC, 0, 0, SRCCOPY);
}
void CYuButton::DrawDown(CDC * pDC)
{
//画小图标
// CBrush br(RGB(221, 203, 255));
// CBrush * pOldBrush = pDC->SelectObject(&br);
// CRect rect(0, 0, m_Icon_MDC.Width(), m_Icon_MDC.Height());
// pDC->FillRect(&rect,&br);
pDC->BitBlt(0,0,m_Icon_MDC.Width(),m_Icon_MDC.Height(),&m_focus_MDC,0,0,SRCCOPY);
//pDC->SelectObject(pOldBrush);
}
void CYuButton::SetFont(CFont * pFont)
{
m_pFont = pFont;
}
CFont * CYuButton::GetFont()
{
return m_pFont;
}
void CYuButton::OnKillFocus(CWnd* pNewWnd)
{
CWnd::OnKillFocus(pNewWnd);
m_bIsDown = FALSE;
Invalidate(TRUE);
}
CString CYuButton::GetApplicationPath()
{
WCHAR buff[255]={0};
::GetModuleFileName(0,buff,255);
CString strAppFullName;
strAppFullName.Format(_T("%s"),buff);
CString strAppPath = _T("");
strAppPath = strAppFullName.Left(strAppFullName.ReverseFind('\\')+1);
return strAppPath;
}
void CYuButton::SetNormalStatus()
{
m_bIsDown = FALSE;
Invalidate(FALSE);
}
void CYuButton::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//CWnd * pWnd = this->GetParent();
//if (pWnd)
//pWnd->SendMessage(WM_COMMAND, GetDlgCtrlID(), (LPARAM)this->GetSafeHwnd());
CWnd::OnLButtonDblClk(nFlags, point);
}
void CYuButton::OnMouseHover(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_bIsDown = TRUE;
Invalidate();
CWnd::OnMouseHover(nFlags, point);
}
void CYuButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
TRACKMOUSEEVENT tme = { 0 };
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.dwHoverTime = 50;
tme.hwndTrack = this->m_hWnd;
if (TrackMouseEvent(&tme)) {}
CWnd::OnMouseMove(nFlags, point);
}
void CYuButton::OnMouseLeave()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_bIsDown = FALSE;
Invalidate();
CWnd::OnMouseLeave();
}
void CYuButton::OnSetFocus(CWnd* pOldWnd)
{
m_bIsDown = TRUE;
Invalidate();
CWnd::OnSetFocus(pOldWnd);
// TODO: 在此处添加消息处理程序代码
}
void CYuButton::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。