📄 skinbutton.cpp
字号:
// SkinButton.cpp : implementation file
//
#include "stdafx.h"
#include "dialog.h"
#include "SkinButton.h"
#include "EnBitmap.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CToolTipCtrl g_ToolTip;
/////////////////////////////////////////////////////////////////////////////
// CSkinButton
CSkinButton::CSkinButton()
{
m_bMouseIn = m_bDown = FALSE;
m_nStyle=STYLE_BITMAP;
}
CSkinButton::~CSkinButton()
{
}
BEGIN_MESSAGE_MAP(CSkinButton, CButton)
//{{AFX_MSG_MAP(CSkinButton)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_ERASEBKGND()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDBLCLK()
ON_WM_SETFOCUS()
ON_WM_KILLFOCUS()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSkinButton message handlers
void CSkinButton::OnPaint()
{
CPaintDC dc(this); // device context for painting
m_bFocus = GetFocus()->GetSafeHwnd() == m_hWnd;
m_bEnable = !(GetWindowLong(m_hWnd,GWL_STYLE) & WS_DISABLED);
CEnBitmap bmp;
if (m_nStyle & STYLE_BITMAP)
{
if ( !m_bEnable )
{
//disable
m_bmpButton.DrawImage(bmp,4,1,4,1);
}
else
if ( m_bMouseIn &&m_bDown )
{
//down
m_bmpButton.DrawImage(bmp,3,1,4,1);
}
else if ( m_bMouseIn )
{
//hover
m_bmpButton.DrawImage(bmp,2,1,4,1);
}
else if ( m_bFocus )
{
//normal with focus
m_bmpButton.DrawImage(bmp,1,1,4,1);
}
else
{
//normal
m_bmpButton.DrawImage(bmp,1,1,4,1);
}
//设置区域
SetWindowRgn(bmp.BitmapToRegion(RGB(255,0,255)), TRUE );
HRGN hRgn = CreateRectRgn( 0, 0, 0, 0);
GetWindowRgn(hRgn);
//选入位图绘画区域
::SelectClipRgn(dc.GetSafeHdc(), hRgn);
bmp.Draw( &dc, CRect(0,0,bmp.GetWidth(),bmp.GetHeight()));
dc.SelectClipRgn(NULL);
DeleteObject(hRgn);
DrawText( &dc ,bmp.GetRect() ,RGB(0,0,0));
}
else if (m_nStyle & STYLE_TOOLBAR)
{
CRect rcButton;
GetClientRect(&rcButton);
CRect rcImage,rcText;
rcImage=m_bmpButton.GetRect();
int nMaigin=(rcButton.Height()- rcImage.Height())/2;
rcImage.OffsetRect(nMaigin,nMaigin);
rcText=rcButton;
rcText.left =rcImage.right ;
//先更新背景
CRect rc=rcButton;
ClientToScreen(&rcButton);
GetParent()->ScreenToClient(&rcButton);
GetParent()->RedrawWindow(&rcButton,NULL,RDW_ERASE|RDW_UPDATENOW |RDW_INVALIDATE|RDW_NOCHILDREN );
rc.DeflateRect(1,1);
if ( !m_bEnable )
{
//disable
}
else
if ( m_bMouseIn &&m_bDown )
{
//down
dc.Draw3dRect(&rc,GetSysColor(COLOR_3DDKSHADOW),GetSysColor(COLOR_3DHILIGHT));
}
else if ( m_bMouseIn )
{
dc.Draw3dRect(&rc,GetSysColor(COLOR_3DHILIGHT),GetSysColor(COLOR_3DDKSHADOW));
}
else if ( m_bFocus )
{
}
else
{
}
m_bmpButton.TransparentBlt(dc, &rcImage,RGB(255,0,255));
DrawText( &dc ,rcText,m_crText);
}
}
void CSkinButton::LoadBitmap(LPCTSTR szImagePath)
{
m_bmpButton.LoadImage(szImagePath);
}
BOOL CSkinButton::LoadBitmap(UINT uIDRes,COLORREF crBack)
{
return m_bmpButton.LoadBitmap(uIDRes);
}
void CSkinButton::OnLButtonDown(UINT nFlags, CPoint point)
{
m_bDown = TRUE;
m_bMouseIn = TRUE;
Invalidate();
UpdateWindow();
SetFocus();
}
void CSkinButton::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
ReleaseCapture();
m_bDown = FALSE;
if ( m_bMouseIn )
{
m_bMouseIn = FALSE;
//GetRegion();
Invalidate();
UpdateWindow();
GetParent()->SendMessage( WM_COMMAND, GetDlgCtrlID(), (LPARAM)m_hWnd );
}
else
{
//GetRegion();
Invalidate();
UpdateWindow();
}
}
BOOL CSkinButton::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
void CSkinButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (m_nStyle & STYLE_BITMAP)
{
HRGN hRgn = CreateRectRgn(0, 0, 0, 0);
GetWindowRgn(hRgn);
if ( PtInRegion( hRgn, point.x, point.y ))
{
::SetCursor(AfxGetApp()->LoadCursor(IDC_HAND ));
if ( !m_bMouseIn)
{
m_bMouseIn = TRUE;
Invalidate();
UpdateWindow();
SetCapture();
}
}
else
{
if ( m_bMouseIn)
{
m_bMouseIn = FALSE;
//GetRegion();
Invalidate();
UpdateWindow();
if ( !m_bDown )
ReleaseCapture();
}
}
DeleteObject(hRgn);
}
else if (m_nStyle & STYLE_TOOLBAR)
{
CRect rc;
GetClientRect(&rc);
if ( rc.PtInRect( point ))
{
//移入
if ( !m_bMouseIn)
{
m_bMouseIn = TRUE;
Invalidate();
UpdateWindow();
SetCapture();
}
}
else
{
//移出
if ( m_bMouseIn)
{
m_bMouseIn = FALSE;
//GetRegion();
Invalidate();
UpdateWindow();
if ( !m_bDown )
ReleaseCapture();
}
}
}
}
void CSkinButton::OnLButtonDblClk(UINT nFlags, CPoint point)
{
}
void CSkinButton::OnSetFocus(CWnd* pOldWnd)
{
}
void CSkinButton::OnKillFocus(CWnd* pNewWnd)
{
}
BOOL CSkinButton::DrawText(CDC *pDC,CRect rc ,COLORREF crText)
{
CRect r;
CString str;
CRect rcButton;
CString strText;
UINT nId=GetDlgCtrlID( ) ;
if (strText.LoadString(nId))
{
CFont *ofont;
ofont = pDC->SelectObject( GetParent()->GetFont() );
pDC->SetTextColor(crText);
pDC->SetBkMode(TRANSPARENT);
pDC->DrawText( strText, rc, DT_CENTER | DT_SINGLELINE | DT_VCENTER );
pDC->SelectObject(ofont);
}
return TRUE;
}
HBITMAP CSkinButton::SetBitmap(HBITMAP hBitmap)
{
return m_bmpButton.SetBitmap(hBitmap) ;
}
CSkinButton::SetTextColor(COLORREF cr)
{
m_crText=cr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -