www.pudn.com > XRayImg.rar > AboutCtrl.cpp


/****************************************************************/ 
/*																*/ 
/*  AboutCtrl.cpp												*/ 
/*																*/ 
/*  Implementation of the CAboutCtrl.cpp class.					*/ 
/*																*/ 
/*  Programmed by Pablo van der Meer							*/ 
/*  Copyright Pablo Software Solutions 2002						*/ 
/*  http://www.pablovandermeer.nl								*/ 
/*																*/ 
/*  Last updated: 28 june 2002									*/ 
/*																*/ 
/****************************************************************/ 
//修改:	徐卫华	2005.8.3 
//修改内容: 
//	1) 增加设置的接口 SetCredits() 
//	2) 修改 deg2rad() 为static 
//	3) 增加 退出功能 
/****************************************************************/ 
#include "stdafx.h" 
#include "AboutCtrl.h" 
#include  
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
// convert degrees to radians 
static double deg2rad(int angle)  
{ 
	// (angle / 180) * 3.14159265359 
	return angle * 0.0174; 
} 
 
CAboutCtrl::CAboutCtrl() 
{ 
	m_hCreditsDC = NULL; 
	m_hLogoDC = NULL; 
	m_hBackgroundDC = NULL; 
	m_hMemDC = NULL; 
 
	m_cxLogo = 0; 
	m_cyLogo = 0; 
	m_xPos = 0; 
	m_yPos = 0;  
	m_strCredits=_T(""); 
 } 
 
 
CAboutCtrl::~CAboutCtrl() 
{ 
	// clean up 
 
	if (m_hCreditsDC != NULL) 
		DeleteDC(m_hCreditsDC); 
	if (m_hLogoDC != NULL) 
		DeleteDC(m_hLogoDC); 
	if (m_hBackgroundDC != NULL) 
		DeleteDC(m_hBackgroundDC); 
	if (m_hMemDC != NULL) 
		DeleteDC(m_hMemDC); 
} 
 
 
BEGIN_MESSAGE_MAP(CAboutCtrl, CStatic) 
	//{{AFX_MSG_MAP(CAboutCtrl) 
	ON_WM_PAINT() 
	ON_WM_TIMER() 
	ON_CONTROL_REFLECT(BN_CLICKED, OnClicked) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : OnPaint											*/ 
