⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gwexttranssplashwnd.cpp

📁 完整的MP3播放器源码
💻 CPP
字号:
// GWExtTransSplashWnd.cpp: implementation of the GWExtTransSplashWnd class.
//
//////////////////////////////////////////////////////////////////////
//*******************************************************************************
// 版权声明
// ------------------------------------------------------------------------------
// 此段代码是AppBuilder扩展类库GWC的一部分.
// 你可以使用、重新编译、或者编译成你的发行软件的一部分。
// 但是在没有经过我们书面同意的情况下,你不能直接发行此代码文件.
//-------------------------------------------------------------------------------
// 版权所有.
// 作者:张修勇
// 拷贝日期:2000年10月05日
//-------------------------------------------------------------------------------
// 主页:   http://www.ucancode.com
// 技术支持E-Mail: AppBuilder@hotmail.com
//*******************************************************************************


#include "stdafx.h"
#include "GWExtDIBSectionLite.h"
#include "GWExtTransSplashWnd.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
// GWExtTransSplashWnd

GWExtTransSplashWnd::GWExtTransSplashWnd(UINT nBitmapID, BOOL bUseColor,COLORREF cr,UINT nDuration)
{
	m_nBitmapID = nBitmapID;
	m_nDuration = nDuration;

	m_be = FALSE;
	bUseColor = bUseColor;
	crTransColor = cr;


}

BEGIN_MESSAGE_MAP(GWExtTransSplashWnd, CWnd)
	//{{AFX_MSG_MAP(GWExtTransSplashWnd)
	ON_WM_PAINT()
	ON_WM_TIMER()
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()



BOOL GWExtTransSplashWnd::Create()
{
	if( !GetBitmapAndPalette(m_nBitmapID, m_bitmap, m_pal) )
	{
		TRACE1( "Could not load bitmap resource - %d\n", m_nBitmapID );
		return FALSE;
	}


	BITMAP bm;
	m_bitmap.GetObject(sizeof(BITMAP), &bm);
	
	// First create an invisible window
	m_wndInvisible.CreateEx(WS_EX_TOPMOST, 
			AfxRegisterWndClass(CS_CLASSDC), 
			_T(""), WS_POPUP, 0, 0, 
			bm.bmWidth, bm.bmHeight, NULL, NULL);

	// Create the the splash window with invisible parent as parent
	BOOL bRetVal = CWnd::CreateEx(WS_EX_TOPMOST, 
			AfxRegisterWndClass(CS_CLASSDC), 
			_T(""), WS_POPUP, 0, 0, 
			bm.bmWidth, bm.bmHeight, m_wndInvisible.m_hWnd, NULL);

	CenterWindow();
	ShowWindow(SW_SHOW);
	UpdateWindow();
	
	//Create the timer.
	m_nTimerID = SetTimer(1, m_nDuration, NULL);
	ASSERT(m_nTimerID);

	if (m_be)
		SetTimer(m_nTimerID, 5000, NULL);
	
	return bRetVal;
}


BOOL GWExtTransSplashWnd::GetBitmapAndPalette(UINT nIDResource, CBitmap &bitmap, CPalette &pal)
{
	LPCTSTR lpszResourceName = (LPCTSTR)nIDResource;

	HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(), 
			lpszResourceName, IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION );

	if( hBmp == NULL ) 
		return FALSE;

	bitmap.Attach( hBmp );

	// Create a logical palette for the bitmap
	DIBSECTION ds;
	BITMAPINFOHEADER &bmInfo = ds.dsBmih;
	bitmap.GetObject( sizeof(ds), &ds );

	int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount;

	// Create a halftone palette if colors > 256. 
	CClientDC dc(NULL);			// Desktop DC
	if( nColors > 256 )
		pal.CreateHalftonePalette( &dc );
	else
	{
		// Create the palette

		RGBQUAD *pRGB = new RGBQUAD[nColors];
		CDC memDC;
		memDC.CreateCompatibleDC(&dc);

		memDC.SelectObject( &bitmap );
		::GetDIBColorTable( memDC, 0, nColors, pRGB );

		UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
		LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];

		pLP->palVersion = 0x300;
		pLP->palNumEntries = nColors;

		for( int i=0; i < nColors; i++)
		{
			pLP->palPalEntry[i].peRed = pRGB[i].rgbRed;
			pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
			pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
			pLP->palPalEntry[i].peFlags = 0;
		}

		pal.CreatePalette( pLP );

		delete[] pLP;
		delete[] pRGB;
	}

	return TRUE;
}

void GWExtTransSplashWnd::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// Create a memory DC compatible with the paint DC
	CDC memDC;
	memDC.CreateCompatibleDC( &dc );

	CBitmap *pBmpOld = memDC.SelectObject( &m_bitmap );

	// Select and realize the palette
	if( dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE && m_pal.m_hObject != NULL )
	{
		dc.SelectPalette( &m_pal, FALSE );
		dc.RealizePalette();
	}


	// Window is same size as bitmap
	CRect rcWnd;
	GetWindowRect( &rcWnd );
	dc.BitBlt(0, 0, rcWnd.Width(), rcWnd.Height(), &memDC, 0, 0,SRCCOPY);

	
		//You can add your control code here.
	memDC.SelectObject( pBmpOld );


	// Do not call CWnd::OnPaint() for painting messages
}

