📄 mybutton.cpp
字号:
// Mybutton.cpp : implementation file
//
#include "stdafx.h"
#include "s.h"
#include "Mybutton.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// Mybutton
Mybutton::Mybutton()
{
m_map.LoadBitmap(IDB_BITMAP1);
m_mapall.LoadBitmap(IDB_BITMAP1);
m_brush.CreatePatternBrush(&m_map);
m_map2.LoadBitmap(IDB_BITMAP2);
m_brush2.CreatePatternBrush(&m_map2);
m_map3.LoadBitmap(IDB_BITMAP3);
m_bodown=false;
m_bomove=false;
m_color=RGB(0,0,0);
}
Mybutton::~Mybutton()
{
}
BEGIN_MESSAGE_MAP(Mybutton, CButton)
//{{AFX_MSG_MAP(Mybutton)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_CREATE()
ON_WM_MOUSEMOVE()
ON_WM_ERASEBKGND()
ON_WM_GETDLGCODE()
// ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Mybutton message handlers
void Mybutton::SetBackColor(COLORREF color)
{
m_color=color;
//m_brush.CreateSolidBrush(m_color);
}
void Mybutton::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rect;
GetClientRect(&rect);
CString sCaption;
GetWindowText(sCaption);
dc.SetTextColor(m_color);
dc.SetBkMode(TRANSPARENT);
dc.SelectStockObject(ANSI_FIXED_FONT);//选入字体
/*
ANSI_FIXED_FONT(ANSI标准的等宽字体)ANSI_VAR_FONT(ANSI标准的非等宽字体)
SYSTEM_FONT(WINDOW默认的非等宽系统字体,用于菜单,对话框控件等界面文体的显示)
SYSTEM_FIXED_FONT(WINDOW等宽系统字体)
DEVICE_DEFAULT_FONT(当前设备字体)
OEM_FIXED_FONT(与OEM相关的等宽字体);
*/
dc.DrawText(sCaption,&rect,DT_CENTER|DT_VCENTER| DT_SINGLELINE);
}
void Mybutton::OnLButtonDown(UINT nFlags, CPoint point)
{
CButton::OnLButtonDown(nFlags, point);
m_bodown=true;
// SetFocus();
if(m_bomove)
{
m_bomove = false;
Invalidate();
UpdateWindow();
GetParent()->SendMessage(WM_COMMAND, GetDlgCtrlID(), (LPARAM)m_hWnd );
Invalidate();
UpdateWindow();
}
else
{
m_bomove=true;
Invalidate();
UpdateWindow();
}
Invalidate();
UpdateWindow();
}
void Mybutton::OnLButtonUp(UINT nFlags, CPoint point)
{
m_bodown=false;
// ReleaseCapture();
Invalidate();
UpdateWindow();
CButton::OnLButtonUp(nFlags, point);
}
int Mybutton::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CButton::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
void Mybutton::SetTextColor(COLORREF color)
{
m_color=color;
m_brush.CreateSolidBrush(m_color);
}
void Mybutton::OnMouseMove(UINT nFlags, CPoint point)
{
CButton::OnMouseMove(nFlags, point);
HRGN hRgn = CreateRectRgn(0, 0, 0, 0);
GetWindowRgn(hRgn);
if ( PtInRegion( hRgn, point.x, point.y ))
{
if (!m_bomove)
{
m_bomove = TRUE;
m_color=RGB(0,255,0);
Invalidate();
UpdateWindow();
SetCapture();
}
}
else
{
if (m_bomove)
{
m_bomove = FALSE;
m_color=RGB(0,0,0);
Invalidate();
UpdateWindow();
if(!m_bodown) ReleaseCapture();
}
}
DeleteObject(hRgn);
}
void Mybutton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC dc;
CRect rect=lpDrawItemStruct->rcItem;//得到按键区域
CString sCaption;
dc.Attach(lpDrawItemStruct->hDC); //得到设备环境CDC
VERIFY(lpDrawItemStruct->CtlType==ODT_BUTTON);
if(!(lpDrawItemStruct->itemState & ODS_SELECTED) &&
(lpDrawItemStruct->itemAction & ODA_SELECT))//释放鼠标或鼠标进入按键区域
{
m_bomove=false;
m_color=RGB(0,0,0);
m_mapall.DeleteObject();
m_mapall.LoadBitmap(IDB_BITMAP1);
Invalidate();
UpdateWindow();
}
if ((lpDrawItemStruct->itemState & ODS_SELECTED) &&
(lpDrawItemStruct->itemAction & ODA_SELECT))
{
m_bomove=false;
m_color=RGB(0,0,0);
m_mapall.DeleteObject();
m_mapall.LoadBitmap(IDB_BITMAP2);
Invalidate();
UpdateWindow();
}
}
BOOL Mybutton::OnEraseBkgnd(CDC* pDC)
{
CWindowDC dc(this);
SetupRegion(&dc);
CRect rect;
GetWindowRect(&rect);
CDC memDC;
CBitmap &cBitmap=m_mapall;
CBitmap* pOldMemBmp = NULL;
memDC.CreateCompatibleDC(&dc);
pOldMemBmp = memDC.SelectObject(&cBitmap);
dc.BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
if (pOldMemBmp) memDC.SelectObject(pOldMemBmp );
GetClientRect(&rect);
CString sCaption;
GetWindowText(sCaption);
dc.SetTextColor(m_color);
dc.SetBkMode(TRANSPARENT);
dc.SelectStockObject(ANSI_FIXED_FONT);
dc.DrawText(sCaption,&rect,DT_CENTER|DT_VCENTER| DT_SINGLELINE);
return true;
return CButton::OnEraseBkgnd(pDC);
}
UINT Mybutton::OnGetDlgCode()
{
return CButton::OnGetDlgCode();
}
void Mybutton::SetupRegion(CDC *pDC)
{
CDC memDC;
CBitmap &cBitmap=m_mapall;
CBitmap* pOldMemBmp = NULL;
COLORREF col,colMask;
CRect cRect;
int x, y;
CRgn wndRgn, rgnTemp;
GetWindowRect(&cRect);
// GetClientRect(&cRect);
CPoint ptOrg=cRect.TopLeft();
BITMAP bmInfo;
//cBitmap.GetObject(sizeof(bmInfo),&bmInfo);
cBitmap.GetBitmap(&bmInfo);
CRect rcNewWnd=CRect(ptOrg,CSize(bmInfo.bmWidth,bmInfo.bmHeight));
memDC.CreateCompatibleDC(pDC);
pOldMemBmp = memDC.SelectObject(&cBitmap);
colMask=memDC.GetPixel(0,0);
wndRgn.CreateRectRgn(0, 0, rcNewWnd.Width(), rcNewWnd.Height());
// wndRgn.CreateEllipticRgn(0, 0, rcNewWnd.Width(), rcNewWnd.Height());
for(x=0; x<=rcNewWnd.Width(); x++)
{
for(y=0; y<=rcNewWnd.Height(); y++)
{
col = memDC.GetPixel(x, y);
if(col == colMask)
{
rgnTemp.CreateRectRgn(x, y, x+1,y+1);
//rgnTemp.CreateEllipticRgn(x, y, x+1,y+1);
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_XOR);
rgnTemp.DeleteObject();
}
}
}
if (pOldMemBmp) memDC.SelectObject(pOldMemBmp);
SetWindowRgn((HRGN)wndRgn, TRUE);
}
void Mybutton::LoadBitmap1(UINT downbit, UINT upbit)
{
// m_mapa.LoadBitmap(upbit);
// m_mapall.LoadBitmap(downbit);
// m_brush.CreatePatternBrush(&m_map);
// m_map2.LoadBitmap(upbit);
// m_brush2.CreatePatternBrush(&m_map2);
}
BOOL Mybutton::EnableWindow(BOOL m_bo)
{
CRect rectmove;
CWindowDC dcc(this);
CDC pDc;
if(m_bo)
{
m_bomove=false;
m_mapall.DeleteObject();
m_mapall.LoadBitmap(IDB_BITMAP1);
::EnableWindow(this->m_hWnd,m_bo);
Invalidate();
UpdateWindow();
}
else
{
m_bomove=true;
m_mapall.DeleteObject();
m_mapall.LoadBitmap(IDB_BITMAP3);
::EnableWindow(this->m_hWnd,m_bo);
Invalidate();
UpdateWindow();
}
RedrawWindow(NULL, NULL,RDW_ERASE);
Invalidate();
UpdateWindow();
return true;
}
BOOL Mybutton::OnInitDialog()
{
//CWindowDC dcc(this);
//SetupRegion(&dcc);
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -