// MyButton.cpp : 实现文件
//
#include "stdafx.h"
#include "BkgButton.h"
// CBkgButton
#define SAFEDELETE(obj) \
if (NULL != obj)\
{ delete obj;\
obj = NULL;}
IMPLEMENT_DYNAMIC(CBkgButton, CButton)
CBkgButton::CBkgButton()
{
m_pBkgNormal = NULL;
m_pBkgHoverOn = NULL;
m_pBkgSelected = NULL;
m_bAllowMouseTrack = TRUE;
m_bHoverOn = FALSE;
m_btnCliked = FALSE;
m_BtnType = BTNTYPE_NORMAL;
m_nPosX = 0;
m_nPosY = 0;
m_bCenterText = TRUE;
m_pTextFont = NULL;
m_pCurDc = NULL;
m_NullBrush.CreateStockObject(NULL_BRUSH);
}
CBkgButton::~CBkgButton()
{
SAFEDELETE(m_pTextFont)
}
BEGIN_MESSAGE_MAP(CBkgButton, CButton)
ON_WM_ERASEBKGND()
ON_WM_MOUSEMOVE()
ON_WM_MOUSEHOVER()
ON_WM_MOUSELEAVE()
ON_WM_CTLCOLOR_REFLECT()
ON_WM_LBUTTONDOWN()
ON_WM_DRAWITEM()
END_MESSAGE_MAP()
BOOL CBkgButton::SetBkgNormalRes( UINT nNormalRID, LPCTSTR lpszType/*=_T("PNG")*/ )
{
return G_ImageFromIDResource(nNormalRID, lpszType, m_pBkgNormal);
}
BOOL CBkgButton::SetBkgHoverOnRes( UINT nHoverOnRID, LPCTSTR lpszType/*=_T("PNG")*/ )
{
return G_ImageFromIDResource(nHoverOnRID, lpszType, m_pBkgHoverOn);
}
BOOL CBkgButton::SetBkgSelectedRes( UINT nSelectedRID, LPCTSTR lpszType/*=_T("PNG")*/ )
{
return G_ImageFromIDResource(nSelectedRID, lpszType, m_pBkgSelected);
}
// CBkgButton 消息处理程序
BOOL CBkgButton::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值ho
return TRUE;
//return CButton::OnEraseBkgnd(pDC);
}
void CBkgButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bAllowMouseTrack)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.dwHoverTime = 10;
tme.hwndTrack = m_hWnd;
_TrackMouseEvent(&tme);
m_bAllowMouseTrack = FALSE;
Invalidate();
}
CButton::OnMouseMove(nFlags, point);
}
void CBkgButton::OnMouseHover(UINT nFlags, CPoint point)
{
m_bHoverOn = TRUE;
Invalidate(TRUE);
CButton::OnMouseHover(nFlags, point);
}
void CBkgButton::OnMouseLeave()
{
m_bHoverOn = FALSE;
m_bAllowMouseTrack = TRUE;
Invalidate(TRUE);
CButton::OnMouseLeave();
}
void CBkgButton::SetBtnClicked( BOOL bClicked )
{
m_btnCliked = bClicked;
Invalidate(TRUE);
}
HBRUSH CBkgButton::CtlColor( CDC* pDC, UINT nCtlColor )
{
if (CTLCOLOR_BTN == nCtlColor)
{
pDC->SetBkMode(TRANSPARENT);
}
if (NULL == m_dcBk.m_hDC)
{
CBitmap bmp, *pOldBitmap;
CRect rect1, rect;
GetClientRect(rect);
CClientDC clDC(GetParent());
GetWindowRect(rect1);
GetParent()->ScreenToClient(rect1);
m_dcBk.CreateCompatibleDC(&clDC);
bmp.CreateCompatibleBitmap(&clDC, rect.Width(), rect.Height());
pOldBitmap = m_dcBk.SelectObject(&bmp);
m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(), &clDC, rect1.left, rect1.top, SRCCOPY);
bmp.DeleteObject();
}
// 读取正常状态按钮资源到DC
if(NULL == m_dcNormal.m_hDC && NULL != m_pBkgNormal)
{
PaintBk(pDC);
CBitmap bmp, *pOldBitmap;
Gdiplus::Graphics graphics(pDC->m_hDC);
graphics.DrawImage(m_pBkgNormal, 0, 0);
CRect rect;
GetClientRect(rect);
m_dcNormal.CreateCompatibleDC(pDC);
bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
pOldBitmap = m_dcNormal.SelectObject(&bmp);
m_dcNormal.BitBlt(0, 0, rect.Width(), rect.Height(), pDC, 0, 0, SRCCOPY);
bmp.DeleteObject();
}
// 读取Hover On状态按钮资源到DC
if(NULL == m_dcHoverOn.m_hDC && NULL != m_pBkgHoverOn)
{
PaintBk(pDC);
CBitmap bmp, *pOldBitmap;
Gdiplus::Graphics graphics(pDC->m_hDC);
graphics.DrawImage(m_pBkgHoverOn, 0, 0);
CRect rect;
GetClientRect(rect);
m_dcHoverOn.CreateCompatibleDC(pDC);
bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
pOldBitmap = m_dcHoverOn.SelectObject(&bmp);
m_dcHoverOn.BitBlt(0, 0, rect.Width(), rect.Height(), pDC, 0, 0, SRCCOPY);
bmp.DeleteObject();
}
// 读取点击之后按钮资源到DC
if(NULL == m_dcSelected.m_hDC && NULL != m_pBkgSelected)
{
PaintBk(pDC);
CBitmap bmp, *pOldBitmap;
Gdiplus::Graphics graphics(pDC->m_hDC);
graphics.DrawImage(m_pBkgSelected, 0, 0);
CRect rect;
GetClientRect(rect);
m_dcSelected.CreateCompatibleDC(pDC);
bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
pOldBitmap = m_dcSelected.SelectObject(&bmp);
m_dcSelected.BitBlt(0, 0, rect.Width(), rect.Height(), pDC, 0, 0, SRCCOPY);
bmp.DeleteObject();
}
return m_NullBrush;
}
void CBkgButton::SetBtnPosition( int nX, int nY )
{
m_nPosX = nX;
m_nPosY = nY;
int nLeftStep,nTopStep,nWidthStep,nHeightStep;
nLeftStep = 0;
nTopStep = 0;
nWidthStep = 0;
nHeightStep = 0;
CRect rect;
GetWindowRect(&rect);
int nWidth = (NULL != m_pBkgNormal)? m_pBkgNormal->GetWidth():(rect.right - rect.left);
int nHeight = (NULL != m_pBkgNormal)? m_pBkgNormal->GetHeight():(rect.bottom - rect.top);
rect.left = (0 == m_nPosX)?rect.left:m_nPosX;
rect.top = (0 == m_nPosY)?rect.top:m_nPosY;
// 考虑内边距的情况
rect.left -= nLeftStep;
rect.top -= nTopStep;
MoveWindow(rect.left + nLeftStep, rect.top + nTopStep,
nWidth - nWidthStep, nHeight - nHeightStep);
RefreshBkg();
}
void CBkgButton::PreSubclassWindow()
{
// Set control to owner draw
ModifyStyle(0, BS_OWNERDRAW, SWP_FRAMECHANGED);
CButton::PreSubclassWindow();
}
BOOL CBkgButton::PreTranslateMessage(MSG* pMsg)
{
// 禁用双击事件
if (pMsg->message == WM_LBUTTONDBLCLK)
{
pMsg->message = WM_LBUTTONDOWN;
}
return CButton::PreTranslateMessage(pMsg);
}
void CBkgButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
if (m_bHoverOn)
{
if (m_btnCliked)
{
// Hover On and be selected
m_pCurDc = (NULL != m_pBkgSelected)? &m_dcSelected: &m_dcNormal;
}
else
{
// Hover On and not be selected
m_pCurDc = (NULL != m_pBkgHoverOn)? &m_dcHoverOn: &m_dcNormal;
}
}
else
{
if (m_btnCliked)
{
// 被选中
m_pCurDc = (NULL != m_pBkgSelected)? &m_dcSelected: &m_dcNormal;
}else
{
// 正常状态
m_pCurDc = &m_dcNormal;
}
}
PaintBtn(pDC);
}
// 鼠标点击按钮,选中该按钮
void CBkgButton::OnLButtonDown(UINT nFlags, CPoint point)
{
m_btnCliked = TRUE;
Invalidate(TRUE);
CButton::OnLButtonDown(nFlags, point);
}
void CBkgButton::UpdateStatic( LPCTSTR lpszText , BOOL bCenter)
{
m_bCenterText = bCenter;
m_sCaption = lpszText;
SetWindowText(lpszText);
Invalidate(TRUE);
}
BOOL CBkgButton::SetTextFont( int nHeight /*= 18*/, int nWidth /*= 10*/, LPCTSTR lpszFaceName /*= _T("宋体")*/ )
{
if (NULL != m_pTextFont)
{
delete m_pTextFont;
m_pTextFont = NULL;
}
m_pTextFont = new CFont;
m_pTextFont->CreateFont(
nHeight, // nHeight
nWidth, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
lpszFaceName);
this->SetFont(m_pTextFont);
return TRUE;
}
//=============================================================================
// paint the background
//=============================================================================
void CBkgButton::PaintBk( CDC* pDC )
{
if (NULL != m_dcBk.m_hDC)
{
CRect rect;
GetClientRect(rect);
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcBk, 0, 0, SRCCOPY);
}
}
void CBkgButton::RefreshBkg()
{
自定义MFC编辑框以及按钮
需积分: 50 123 浏览量
2015-08-20
17:13:07
上传
评论 1
收藏 8KB ZIP 举报
David_Lee123
- 粉丝: 1
- 资源: 3
最新资源
- 课程设计-基于SpringBoot + Mybatis+python爬虫NBA球员数据爬取可视化+源代码+文档+sql+效果图
- 软件品质管理系列二项目策划规范.doc
- 基于TensorFlow+PyQt+GUI的酒店评论情感分析,支持分析本地数据文件和网络爬取数据分析+源代码+文档说明+安装教程
- 软件定义无线电中的模拟电路测试技术.pptx
- 软件开发协议(作为技术开发合同附件).doc
- 软件开发和咨询行业技术趋势分析.pptx
- 软件测试题详解及答案.doc
- 软件漏洞生命周期管理策略.pptx
- 毕业设计-基于Python实现的的简易气温爬虫,可以爬取全国各市的近7日气温数据
- 软件系统测试报告(实用版).doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