void GWExtTransSplashWnd::OnTimer(UINT nIDEvent) 
{
	if (m_nTimerID == nIDEvent)
	{	
		//Destroy the timer and splash window
		KillTimer(m_nTimerID);
		m_wndInvisible.DestroyWindow(); 	
		delete this;
		return;
	}	 
	
	CWnd::OnTimer(nIDEvent);
}

BOOL GWExtTransSplashWnd::PreTranslateMessage(MSG* pMsg) 
{
	ASSERT(pMsg != NULL);
	
	if (pMsg->message == WM_KEYDOWN ||
			pMsg->message == WM_SYSKEYDOWN ||
			pMsg->message == WM_LBUTTONDOWN ||
			pMsg->message == WM_RBUTTONDOWN ||
			pMsg->message == WM_MBUTTONDOWN )
	{
		//Destroy the timer and splash window
//		KillTimer(m_nTimerID);
//		m_wndInvisible.DestroyWindow(); 	
//		delete this;
//		return 1;
	}	 
	
	return CWnd::PreTranslateMessage(pMsg);
}

int GWExtTransSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	//
	// Set the region.
	//
	CBitmap bmp;
	bmp.LoadBitmap(m_nBitmapID);
	CPoint pt(0,0);
	if(bUseColor)
	{
		HRGN hRgn = CreateRegionByColor(bmp, crTransColor);
		SetWindowRgn(hRgn, TRUE);
	}
	else
	{
		HRGN hRgn = CreateRegion(bmp, &pt);
		SetWindowRgn(hRgn, TRUE);
	}
	return 0;
}

HRGN GWExtTransSplashWnd::CreateRegion(HBITMAP hBmp, LPPOINT pPoint)
{
	pPoint;
	GWExtDIBSectionLite bmp;
	bmp.SetBitmap(hBmp);

	HRGN mainRgn;
	mainRgn = NULL;
	HRGN tmpRgn;
	COLORREF tc;
	tc = RGB(0,0,0);
	int x, y, l = 0;
	BOOL bFirstTime = TRUE; 
	BOOL bEndofLine = FALSE;
	
	CDC *pMemDC = bmp.GetMemoryDC();
	
	// Scan the bitmap pixel by pixel looking for transparencies
	// and then creating a region by ORing the transparencies to remove them
	for(y = 0; y < bmp.GetHeight(); y++) 
	{
		for(x = 0; x <= bmp.GetWidth(); x++) 
		{
			//If we are in the top left corner
			//get the colour of this pixel
			//This will be used as our transparency color
			if ((x == 0 || y == 0))
				tc = pMemDC->GetPixel(0,0);
			
			//If this pixel is the same color as our tansparency
			// or we are on the right hand side of the image
			if((pMemDC->GetPixel(x, y) == tc) || (x == bmp.GetWidth()))
			{
				//If this boolean value is true
				if(bEndofLine) 
				{
					bEndofLine = FALSE;
					
					//Create a region which is as big as our image so far
					tmpRgn = CreateRectRgn(l, y, x, y+1);
					
					//If this is the first time round
					if(bFirstTime) 
					{
						mainRgn = tmpRgn;
						bFirstTime = FALSE;
					} 
					else 
						CombineRgn(mainRgn, mainRgn, tmpRgn, RGN_OR);
				}
			} 
			else 
			{
				if(!bEndofLine) 
				{
					bEndofLine = TRUE;
					l = x;
				}
			}
		}
	}
	
	return mainRgn;
}
HRGN GWExtTransSplashWnd::CreateRegionByColor(HBITMAP hBmp, COLORREF color)
{
	GWExtDIBSectionLite bmp;
	bmp.SetBitmap(hBmp);

	HRGN mainRgn;
	mainRgn = NULL;
	HRGN tmpRgn;
	COLORREF tc;
	tc = color;
	int x, y, l = 0;
	BOOL bFirstTime = TRUE; 
	BOOL bEndofLine = FALSE;
	
	CDC *pMemDC = bmp.GetMemoryDC();
	
	// Scan the bitmap pixel by pixel looking for transparencies
	// and then creating a region by ORing the transparencies to remove them
	for(y = 0; y < bmp.GetHeight(); y++) 
	{
		for(x = 0; x <= bmp.GetWidth(); x++) 
		{
			//If we are in the top left corner
			//get the colour of this pixel
			//This will be used as our transparency color
	//		if ((x == 0 || y == 0))
	//			tc = pMemDC->GetPixel(0,0);
			
			//If this pixel is the same color as our tansparency
			// or we are on the right hand side of the image
			if((pMemDC->GetPixel(x, y) == tc) || (x == bmp.GetWidth()))
			{
				//If this boolean value is true
				if(bEndofLine) 
				{
					bEndofLine = FALSE;
					
					//Create a region which is as big as our image so far
					tmpRgn = CreateRectRgn(l, y, x, y+1);
					
					//If this is the first time round
					if(bFirstTime) 
					{
						mainRgn = tmpRgn;
						bFirstTime = FALSE;
					} 
					else 
						CombineRgn(mainRgn, mainRgn, tmpRgn, RGN_OR);
				}
			} 
			else 
			{
				if(!bEndofLine) 
				{
					bEndofLine = TRUE;
					l = x;
				}
			}
		}
	}
	
	return mainRgn;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -