📄 skinbtn.cpp
字号:
/************************************************************************
* 文件名: SkinBtn.cpp
* 文件描述: 图片按钮
* 创建人: 黄锐坤(Nuk), 2006年08月22日
* 版本号: 1.0
************************************************************************/
// SkinBtn.cpp : 实现文件
//
#include "stdafx.h"
#include "NUK.h"
#include "SkinBtn.h"
// CSkinBtn
IMPLEMENT_DYNAMIC(CSkinBtn, CButton)
CSkinBtn::CSkinBtn()
{
m_state = NORMAL;
m_pFont=new CFont();
m_pFont->CreatePointFont(90,_T("Arial"));
m_fg = RGB(0, 0, 0);
m_bg = RGB(255, 255, 255);
m_bMouseOver = false;
m_bEnabled = true;
m_bDCStored = false;
m_textPos = CPoint(21,0);
m_iconRect = CRect(0,0,16,16);
}
CSkinBtn::~CSkinBtn()
{
delete m_pFont;
m_memDC.DeleteDC();
}
BEGIN_MESSAGE_MAP(CSkinBtn, CButton)
ON_WM_MOUSEMOVE()
ON_WM_TIMER()
ON_WM_ERASEBKGND()
ON_WM_SETCURSOR()
ON_WM_ENABLE()
END_MESSAGE_MAP()
void CSkinBtn::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
//// TODO: 添加您的代码以绘制指定项
//CDC* pDC = CDC::FromHandle(lpDIS->hDC);
UINT state = lpDIS->itemState;
//CRect rect;
//rect.CopyRect(&lpDIS->rcItem);
m_state = NORMAL;
if (state & ODS_FOCUS)
{
if (state & ODS_SELECTED)
{
m_state = DOWN;
}
else
{
if(m_bMouseOver)
m_state = HOVER;
}
}
else
{
m_state = NORMAL;
}
if (state & ODS_DISABLED)
{
m_state = DISABLE;
m_bEnabled = false;
}
DrawButton();
}
void CSkinBtn::DrawButton()
{
CClientDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap Screen;
Screen.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
memDC.SelectObject(&Screen);
Screen.DeleteObject();
//画背景
memDC.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &m_memDC, 0, 0, SRCCOPY);
CString str;
GetWindowText(str);
memDC.SetBkMode(TRANSPARENT);
memDC.SelectObject(m_pFont);
switch(m_state)
{
case NORMAL:
//
//memDC.TextOutW(m_textPos.x,m_textPos.y,str);
if(!m_imgNormal.IsNull())
m_imgNormal.TransparentBlt(memDC, rect.left, rect.top,
m_imgNormal.GetWidth(), m_imgNormal.GetHeight(), RGB(255,0,255));
if(!m_hMouseOutIcon.IsNull())
{
m_hMouseOutIcon.TransparentBlt(memDC, m_iconRect.left,m_iconRect.top,
m_iconRect.Width(), m_iconRect.Height(), RGB(0,0,0));
memDC.SetTextColor(GetFGColor());
memDC.TextOutW(m_textPos.x,m_textPos.y,str);
}
//DrawButtonText(&dc, rect, str, GetFGColor());
break;
case HOVER:
//DrawFilledRect(&memDC, rect, RGB(255,255,0));
if(!m_imgHover.IsNull())
m_imgHover.TransparentBlt(memDC, rect.left, rect.top,
m_imgHover.GetWidth(), m_imgHover.GetHeight(), RGB(255,0,255));
if(!m_hMouseInIcon.IsNull())
{
m_hMouseInIcon.TransparentBlt(memDC, m_iconRect.left,m_iconRect.top,
m_iconRect.Width(), m_iconRect.Height(), RGB(0,0,0));
memDC.SetTextColor(GetBGColor());
memDC.TextOutW(m_textPos.x,m_textPos.y,str);
}
//DrawButtonText(&dc, rect, str, GetFGColor());
break;
case DOWN:
//DrawFilledRect(&memDC, rect, RGB(0,0,255));
if(!m_imgDown.IsNull())
m_imgDown.TransparentBlt(memDC, rect.left, rect.top,
m_imgDown.GetWidth(), m_imgHover.GetHeight(), RGB(255,0,255));
if(!m_hMouseOutIcon.IsNull())
{
m_hMouseOutIcon.TransparentBlt(memDC, m_iconRect.left+1,m_iconRect.top+1,
m_iconRect.Width(), m_iconRect.Height(), RGB(0,0,0));
memDC.SetTextColor(GetBGColor());
memDC.TextOutW(m_textPos.x+1,m_textPos.y+1,str);
}
//DrawButtonText(&dc, rect, str, GetFGColor());
break;
case DISABLE:
if(!m_imgDisable.IsNull())
m_imgDisable.TransparentBlt(memDC, rect.left, rect.top,
m_imgDisable.GetWidth(), m_imgHover.GetHeight(), RGB(255,0,255));
if(!m_hMouseOutIcon.IsNull())
{
m_hMouseOutIcon.TransparentBlt(memDC, m_iconRect.left,m_iconRect.top,
m_iconRect.Width(), m_iconRect.Height(), RGB(0,0,0));
memDC.SetTextColor(GetFGColor());
memDC.TextOutW(m_textPos.x,m_textPos.y,str);
}
//DrawButtonText(&dc, rect, str, RGB(128, 128, 128));
break;
default:
break;
}
dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
memDC.DeleteDC();
}
void CSkinBtn::DrawFilledRect(CDC *DC, CRect R, COLORREF color)
{
CBrush B;
B.CreateSolidBrush(color);
DC->FillRect(R, &B);
}
void CSkinBtn::DrawButtonText(CDC *DC, CRect R, CString str, COLORREF TextColor)
{
COLORREF prevColor = DC->SetTextColor(TextColor);
DC->SetBkMode(TRANSPARENT);
DC->SelectObject(m_pFont);
if(m_hMouseOutIcon.IsNull()&&m_hMouseInIcon.IsNull())
{
//int iconwidth=::GetSystemMetrics(SM_CXICON);
R.right=R.right-m_textPos.x;
DC->DrawText( str, str.GetLength(), R, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
else
{
DC->DrawText( str, str.GetLength(), R, DT_RIGHT|DT_VCENTER|DT_SINGLELINE);
}
DC->SetTextColor(prevColor);
}
void CSkinBtn::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//if (nFlags & MK_LBUTTON && m_bMouseOver == FALSE)
// return;
if(!m_bMouseOver&&m_bEnabled)
{
m_bMouseOver=true;
m_state = HOVER;
CPoint point;
CRect rect;
GetWindowRect(&rect);
GetCursorPos(&point);
if (!rect.PtInRect(point) && m_bMouseOver&&m_bEnabled)
{
SetTimer(1,10,NULL);
return;
}
DrawButton();
SetTimer(1,10,NULL);
}
CButton::OnMouseMove(nFlags, point);
}
void CSkinBtn::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CPoint point;
CRect rect;
GetWindowRect(&rect);
GetCursorPos(&point);
if (!rect.PtInRect(point) && m_bMouseOver&&m_bEnabled)
{
KillTimer (1);
m_bMouseOver=false;
m_state = NORMAL;
DrawButton();
}
CButton::OnTimer(nIDEvent);
}
void CSkinBtn::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
SetOwnerDraw(true);
CButton::PreSubclassWindow();
}
void CSkinBtn::SetOwnerDraw(bool IsDraw)
{
if(IsDraw)
{
ModifyStyle(NULL, BS_OWNERDRAW);
Invalidate();
}
else
{
ModifyStyle(BS_OWNERDRAW, NULL);
Invalidate();
}
}
void CSkinBtn::SetImage(CString strNormal, CString strHover, CString strDown, CString strDisable)
{
m_imgNormal.Load(strNormal);
m_imgHover.Load(strHover);
m_imgDown.Load(strDown);
m_imgDisable.Load(strDisable);
}
void CSkinBtn::SetImage(UINT nNormalID, UINT nHoverID, UINT nDownID, UINT nDisableID)
{
m_imgNormal.LoadFromResource(AfxGetApp()->m_hInstance, nNormalID );
m_imgHover.LoadFromResource(AfxGetApp()->m_hInstance, nHoverID );
m_imgDown.LoadFromResource(AfxGetApp()->m_hInstance, nDownID );
m_imgDisable.LoadFromResource(::GetModuleHandle(NULL), nDisableID );
}
BOOL CSkinBtn::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(!m_bDCStored)
{
CRect rect;
GetClientRect(&rect);
m_memDC.CreateCompatibleDC (pDC);
CBitmap btScreen;
btScreen.CreateCompatibleBitmap (pDC,rect.Width(),rect.Height());
m_memDC.SelectObject (&btScreen);
m_memDC.BitBlt (0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY);
m_bDCStored=true;
CRgn rgn;
rgn.CreateRectRgn (0, 0, rect.Width(), rect.Height());
SetWindowRgn (rgn, TRUE);
btScreen.DeleteObject();
}
return TRUE;// CButton::OnEraseBkgnd(pDC);//
}
BOOL CSkinBtn::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_HAND));
return TRUE;
return CButton::OnSetCursor(pWnd, nHitTest, message);
}
void CSkinBtn::SetIcon(CString strMouseOut,CString strMouseIn)
{
m_hMouseOutIcon.Load(strMouseOut);
m_hMouseInIcon.Load(strMouseIn);
}
void CSkinBtn::SetColor(COLORREF fgcolor,COLORREF bgcolor)
{
m_fg = fgcolor;
m_bg = bgcolor;
DrawButton();
}
void CSkinBtn::SetTextPos(CPoint point)
{
m_textPos = point;
DrawButton();
}
CRect CSkinBtn::GetRectInParent()
{
CRect rcWindowParent;
GetParent()->GetWindowRect(rcWindowParent);//client
CRect rcWindow;
GetWindowRect(&rcWindow);
CRect rect;
rect.left = rcWindow.left-rcWindowParent.left;
rect.top = rcWindow.top-rcWindowParent.top;
rect.right = rcWindow.right-rcWindowParent.left;
rect.bottom = rcWindow.bottom-rcWindowParent.top;
return rect;
}
void CSkinBtn::OnEnable(BOOL bEnable)
{
CButton::OnEnable(bEnable);
// TODO: 在此处添加消息处理程序代码
if(bEnable)
m_bEnabled = true;
else
m_bEnabled = false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -