CorpSms/LuButton/LuButton.cpp

1111 lines
26 KiB
C++
Raw Permalink Normal View History

2025-02-27 16:58:16 +08:00
// LuButton.cpp : implementation file
//
#include "stdafx.h"
#include "LuButton.h"
#include <mmsystem.h> //<2F><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>,<2C>ǵü<C7B5><C3BC><EFBFBD>winmm.lib
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// LuButton
LuButton::LuButton()
{
m_bSelect = false; //<2F><><EFBFBD>ڴ˰<DAB4>Ť<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ѡ<EFBFBD><D1A1>
m_bFlat = false; //<2F>˰<EFBFBD>Ť<EFBFBD>Ƿ<EFBFBD><C7B7>Ǹ<EFBFBD><C7B8><EFBFBD><EFBFBD><EFBFBD>
m_bFlash = false; //<2F>˰<EFBFBD>Ť<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_bSound = false; //<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_bTransBk= false; //<2F><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>Ҫ<EFBFBD><D2AA>ʾ͸<CABE><CDB8>λͼ
m_lBmpCount=0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_lNowBmp=0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ͼƬ<CDBC><C6AC>Ϊ0;
m_lMaxBmp =5; //<2F><><EFBFBD><EFBFBD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>m_bmpX<70><58><EFBFBD><EFBFBD>
m_lFlashCount=0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0ʱ<30><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_lMaxFlashCount=0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_lFlashTime=LUBUTTON_FLASHTIME; //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ʱ<EFBFBD><CAB1>
m_lDHTime = 800; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
m_bUnBmp = false; //<2F><><EFBFBD>ڻ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>UnBmp
m_bFlatBmp = false; //<2F><><EFBFBD>ڻ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>FlatBmp
m_bDisBmp = false;
m_bClickBmp = false;
m_bMouseOnButton = false; //<2F><><EFBFBD>껹û<EABBB9><C3BB><EFBFBD>ڰ<EFBFBD>Ť֮<C5A4><D6AE>
m_ToolTip.m_hWnd = NULL; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>Ť<EFBFBD><C5A4><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>Ϣ
*m_szSelTip = 0;
*m_szUnSelTip = 0;
m_RGBTrans= RGB(0,0,0);//<2F><>Ҫȥ<D2AA><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>ɫ
m_bHandBmp = false; //<2F><><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӵ<EFBFBD>HBITMAP<41>л<EFBFBD><D0BB><EFBFBD>
m_bHandBmp2 = false;
// <20><>ʼ<EFBFBD><CABC>GDI+
m_pBitmap = NULL;
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
2025-02-27 16:58:16 +08:00
}
LuButton::~LuButton()
{
if (m_dcBk.m_hDC != NULL && m_pbmpOldBk != NULL)
{
m_dcBk.SelectObject(m_pbmpOldBk);
}
FreeBitmapData();
// <20>ر<EFBFBD>GDI+
GdiplusShutdown(m_gdiplusToken);
2025-02-27 16:58:16 +08:00
}
void LuButton::FreeBitmapData()
{
if (m_pBitmap)
{
delete m_pBitmap;
m_pBitmap = NULL;
}
}
2025-02-27 16:58:16 +08:00
BEGIN_MESSAGE_MAP(LuButton, CButton)
//{{AFX_MSG_MAP(LuButton)
ON_WM_MOUSEMOVE()
ON_WM_TIMER()
ON_WM_KILLFOCUS()
ON_WM_CAPTURECHANGED()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// LuButton message handlers
void LuButton::PreSubclassWindow()
{
UINT nBS;
nBS = GetButtonStyle();
// Check if this is the default button
//if (nBS & BS_DEFPUSHBUTTON) m_bIsDefault = TRUE;
// Add BS_OWNERDRAW style
SetButtonStyle(nBS | BS_OWNERDRAW);
CButton::PreSubclassWindow();
}
void LuButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ػ<EFBFBD>
if ( m_bFlash && m_lFlashCount % 2 != 0 )
{
return ;
}
//ȡ<><C8A1>dc;
//CDC* pDC = CDC::FromHandle(lpDIS->hDC);
CDC *pdrawDC = CDC::FromHandle(lpDIS->hDC);
CMemDC2 memDC(pdrawDC);
CDC *pDC = &memDC;
CDC pDispDC;
pDispDC.CreateCompatibleDC( pDC );
CBitmap * pOldBitmap; //<2F><><EFBFBD>ڴ<EFBFBD><DAB4>ɵ<EFBFBD>Bitmap
BOOL bOldBitmap=false; //<2F>Ƿ<EFBFBD><C7B7>ѰѾɵ<D1BE>Bitmpa<70><61><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BITMAP bmpSize; //<2F><><EFBFBD><EFBFBD>ȡbmp<6D>Ĵ<EFBFBD>С
BOOL bIsPressed = (lpDIS->itemState & ODS_SELECTED); //ȡ<>õ<EFBFBD>ǰ״̬
BOOL bIsFocused = (lpDIS->itemState & ODS_FOCUS);
BOOL bIsDisabled = (lpDIS->itemState & ODS_DISABLED);
BOOL bIsSelect = (lpDIS->itemAction & ODA_SELECT );
//char Buf[ 256 ];
//_stprintf( Buf , " %d , %d , %d , %d \n" , bIsPressed , bIsFocused , bIsDisabled , bIsSelect);
//TRACE( Buf );
CRect itemRect = lpDIS->rcItem;
//<2F><>һ<EFBFBD><D2BB><EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
COLORREF colorRef = RGB(192, 192, 192);
//COLORREF colorRef = GetSysColor(COLOR_WINDOW);
CBrush brush_LTGRAY(colorRef );
2025-02-27 16:58:16 +08:00
pDC->FillRect( &itemRect ,&brush_LTGRAY);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
pDC->SetStretchBltMode(STRETCH_HALFTONE);
pDispDC.SetStretchBltMode(STRETCH_HALFTONE);
2025-02-27 16:58:16 +08:00
if ( bIsDisabled && m_bDisBmp ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ť<EFBFBD><C5A4>DISABLE<4C><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DISABLEͼƬ
{
if (!this->m_bTransBk)
{
DrawBitmap(pDC, itemRect.left, itemRect.top, itemRect.Width(), itemRect.Height(), &m_DisBmp);
/*
2025-02-27 16:58:16 +08:00
if ( !bOldBitmap )
{
pOldBitmap = pDispDC.SelectObject( &m_DisBmp );
bOldBitmap = true;
}
m_DisBmp.GetBitmap( &bmpSize );
pDC->StretchBlt( itemRect.left , itemRect.top ,
itemRect.right - itemRect.left , itemRect.bottom - itemRect.top , &pDispDC ,
0 , 0 , bmpSize.bmWidth , bmpSize.bmHeight , SRCCOPY );
*/
2025-02-27 16:58:16 +08:00
}
else
{
PaintBk(pDC);
this->DrawTransparentBitmap( pDC , itemRect.left , itemRect.top , &m_DisBmp , m_RGBTrans );
}
pDispDC.SelectObject( pOldBitmap );
return;
}
//<2F><><EFBFBD><EFBFBD>Ϊѡ<CEAA><D1A1>״̬
if ( m_bSelect && m_lBmpCount > 0 )
{
CBitmap * pTempBmp = NULL;
switch( m_lNowBmp )
{
case 1:
pTempBmp = &m_bmp1;
break;
case 2:
pTempBmp = &m_bmp2;
break;
case 3:
pTempBmp = &m_bmp3;
break;
case 4:
pTempBmp = &m_bmp4;
break;
case 5:
pTempBmp = &m_bmp5;
break;
default:
pTempBmp = &m_bmp1;
break;
}
if (!this->m_bTransBk)
{
DrawBitmap(pDC, itemRect.left, itemRect.top, itemRect.Width(), itemRect.Height(), pTempBmp);
/*
2025-02-27 16:58:16 +08:00
if ( !bOldBitmap )
{
pOldBitmap = pDispDC.SelectObject( pTempBmp );
bOldBitmap = true;
}
pTempBmp->GetBitmap( &bmpSize );
pDC->StretchBlt( itemRect.left , itemRect.top ,
itemRect.right - itemRect.left , itemRect.bottom - itemRect.top , &pDispDC ,
0 , 0 , bmpSize.bmWidth , bmpSize.bmHeight , SRCCOPY );
*/
2025-02-27 16:58:16 +08:00
}
else
{
PaintBk(pDC);
this->DrawTransparentBitmap( pDC , itemRect.left , itemRect.top , pTempBmp , m_RGBTrans );
}
}
else
{
if ( m_bUnBmp )
{
//<2F><>δ<EFBFBD><CEB4>ѡ<EFBFBD>е<EFBFBD>ͼƬ
if (!this->m_bTransBk)
{
DrawBitmap(pDC, itemRect.left, itemRect.top, itemRect.Width(), itemRect.Height(), &m_unBmp);
/*
if (!bOldBitmap)
2025-02-27 16:58:16 +08:00
{
pOldBitmap = pDispDC.SelectObject(&m_unBmp);
2025-02-27 16:58:16 +08:00
bOldBitmap = true;
}
m_unBmp.GetBitmap(&bmpSize);
pDC->StretchBlt( itemRect.left , itemRect.top , itemRect.right - itemRect.left , itemRect.bottom - itemRect.top , &pDispDC , 0 , 0 , bmpSize.bmWidth , bmpSize.bmHeight , SRCCOPY );
*/
2025-02-27 16:58:16 +08:00
}
else
{
PaintBk(pDC);
this->DrawTransparentBitmap( pDC , itemRect.left , itemRect.top , &m_unBmp , m_RGBTrans );
}
}
}
if ( m_bMouseOnButton && m_bFlatBmp && !bIsPressed ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD>Ť֮<C5A4>Ϻ<EFBFBD><CFBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD><CBB8><EFBFBD>ͼƬ
{
if (!this->m_bTransBk)
{
DrawBitmap(pDC, itemRect.left, itemRect.top, itemRect.Width(), itemRect.Height(), &m_FlatBmp);
/*
2025-02-27 16:58:16 +08:00
if ( !bOldBitmap )
{
pDispDC.SelectObject( &m_FlatBmp );
bOldBitmap = true;
}
m_FlatBmp.GetBitmap( &bmpSize );
pDC->StretchBlt( itemRect.left , itemRect.top ,
itemRect.right - itemRect.left , itemRect.bottom - itemRect.top , &pDispDC ,
0 , 0 , bmpSize.bmWidth , bmpSize.bmHeight , SRCCOPY );
*/
2025-02-27 16:58:16 +08:00
}
else
{
PaintBk(pDC);
this->DrawTransparentBitmap( pDC , itemRect.left , itemRect.top , &m_FlatBmp , m_RGBTrans );
}
}
if ( bIsPressed && m_bClickBmp ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ClickͼƬ
{
if (!this->m_bTransBk)
{
DrawBitmap(pDC, itemRect.left, itemRect.top, itemRect.Width(), itemRect.Height(), &m_ClickBmp);
/*
2025-02-27 16:58:16 +08:00
if ( !bOldBitmap )
{
pDispDC.SelectObject( &m_ClickBmp );
bOldBitmap = true;
}
m_ClickBmp.GetBitmap( &bmpSize );
pDC->StretchBlt( itemRect.left , itemRect.top ,
itemRect.right - itemRect.left , itemRect.bottom - itemRect.top , &pDispDC ,
0 , 0 , bmpSize.bmWidth , bmpSize.bmHeight , SRCCOPY );
*/
2025-02-27 16:58:16 +08:00
}
else
{
PaintBk(pDC);
this->DrawTransparentBitmap( pDC , itemRect.left , itemRect.top , &m_ClickBmp , m_RGBTrans );
}
}
//ֱ<>Ӵ<EFBFBD>HBITMAP<41>л<EFBFBD><D0BB><EFBFBD>
if ( m_bHandBmp && m_bHandBmp2 ) //ֱ<>Ӵ<EFBFBD>HBITMAP<41>л<EFBFBD><D0BB><EFBFBD>
{
CBitmap * pBmp = CBitmap::FromHandle( m_hHandBmp );
//<2F><>δ<EFBFBD><CEB4>ѡ<EFBFBD>е<EFBFBD>ͼƬ
if (!this->m_bTransBk)
{
DrawBitmap(pDC, itemRect.left, itemRect.top, itemRect.Width(), itemRect.Height(), &m_ClickBmp);
/*
2025-02-27 16:58:16 +08:00
if ( !bOldBitmap )
{
pOldBitmap = pDispDC.SelectObject( pBmp );
bOldBitmap = true;
}
pBmp->GetBitmap( &bmpSize );
pDC->StretchBlt( itemRect.left , itemRect.top ,
itemRect.right - itemRect.left , itemRect.bottom - itemRect.top , &pDispDC ,
0 , 0 , bmpSize.bmWidth , bmpSize.bmHeight , SRCCOPY );
*/
2025-02-27 16:58:16 +08:00
}
else
{
PaintBk(pDC);
this->DrawTransparentBitmap( pDC , itemRect.left , itemRect.top , pBmp , m_RGBTrans );
}
}
else
{
TRACE( _T("No Draw Hand \r\n") );
}
if ( m_bMouseOnButton && m_bFlat ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD>Ť֮<C5A4><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>
{
//CPen p_BLACK(PS_SOLID,1,RGB(0,0,0)); //<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
CPen p_WHITE(PS_SOLID,1,RGB(255,255,255)); //<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
CPen p_GRAY(PS_SOLID,1,RGB(128,128,128)); //<2F><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
//CPen p_LTGRAY(PS_SOLID,1,RGB(192,192,192)); //<2F><><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
CPen *pOldPen; //<2F><><EFBFBD>ڴ<EFBFBD><DAB4>ɵ<EFBFBD>Pen
if ( !bIsPressed ) //<2F>˱<EFBFBD><CBB1><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD><DAB0><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>֮<EFBFBD><D6AE>
{
pOldPen = pDC->SelectObject( &p_WHITE );
//<2F><>
pDC->MoveTo( itemRect.left , itemRect.top );
pDC->LineTo( itemRect.right -1, itemRect.top );
//<2F><>
pDC->MoveTo( itemRect.left , itemRect.top );
pDC->LineTo( itemRect.left , itemRect.bottom -1);
//<2F><>
pDC->SelectObject( &p_GRAY );
pDC->MoveTo( itemRect.right -1, itemRect.top );
pDC->LineTo( itemRect.right -1 , itemRect.bottom -1 );
//<2F><>
pDC->MoveTo( itemRect.left , itemRect.bottom -1 );
pDC->LineTo( itemRect.right -1, itemRect.bottom -1);
}
else
{
pOldPen = pDC->SelectObject( &p_GRAY );
//<2F><>
pDC->MoveTo( itemRect.left , itemRect.top );
pDC->LineTo( itemRect.right -1, itemRect.top );
//<2F><>
pDC->MoveTo( itemRect.left , itemRect.top );
pDC->LineTo( itemRect.left , itemRect.bottom -1);
//<2F><>
pDC->SelectObject( &p_WHITE );
pDC->MoveTo( itemRect.right -1, itemRect.top );
pDC->LineTo( itemRect.right -1 , itemRect.bottom -1 );
//<2F><>
pDC->MoveTo( itemRect.left , itemRect.bottom -1 );
pDC->LineTo( itemRect.right -1, itemRect.bottom -1);
}
pDC->SelectObject( pOldPen );
}
if (bOldBitmap )
pDispDC.SelectObject( pOldBitmap );
}
BOOL LuButton::PreTranslateMessage(MSG* pMsg)
{
if (m_ToolTip.m_hWnd == NULL)
{
m_ToolTip.Create(this);
m_ToolTip.SetMaxTipWidth(400);
m_ToolTip.Activate(FALSE);
}
m_ToolTip.RelayEvent(pMsg);
return CButton::PreTranslateMessage(pMsg);
}
void LuButton::OnMouseMove(UINT nFlags, CPoint point)
{
CButton::OnMouseMove(nFlags, point);
/*
//<2F><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>
if (nFlags & MK_LBUTTON )
{
Invalidate(true);
return;
}
*/
if (GetCapture() != this )
{
if ( m_bSound ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sndPlaySound( m_szSoundFile , SND_ASYNC );
m_bMouseOnButton = true;
SetCapture();
Invalidate(true);
}
else
{
POINT p2 = point;
ClientToScreen(&p2);
CWnd* wndUnderMouse = WindowFromPoint(p2);
if (wndUnderMouse != this)
{
if (m_bMouseOnButton == TRUE)
{
m_bMouseOnButton = FALSE;
Invalidate();
}
if (!(nFlags & MK_LBUTTON)) ReleaseCapture();
}
}
}
2025-04-11 17:19:25 +08:00
void LuButton::OnTimer(UINT_PTR nIDEvent)
2025-02-27 16:58:16 +08:00
{
switch( nIDEvent )
{
case 1:
//<2F><><EFBFBD><EFBFBD>Ϊѡ<CEAA><D1A1>״̬,<2C><><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><E4BBBB>ʾ<EFBFBD><CABE>ͼƬ
if ( m_bSelect && m_lBmpCount > 0)
{
m_lNowBmp ++;
if ( m_lNowBmp >m_lBmpCount )
m_lNowBmp = 1;
this->Invalidate();
}
break;
case 2:
if ( m_bFlash && m_lMaxFlashCount > 0 )
{
m_lFlashCount ++;
this->Invalidate();
}
break;
}
CButton::OnTimer(nIDEvent);
}
BOOL LuButton::SetSelTooltip(TCHAR *szText)
{
if ( szText )
{
_stprintf( m_szSelTip , szText );
return true;
}
else
{
return false;
}
}
BOOL LuButton::ActiveToolTip(bool bActive)
{
TCHAR szTipText[ 256 ];
if ( m_bSelect )
_stprintf( szTipText , m_szSelTip );
else
_stprintf( szTipText , m_szUnSelTip );
// Initialize ToolTip
if (m_ToolTip.m_hWnd == NULL)
{
// Create ToolTip control
m_ToolTip.Create(this);
m_ToolTip.SetMaxTipWidth(400);
// Create inactive
m_ToolTip.Activate(FALSE);
}
// If there is no tooltip defined then add it
if (m_ToolTip.GetToolCount() == 0)
{
CRect rectBtn;
GetClientRect(rectBtn);
m_ToolTip.AddTool(this, szTipText, rectBtn, 1);
}
// Set text for tooltip
m_ToolTip.UpdateTipText(szTipText, this, 1);
m_ToolTip.Activate(bActive);
return true;
}
BOOL LuButton::SetUnSelToolTip(TCHAR *szText)
{
if ( szText )
{
_stprintf( m_szUnSelTip , szText );
return true;
}
else
{
return false;
}
}
BOOL LuButton::SetButtonSel(BOOL bSelect)
{
m_bSelect = bSelect;
if ( m_bSelect )
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰΪѡ<CEAA><D1A1>״̬,<2C><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ʱ<EFBFBD><CAB1>
if ( m_lBmpCount > 1 ) //ֻ<>е<EFBFBD><D0B5><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><31><CAB1><EFBFBD><EFBFBD>Ϊ<EFBFBD>˰<EFBFBD>ŤΪ<C5A4><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>timer
SetTimer( 1 , m_lDHTime , NULL );
}
else
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD><C9B1>timer,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
KillTimer( 1 );
}
ActiveToolTip( true );
this->Invalidate();
return m_bSelect;
}
BOOL LuButton::GetButtonSel()
{
return m_bSelect;
}
long LuButton::AddButtonBmp(UINT nIDResource)
{
if ( m_lBmpCount >= m_lMaxBmp )
return -1;
m_lBmpCount = m_lBmpCount +1;
switch( m_lBmpCount )
{
case 1:
m_bmp1.LoadBitmap( nIDResource );break;
case 2:
m_bmp2.LoadBitmap( nIDResource );break;
case 3:
m_bmp3.LoadBitmap( nIDResource );break;
case 4:
m_bmp4.LoadBitmap( nIDResource );break;
case 5:
m_bmp5.LoadBitmap( nIDResource );break;
}
return m_lBmpCount;
}
long LuButton::AddButtonBmp(LPCTSTR lpszResourceName)
{
if ( m_lBmpCount >= m_lMaxBmp )
return -1;
m_lBmpCount = m_lBmpCount +1;
switch( m_lBmpCount )
{
case 1:
m_bmp1.LoadBitmap( lpszResourceName );break;
case 2:
m_bmp2.LoadBitmap( lpszResourceName );break;
case 3:
m_bmp3.LoadBitmap( lpszResourceName );break;
case 4:
m_bmp4.LoadBitmap( lpszResourceName );break;
case 5:
m_bmp5.LoadBitmap( lpszResourceName );break;
}
return m_lBmpCount;
}
BOOL LuButton::SetUnSelBmp(UINT nIDResource)
{
if ( !m_bUnBmp )
{
m_unBmp.LoadBitmap( nIDResource );
m_bUnBmp = true;
return true;
}
else
{
m_unBmp.DeleteObject();
m_unBmp.LoadBitmap( nIDResource );
return true;
}
return false;
}
BOOL LuButton::SetUnSelBmp(LPCTSTR lpszResourceName )
{
if ( !m_bUnBmp )
{
m_unBmp.LoadBitmap( lpszResourceName );
m_bUnBmp = true;
return true;
}
else
{
m_unBmp.DeleteObject();
m_unBmp.LoadBitmap( lpszResourceName );
return true;
}
return false;
}
//DEL void LuButton::OnClicked()
//DEL {
//DEL // if ( m_lBmpCount >0 )
//DEL // SetButtonSel( m_bSelect ? false : true );
//DEL }
BOOL LuButton::SetFlat(BOOL bFlat)
{
BOOL bOldFlat = m_bFlat;
m_bFlat = bFlat ;
return bOldFlat ;
}
BOOL LuButton::GetFlat()
{
return m_bFlat ;
}
BOOL LuButton::SetSound(bool bSound)
{
BOOL bOldSound = bSound;
m_bSound = bSound;
return bOldSound;
}
BOOL LuButton::SetSoundFileName(TCHAR *szFile)
{
if ( szFile )
{
_stprintf( m_szSoundFile , szFile );
m_bSound = true;
return true;
}
else
{
return false;
}
}
BOOL LuButton::SetDisableBmp(UINT nIDResource)
{
if ( !m_bDisBmp )
{
m_DisBmp.LoadBitmap( nIDResource );
m_bDisBmp = true;
return true;
}
else
{
m_DisBmp.DeleteObject();
m_DisBmp.LoadBitmap( nIDResource );
return true;
}
return false;
}
BOOL LuButton::SetDisableBmp(LPCTSTR lpszResourceName)
{
if ( !m_bDisBmp )
{
m_DisBmp.LoadBitmap( lpszResourceName );
m_bDisBmp = true;
return true;
}
else
{
m_DisBmp.DeleteObject();
m_DisBmp.LoadBitmap( lpszResourceName );
return true;
}
return false;
}
BOOL LuButton::SetFlatBmp(UINT nIDResource)
{
if ( !m_bFlatBmp )
{
m_FlatBmp.LoadBitmap( nIDResource );
m_bFlatBmp = true;
return true;
}
else
{
m_FlatBmp.DeleteObject();
m_FlatBmp.LoadBitmap( nIDResource );
return true;
}
return false;
}
BOOL LuButton::SetFlatBmp(LPCTSTR lpszResourceName)
{
if ( !m_bFlatBmp )
{
m_FlatBmp.LoadBitmap( lpszResourceName );
m_bFlatBmp = true;
return true;
}
else
{
m_FlatBmp.DeleteObject();
m_FlatBmp.LoadBitmap( lpszResourceName );
return true;
}
return false;
}
BOOL LuButton::SetClickBmp(UINT nIDResource)
{
if ( !m_bClickBmp )
{
m_ClickBmp.LoadBitmap( nIDResource );
m_bClickBmp = true;
return true;
}
else
{
m_ClickBmp.DeleteObject();
m_ClickBmp.LoadBitmap( nIDResource );
return true;
}
return false;
}
BOOL LuButton::SetClickBmp(LPCTSTR lpszResourceName)
{
if ( !m_bClickBmp )
{
m_ClickBmp.LoadBitmap( lpszResourceName );
m_bClickBmp = true;
return true;
}
else
{
m_ClickBmp.DeleteObject();
m_ClickBmp.LoadBitmap( lpszResourceName );
return true;
}
return false;
}
void LuButton::OnKillFocus(CWnd* pNewWnd)
{
CButton::OnKillFocus(pNewWnd);
if ( !m_bFlat && !m_bFlatBmp )
return;
if (m_bMouseOnButton == TRUE)
{
m_bMouseOnButton = FALSE;
Invalidate();
}
}
void LuButton::OnCaptureChanged(CWnd *pWnd)
{
if (m_bMouseOnButton == TRUE)
{
ReleaseCapture();
Invalidate();
}
CButton::OnCaptureChanged(pWnd);
}
BOOL LuButton::SetFlash(long lFlashTimer, long lFlashCount, BOOL bFlash)
{
BOOL bOldFlash = m_bFlash;
if ( lFlashCount > 0)
{
m_lMaxFlashCount = lFlashCount;
m_lFlashCount = 0;
}
else
{
m_lMaxFlashCount = 0;
m_lFlashCount = 0;
}
if ( lFlashTimer > 0 )
m_lFlashTime = lFlashTimer;
m_bFlash = bFlash;
if ( m_bFlash )
SetTimer( 2 , m_lFlashTime , NULL );
else
KillTimer( 2 );
return bOldFlash;
}
void LuButton::DrawBitmap(CDC* pDC, int x, int y, int width,int height,CBitmap* pBmp)
// x,y <20><>Ҫ<EFBFBD><D2AA>ʾ<EFBFBD><CABE>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD>width<74><68>height<68>ǻ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// crColor <20><>Ҫ<EFBFBD><D2AA>ʾλͼ<CEBB>ı<EFBFBD><C4B1><EFBFBD>ɫ
{
if (!pBmp)
return;
Bitmap* pBitmap = Bitmap::FromHBITMAP((HBITMAP)pBmp->GetSafeHandle(), NULL);
if (pBitmap)
{
Graphics graphics(pDC->m_hDC);
graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic); // <20><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/*
int imageWidth = pBitmap->GetWidth();
int imageHeight = pBitmap->GetHeight();
float scaleX = static_cast<float>(width) / imageWidth;
float scaleY = static_cast<float>(height) / imageHeight;
float scale = min(scaleX, scaleY);
int scaledWidth = static_cast<int>(imageWidth * scale);
int scaledHeight = static_cast<int>(imageHeight * scale);s
int xPos = (itemRect.Width() - scaledWidth) / 2;
int yPos = (itemRect.Height() - scaledHeight) / 2;
*/
// <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>ɫΪ͸<CEAA><CDB8>
//graphics.Clear(Color::Transparent);
//<2F><><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD>ʾ
//graphics.DrawImage(pBitmap, xPos, yPos, scaledWidth, scaledHeight);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
graphics.DrawImage(pBitmap,x,y, width, height);
delete pBitmap;
}
}
2025-02-27 16:58:16 +08:00
void LuButton::DrawTransparentBitmap(CDC *pDC, int x, int y, CBitmap * pBmp, COLORREF crColor)
// x,y <20><>Ҫ<EFBFBD><D2AA>ʾ<EFBFBD><CABE>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD>id <20><>Ҫ<EFBFBD><D2AA>ʾ<EFBFBD><CABE>λͼ<CEBB><CDBC>Դ<EFBFBD><D4B4>ID
// crColor <20><>Ҫ<EFBFBD><D2AA>ʾλͼ<CEBB>ı<EFBFBD><C4B1><EFBFBD>ɫ
{
COLORREF crOldBack=pDC->SetBkColor(RGB(255,255,255));
COLORREF crOldText=pDC->SetTextColor(RGB(0,0,0));
CDC dcImage,dcMask;
//CBitmap bmp;
BITMAP bm;
//bmp.LoadBitmap(id);
//bmp.LoadBitmap(129);
//bmp.CreateBitmapIndirect(pBmp);
//bmp.FromHandle( (HBITMAP)pBmp );
//bmp = *pBmp
pBmp->GetBitmap(&bm);
int nWidth=bm.bmWidth,nHeight=bm.bmHeight;
dcImage.CreateCompatibleDC(pDC);
dcMask.CreateCompatibleDC(pDC);
CBitmap * pOldBitmapImage=dcImage.SelectObject(pBmp);
CBitmap bitmapMask;
bitmapMask.CreateBitmap(nWidth,nHeight,1,1,NULL);
CBitmap * pOldBitmapMask=dcMask.SelectObject(&bitmapMask);
dcImage.SetBkColor(crColor);
dcMask.BitBlt(0,0,nWidth,nHeight,&dcImage,0,0,SRCCOPY);
pDC->BitBlt(x,y,nWidth,nHeight,&dcImage,0,0,SRCINVERT);
pDC->BitBlt(x,y,nWidth,nHeight,&dcMask,0,0,SRCAND);
pDC->BitBlt(x,y,nWidth,nHeight,&dcImage,0,0,SRCINVERT);
dcImage.SelectObject(pOldBitmapImage);
dcMask.SelectObject(pOldBitmapMask);
pDC->SetBkColor(crOldBack);
pDC->SetTextColor(crOldText);
}
BOOL LuButton::SetTransBK(BOOL bTransBk)
{
BOOL bOldTransBk = m_bTransBk;
m_bTransBk = bTransBk ;
return bOldTransBk ;
}
long LuButton::SetTransBKColor(COLORREF rgbColor)
{
long lOldTransColor = m_RGBTrans;
m_RGBTrans = rgbColor;
return lOldTransColor;
}
long LuButton::SetDHTime( long lDHTime )
{
long lOldTime = m_lDHTime;
m_lDHTime = lDHTime;
return lOldTime;
}
BOOL LuButton::SetWindowRgnFromBmp(HBITMAP hBmp, COLORREF cTransparentColor, COLORREF cTolerance)
{
HRGN hRgn = NULL;
BITMAP bm;
if (hBmp)
{
// Create a memory DC inside which we will scan the bitmap content
HDC hMemDC = CreateCompatibleDC(NULL);
if (hMemDC)
{
// Get bitmap size
//BITMAP bm;
GetObject(hBmp, sizeof(bm), &bm);
// Create a 32 bits depth bitmap and select it into the memory DC
BITMAPINFOHEADER RGB32BITSBITMAPINFO = {
sizeof(BITMAPINFOHEADER), // biSize
bm.bmWidth, // biWidth;
bm.bmHeight, // biHeight;
1, // biPlanes;
32, // biBitCount
BI_RGB, // biCompression;
0, // biSizeImage;
0, // biXPelsPerMeter;
0, // biYPelsPerMeter;
0, // biClrUsed;
0 // biClrImportant;
};
VOID * pbits32;
HBITMAP hbm32 = CreateDIBSection(hMemDC, (BITMAPINFO *)&RGB32BITSBITMAPINFO, DIB_RGB_COLORS, &pbits32, NULL, 0);
if (hbm32)
{
HBITMAP holdBmp = (HBITMAP)SelectObject(hMemDC, hbm32);
// Create a DC just to copy the bitmap into the memory DC
HDC hDC = CreateCompatibleDC(hMemDC);
if (hDC)
{
// Get how many bytes per row we have for the bitmap bits (rounded up to 32 bits)
BITMAP bm32;
GetObject(hbm32, sizeof(bm32), &bm32);
while (bm32.bmWidthBytes % 4)
bm32.bmWidthBytes++;
// Copy the bitmap into the memory DC
HBITMAP holdBmp = (HBITMAP)SelectObject(hDC, hBmp);
BitBlt(hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, hDC, 0, 0, SRCCOPY);
// For better performances, we will use the ExtCreateRegion() function to create the
// region. This function take a RGNDATA structure on entry. We will add rectangles by
// amount of ALLOC_UNIT number in this structure.
#define ALLOC_UNIT 100
DWORD maxRects = ALLOC_UNIT;
HANDLE hData = GlobalAlloc(GMEM_MOVEABLE, sizeof(RGNDATAHEADER) + (sizeof(RECT) * maxRects));
RGNDATA *pData = (RGNDATA *)GlobalLock(hData);
pData->rdh.dwSize = sizeof(RGNDATAHEADER);
pData->rdh.iType = RDH_RECTANGLES;
pData->rdh.nCount = pData->rdh.nRgnSize = 0;
SetRect(&pData->rdh.rcBound, MAXLONG, MAXLONG, 0, 0);
// Keep on hand highest and lowest values for the "transparent" pixels
BYTE lr = GetRValue(cTransparentColor);
BYTE lg = GetGValue(cTransparentColor);
BYTE lb = GetBValue(cTransparentColor);
BYTE hr = min(0xff, lr + GetRValue(cTolerance));
BYTE hg = min(0xff, lg + GetGValue(cTolerance));
BYTE hb = min(0xff, lb + GetBValue(cTolerance));
// Scan each bitmap row from bottom to top (the bitmap is inverted vertically)
BYTE *p32 = (BYTE *)bm32.bmBits + (bm32.bmHeight - 1) * bm32.bmWidthBytes;
for (int y = 0; y < bm.bmHeight; y++)
{
// Scan each bitmap pixel from left to right
for (int x = 0; x < bm.bmWidth; x++)
{
// Search for a continuous range of "non transparent pixels"
int x0 = x;
LONG *p = (LONG *)p32 + x;
while (x < bm.bmWidth)
{
BYTE b = GetRValue(*p);
if (b >= lr && b <= hr)
{
b = GetGValue(*p);
if (b >= lg && b <= hg)
{
b = GetBValue(*p);
if (b >= lb && b <= hb)
// This pixel is "transparent"
break;
}
}
p++;
x++;
}
if (x > x0)
{
// Add the pixels (x0, y) to (x, y+1) as a new rectangle in the region
if (pData->rdh.nCount >= maxRects)
{
GlobalUnlock(hData);
maxRects += ALLOC_UNIT;
hData = GlobalReAlloc(hData, sizeof(RGNDATAHEADER) + (sizeof(RECT) * maxRects), GMEM_MOVEABLE);
pData = (RGNDATA *)GlobalLock(hData);
}
RECT *pr = (RECT *)&pData->Buffer;
SetRect(&pr[pData->rdh.nCount], x0, y, x, y+1);
if (x0 < pData->rdh.rcBound.left)
pData->rdh.rcBound.left = x0;
if (y < pData->rdh.rcBound.top)
pData->rdh.rcBound.top = y;
if (x > pData->rdh.rcBound.right)
pData->rdh.rcBound.right = x;
if (y+1 > pData->rdh.rcBound.bottom)
pData->rdh.rcBound.bottom = y+1;
pData->rdh.nCount++;
// On Windows98, ExtCreateRegion() may fail if the number of rectangles is too
// large (ie: > 4000). Therefore, we have to create the region by multiple steps.
if (pData->rdh.nCount == 2000)
{
HRGN h = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER) + (sizeof(RECT) * maxRects), pData);
if (hRgn)
{
CombineRgn(hRgn, hRgn, h, RGN_OR);
DeleteObject(h);
}
else
hRgn = h;
pData->rdh.nCount = 0;
SetRect(&pData->rdh.rcBound, MAXLONG, MAXLONG, 0, 0);
}
}
}
// Go to next row (remember, the bitmap is inverted vertically)
p32 -= bm32.bmWidthBytes;
}
// Create or extend the region with the remaining rectangles
HRGN h = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER) + (sizeof(RECT) * maxRects), pData);
if (hRgn)
{
CombineRgn(hRgn, hRgn, h, RGN_OR);
DeleteObject(h);
}
else
hRgn = h;
// Clean up
SelectObject(hDC, holdBmp);
DeleteDC(hDC);
}
DeleteObject(SelectObject(hMemDC, holdBmp));
}
DeleteDC(hMemDC);
}
}
if ( hRgn )
{
CRect rect;
this->GetWindowRect( &rect);
//this->ClientToScreen(&rect);
this->MoveWindow( rect.left , rect.top , bm.bmWidth , bm.bmHeight );
this->SetWindowRgn( hRgn , true);
return true;
}
return false;
}
void LuButton::PaintBk(CDC *pDC)
{
CClientDC clDC(GetParent());
//CPaintDC clDC(m_pMainWnd);
//CDC clDC(this->GetParent() );
//CDC * p2DC =GetParent()->GetDC();
CRect rect;
CRect rect1;
GetClientRect(rect);
GetWindowRect(rect1);
GetParent()->ScreenToClient(rect1);
if (m_dcBk.m_hDC == NULL)
{
m_dcBk.CreateCompatibleDC(&clDC);
m_bmpBk.CreateCompatibleBitmap(&clDC, rect.Width(), rect.Height());
m_pbmpOldBk = m_dcBk.SelectObject(&m_bmpBk);
m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(), &clDC, rect1.left, rect1.top, SRCCOPY);
}
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcBk,0,0, SRCCOPY);
}
void LuButton::SetMainWin(CWnd *pWnd)
{
m_pMainWnd = pWnd;
}
BOOL LuButton::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return false;
//return CButton::OnEraseBkgnd(pDC);
}
BOOL LuButton::SetWindowRgnFromBmp(UINT uiBmp, COLORREF cTransparentColor, COLORREF cTolerance)
{
CBitmap bmp;
if ( bmp.LoadBitmap( uiBmp ) )
{
SetWindowRgnFromBmp((HBITMAP)bmp , cTransparentColor , cTolerance );
return true;
}
else
return false;
}
void LuButton::SetHandBmp(HBITMAP hBmp)
{
m_bHandBmp = true;
m_bHandBmp2 = true;
m_hHandBmp = hBmp;
}
void LuButton::SetHandBmp(BOOL bTrue)
{
m_bHandBmp = bTrue;
m_bHandBmp2 = bTrue;
}