/* Description   : Called when the application makes a request to	*/ 
/*				   repaint a portion of the window.					*/ 
/*																	*/ 
/********************************************************************/ 
void CAboutCtrl::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting 
} 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : PreSubclassWindow								*/ 
/* Description   : Called before the window is subclassed.			*/ 
/*																	*/ 
/********************************************************************/ 
void CAboutCtrl::PreSubclassWindow()  
{ 
	// initialze dc's 
	DWORD dwStyle = GetStyle(); 
    ::SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle | SS_NOTIFY); 
 
	Initialize();	 
	// start animation 
	SetTimer(1, 60, NULL); 
 
	CStatic::PreSubclassWindow(); 
} 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : Initialize										*/ 
/* Description   : Initialize some stuff							*/ 
/*																	*/ 
/********************************************************************/ 
void CAboutCtrl::Initialize() 
{ 
	int cx, cy; 
 
	// First time calling , do some init (loading pictures and create's some Hdc 
	m_xAngle = 180;	// logo x angle 
	m_yAngle = 60;	// logo y angle 
	m_nSpeed = 6;	// spin speed 
		 
	m_cxData = 400; 
	m_cyData = 500; 
 
	CRect rect; 
	GetClientRect(rect); 
 
	CDC *pDC = GetDC(); 
 
	// create credits dc 
	LoadCredits(m_hCreditsDC, m_cxData, m_cyData, pDC->m_hDC); 
	// Load logo and creates logo dc 
	LoadPicture(m_nBmpLogo, m_hLogoDC, m_cxLogo, m_cyLogo, pDC->m_hDC); 
	// Load Backgroundpicture and creates background DC 
	LoadPicture(m_nBmpBkg, m_hBackgroundDC, cx, cy, pDC->m_hDC);  
	// create work area 
	LoadPicture(0, m_hMemDC, cx, cy, pDC->m_hDC); 
 
	// set scroll counter 
	m_nCounter = rect.Height(); 
 
	ReleaseDC(pDC); 
} 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : OnTimer											*/ 
/* Description   : Update display									*/ 
/*																	*/ 
/********************************************************************/ 
void CAboutCtrl::OnTimer(UINT nIDEvent)  
{ 
	if (nIDEvent == 1) 
	{ 
		AnimateLogo(); 
	} 
 
	CStatic::OnTimer(nIDEvent); 
} 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : AnimateLogo										*/ 
/* Description   : Animate 'flying' logo							*/ 
/*																	*/ 
/********************************************************************/ 
void CAboutCtrl::AnimateLogo() 
{ 
	CRect rect; 
	GetClientRect(rect); 
 
	// move from left to right 
	m_xPos = m_xPos + 2; 
	if (m_xPos > rect.Width()) 
	{	 
		m_xPos = -m_cxLogo / 2; 
	} 
 
	// move from top to bottom 
	m_yPos = m_yPos + 1; 
	if (m_yPos > rect.Height()) 
	{ 
		m_yPos = -m_cyLogo; 
	} 
	 
	// copy background in memory bitmap 
	BitBlt(m_hMemDC, 0, 0, rect.Width(), rect.Height(),  
		m_hBackgroundDC, 0, 0, SRCCOPY); 
 
	for (int i = 1; i < m_cxLogo; i++) 
	{ 
		// copy logo with sinus effect in memory dc 
		BitBlt(m_hMemDC, (int)(cos(deg2rad(m_xAngle + i)) * (m_cxLogo / 4.25) + m_xPos),  
								 (int)(sin(deg2rad(m_yAngle + i)) * 10 + 2.5 + m_yPos),  
								 1, m_cyLogo, m_hLogoDC, i, 0, SRCAND); 
	} 
         
	int yPos = m_cyData - m_nCounter - 100; 
	 
	// copy logo with sinus effect in memory dc 
	if (m_nCounter > (rect.Height() - 30)) 
	{ 
		yPos = m_cyData - m_nCounter - 100; 
	} 
 
	// copy credits in memory dc 
	BitBlt(m_hMemDC, m_nMemDCStartCx, m_nCounter--, m_cxData, yPos, m_hCreditsDC, 0, 0, SRCAND); 
 
	if (m_nCounter< -m_cyData) 
	{ 
		m_nCounter = rect.Height(); 
	} 
 
	CDC *pDC = GetDC(); 
 
	// and finally, copy memory bitmap to screen 
	BitBlt(pDC->m_hDC, 0, 0, rect.Width(), rect.Height(), m_hMemDC, 0, 0, SRCCOPY); 
 
	ReleaseDC(pDC); 
 
	// any calculations follows 
	m_xAngle = m_xAngle + (int)(m_nSpeed * 0.5);	// rotate logo x 
	m_yAngle = m_yAngle + m_nSpeed * 2;				// rotate logo y 
        
	// did full rotation ? 
	if (m_xAngle >= 360) 
	{ 
		// reset angle 
		m_xAngle = 0;	 
	} 
	 
	// did full rotation ? 
	if (m_xAngle <= -180)  
	{ 
		m_nSpeed = m_nSpeed * -1; 
	} 
	 
	if (m_yAngle >= 360) 
	{ 
		m_yAngle = 0; 
	} 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : LoadPicture										*/ 
/* Description   : Load picture from resource into device context	*/ 
/*																	*/ 
/********************************************************************/ 
void CAboutCtrl::LoadPicture(int nResourceID, HDC &hDestinationDC, int &nWidth, int &nHeight, HDC hDC) 
{ 
	HDC hMemDC; 
	HDC hdcCompatible; 
	HBITMAP hbmScreen; 
  
	if (nResourceID != 0) 
	{ 
		// if resourceid is given, load bitmap 
		HBITMAP hPicture = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(nResourceID)); 
		 
		BITMAP bm; 
		GetObject(hPicture, sizeof (BITMAP), (LPSTR)&bm); 
 
		hMemDC = CreateCompatibleDC(hDC); 
		 
		HBITMAP hOldBMP = (HBITMAP)SelectObject(hMemDC, hPicture); 
 
		nWidth = bm.bmWidth; 
		nHeight = bm.bmHeight; 
		 
		// Create the DC 
		hdcCompatible = CreateCompatibleDC(hDC);     
		// Temporary memory bitmap 
		hbmScreen = CreateCompatibleBitmap(hDC, nWidth, nHeight); 
 
		// select bitmap into dc 
		if (SelectObject(hdcCompatible, hbmScreen) == NULL) 
		{ 
			// return null 
			hDestinationDC = NULL;                                         
		} 
		else  
		{ 
			// return the DC 
			hDestinationDC = hdcCompatible; 
		} 
				 
		if (hDestinationDC) 
			BitBlt(hDestinationDC, 0, 0, nWidth, nHeight, hMemDC, 0, 0, SRCCOPY); 
 
		SelectObject(hMemDC, hOldBMP); 
 
		// Release temporary stuff 
		DeleteDC(hMemDC); 
		DeleteObject(hbmScreen); 
		DeleteObject(hPicture); 
	} 
	else	// if no resourceid is given, create empty DC with specified width and height 
	{ 
		// create the DC 
		hdcCompatible = CreateCompatibleDC(hDC);			 
		// temporary memory bitmap 
		hbmScreen = CreateCompatibleBitmap(hDC, nWidth, nHeight);		 
		// if the function fails 
		if (SelectObject(hdcCompatible, hbmScreen) == NULL) 
		{ 
			// return null 
			hDestinationDC = NULL; 
		} 
		else 
		{ 
			 // if it succeeds, return the DC 
			hDestinationDC = hdcCompatible;                                      
		} 
		DeleteObject(hbmScreen); 
	} 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : LoadCredits										*/ 
/* Description   : Create credits picture into device context		*/ 
/*																	*/ 
/********************************************************************/ 
void CAboutCtrl::LoadCredits(HDC &hDestinationDC, int nWidth, int nHeight, HDC hDC) 
{ 
	HDC hdcCompatible; 
	HBITMAP hbmScreen; 
  
	// Create the DC 
	hdcCompatible = CreateCompatibleDC(hDC);			 
	// Temporary bitmap 
	hbmScreen = CreateCompatibleBitmap(hDC, nWidth, nHeight);		 
	// if the function fails 
	if (SelectObject(hdcCompatible, hbmScreen) == NULL) 
	{ 
		// return null 
		hDC = NULL; 
	} 
	else 
	{ 
		 // if it succeeds, return the DC 
		hDestinationDC = hdcCompatible; 
		RECT rc; 
 
		rc.top = 0; 
		rc.left = 0; 
		rc.bottom = nHeight; 
		rc.right = nWidth; 
 
		HFONT pOldFont; 
		HFONT hFontTahoma, hFontBold, hFontNormal; 
		FillRect(hDestinationDC, &rc, (HBRUSH)GetStockObject(WHITE_BRUSH)); 
 
		// create a bunch of fonts 
		hFontTahoma = CreateFont(20, 0, 0, 0,  
 								FW_BOLD, FALSE, FALSE, 0,  
   								ANSI_CHARSET, 
                   	OUT_DEFAULT_PRECIS, 
                   	CLIP_DEFAULT_PRECIS, 
                   	PROOF_QUALITY, 
                   	VARIABLE_PITCH | 0x04 | FF_DONTCARE, 
                   	(LPSTR)"Arial"); 
 
		hFontBold = CreateFont(14, 0, 0, 0,  
 								FW_BOLD, FALSE, FALSE, 0,  
   								ANSI_CHARSET, 
                   	OUT_DEFAULT_PRECIS, 
                   	CLIP_DEFAULT_PRECIS, 
                   	PROOF_QUALITY, 
                   	VARIABLE_PITCH | 0x04 | FF_DONTCARE, 
                   	(LPSTR)"Arial"); 
 
		hFontNormal = CreateFont(14, 0, 0, 0,  
 								FALSE, FALSE, FALSE, 0,  
   								ANSI_CHARSET, 
                   	OUT_DEFAULT_PRECIS, 
                   	CLIP_DEFAULT_PRECIS, 
                   	PROOF_QUALITY, 
                   	VARIABLE_PITCH | 0x04 | FF_DONTCARE, 
                   	(LPSTR)"Arial"); 
		 
 
		CString strSub; 
		int nCount=0; 
		// draw each line, based on specified type 
		while(AfxExtractSubString(strSub, m_strCredits, nCount++, '\n')) 
		{ 
			TCHAR nType = 0; 
			COLORREF oldColor; 
 
			if (!strSub.IsEmpty()) 
				nType = strSub.GetAt(0); 
 
			switch(nType) 
			{ 
				case '\t':	// title 
					oldColor = SetTextColor(hDestinationDC, RGB(16,140,231)); 
					pOldFont = (HFONT)SelectObject(hDestinationDC, hFontTahoma); 
					strSub.TrimLeft('\t'); 
					DrawText(hDestinationDC, strSub, strSub.GetLength(), &rc, DT_TOP|DT_LEFT|DT_NOPREFIX | DT_SINGLELINE); 
					break; 
				case '\r':	// bold 
					oldColor = SetTextColor(hDestinationDC, RGB(0,0,0)); 
					pOldFont = (HFONT)SelectObject(hDestinationDC, hFontBold); 
					strSub.TrimLeft('\r'); 
					DrawText(hDestinationDC, strSub, strSub.GetLength(), &rc, DT_TOP|DT_LEFT|DT_NOPREFIX | DT_SINGLELINE); 
					break; 
				default:	// normal 
					oldColor = SetTextColor(hDestinationDC, RGB(0,0,0)); 
					pOldFont = (HFONT)SelectObject(hDestinationDC, hFontNormal); 
					DrawText(hDestinationDC, strSub, strSub.GetLength(), &rc, DT_TOP|DT_LEFT|DT_NOPREFIX | DT_SINGLELINE); 
					break; 
			} 
			// next line 
			TEXTMETRIC tm;   
			GetTextMetrics(hDestinationDC, &tm); 
			rc.top += tm.tmHeight; 
			 
			// set back old values 
			SetTextColor(hDestinationDC, oldColor); 
			SelectObject(hDestinationDC, pOldFont); 
		} 
		// clean up 
		DeleteObject(hFontBold); 
		DeleteObject(hFontNormal); 
		DeleteObject(hFontTahoma); 
	} 
	DeleteObject(hbmScreen); 
} 
 
 
/********************************************************************/ 
/*																	*/ 
/* Function name : SetCredits										*/ 
/* Description   : Member function to set credits text,bmp			*/ 
/*																	*/ 
/********************************************************************/ 
void CAboutCtrl::SetCredits(LPCTSTR lpszCredits,UINT nLogo,UINT nBkg,UINT nStartCx) 
{ 
	m_strCredits = lpszCredits; 
	m_nBmpLogo=nLogo; 
	m_nBmpBkg=nBkg; 
	m_nMemDCStartCx=nStartCx;	 
} 
 
//***************************************************************																 
//函数:			单击关闭	 
//	1)  
//	2)  
//	 
//说明:	 
//*************************************************************** 
void CAboutCtrl::OnClicked()  
{ 
	// TODO: Add your control notification handler code here 
	CWnd *mWnd=this->GetParent(); 
	mWnd->PostMessage(WM_CLOSE,0,0); 
}