www.pudn.com > p_eating.rar > GradientStatic.cpp


// GradientStatic.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "GradientStatic.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CGradientStatic 
CPoint ta5[5];      //定义五个变量表示哲学家所在位置 
CPoint tropic5[5];  //筷子闲置时的位置 
CPoint usetropic[5];//筷子使用时的位置,每个哲学家用两个筷子 
 
int    radius; 
CPoint CenterPoint; 
 
CGradientStatic::CGradientStatic() 
{ 
	m_iLeftSpacing = 10; 
	clLeft = GetSysColor(COLOR_ACTIVECAPTION); 
	clRight = GetSysColor(COLOR_BTNFACE); 
	clText = GetSysColor(COLOR_CAPTIONTEXT); 
	 
	m_bCenter = FALSE; 
 
	hinst_msimg32 = LoadLibrary( "msimg32.dll" ); 
	m_bCanDoGradientFill = FALSE; 
	pFont = NULL; 
	 
	if(hinst_msimg32) 
	{ 
		m_bCanDoGradientFill = TRUE;		 
		dllfunc_GradientFill = ((LPFNDLLFUNC1) GetProcAddress( hinst_msimg32, "GradientFill" )); 
	} 
 
	m_RunBrush.CreateSolidBrush(RGB(255,0,0)); 
	m_IdleBrush.CreateSolidBrush(RGB(255,255,255)); 
 
	bmp1.LoadBitmap(IDB_BITMAP31); 
	bmp2.LoadBitmap(IDB_BITMAP21); 
	bmp3.LoadBitmap(IDB_BITMAP11); 
 
	maskbmp1.LoadBitmap(IDB_BITMAPm31); 
	maskbmp2.LoadBitmap(IDB_BITMAPm21); 
	maskbmp3.LoadBitmap(IDB_BITMAPm11); 
 
	zuomianbmp.LoadBitmap(IDB_BITMAPZM);  //桌面的图片 
	m_back.CreatePatternBrush(&zuomianbmp); 
	m_pen.CreatePen(PS_SOLID,4,RGB(255,255,255)); 
 
	 
 
 
} 
 
CGradientStatic::~CGradientStatic() 
{ 
	FreeLibrary( hinst_msimg32 ); 
 
	bmp1.DeleteObject(); 
	bmp2.DeleteObject(); 
	bmp3.DeleteObject(); 
 
	maskbmp1.DeleteObject(); 
	maskbmp2.DeleteObject(); 
	maskbmp3.DeleteObject(); 
 
	m_back.DeleteObject(); 
	m_pen.DeleteObject(); 
 
} 
 
 
BEGIN_MESSAGE_MAP(CGradientStatic, CStatic) 
	//{{AFX_MSG_MAP(CGradientStatic) 
	ON_WM_PAINT() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CGradientStatic message handlers 
 
void CGradientStatic::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting 
 
	CRect rect; 
	GetClientRect(&rect); 
 
	static BOOL IsRgn = FALSE; 
 
	 
 
	if(m_bCanDoGradientFill)//绘制整个渐变的背景 
	{ 
	 
		TRIVERTEX rcVertex[2]; 
		rect.right--; // exclude this point, like FillRect does  
		rect.bottom--; 
		rcVertex[0].x=rect.left; 
		rcVertex[0].y=rect.top; 
		rcVertex[0].Red=GetRValue(clLeft)<<8;	// color values from 0x0000 to 0xff00 !!!! 
		rcVertex[0].Green=GetGValue(clLeft)<<8; 
		rcVertex[0].Blue=GetBValue(clLeft)<<8; 
		rcVertex[0].Alpha=0x0000; 
		rcVertex[1].x=rect.right;  
		rcVertex[1].y=rect.bottom; 
		rcVertex[1].Red=GetRValue(clRight)<<8; 
		rcVertex[1].Green=GetGValue(clRight)<<8; 
		rcVertex[1].Blue=GetBValue(clRight)<<8; 
		rcVertex[1].Alpha=0; 
		GRADIENT_RECT rect; 
		rect.UpperLeft=0; 
		rect.LowerRight=1; 
		 
		// fill the area  
		dllfunc_GradientFill( dc,rcVertex,2,&rect,1,GRADIENT_FILL_RECT_H); 
		 
		//if Gradient Fil works - let's use font color defined by user 
		::SetTextColor(dc,clText); 
	} 
	else 
	{ 
		//there is no gradient, so let's use standart color 
		::SetTextColor(dc,GetSysColor(COLOR_BTNTEXT)); 
	} 
	 
	//int i; 
	//CBrush *oldBrush; 
	//dc.Polygon(ta5,5); 
	int i; 
 
	CPen *oldpen; 
	//= (CPen*)dc.SelectObject(&m_pen); 
	 
	int x1,y1,x2,y2; 
	int top,left,right,bottom; 
 
	if(!IsRgn) 
	{ 
 
		for(i = 0;i<5;i++) 
		{ 
			/*dc.BeginPath();			 
			dc.MoveTo(tropic5[i].x,tropic5[i].y);		 
			dc.LineTo((tropic5[i].x - (tropic5[i].x - CenterPoint.x)/4), 
				(tropic5[i].y - (tropic5[i].y - CenterPoint.y)/4));	 
			dc.CloseFigure(); 
			dc.EndPath();		 
			m_pthinker->rgn[i].CreateFromPath(&dc);	 
			CRect rect;*/ 
			 
			x1 = tropic5[i].x; 
			y1 = tropic5[i].y; 
			x2 = tropic5[i].x - (tropic5[i].x - CenterPoint.x)/4; 
		    y2 = tropic5[i].y - (tropic5[i].y - CenterPoint.y)/4; 
 
			 
			left = min(x1,x2); 
			top  = min(y1,y2); 
			right = max(x1,x2); 
			bottom = max(y1,y2); 
		 
			m_pthinker->Idlerect[i].SetRect(left,top,right,bottom);	 
			m_pthinker->Idlerect[i].InflateRect(5,5); 
 
			 
		} 
		for(i = 0;i<5;i++) 
		{ 
			/*dc.BeginPath();			 
			dc.MoveTo(usetropic[i].x,usetropic[i].y);		 
			dc.LineTo((usetropic[i].x - (usetropic[i].x - CenterPoint.x)/4), 
				(usetropic[i].y - (usetropic[i].y - CenterPoint.y)/4));			 
			dc.EndPath();		 
			m_pthinker->usergn[i].CreateFromPath(&dc);*/ 
 
			x1 = usetropic[i].x; 
			y1 = usetropic[i].y; 
			x2 = usetropic[i].x - (usetropic[i].x - CenterPoint.x)/4; 
		    y2 = usetropic[i].y - (usetropic[i].y - CenterPoint.y)/4; 
 
			 
			left = min(x1,x2); 
			top  = min(y1,y2); 
			right = max(x1,x2); 
			bottom = max(y1,y2); 
				 
			m_pthinker->userect[i].SetRect(left,top,right,bottom);	 
			m_pthinker->userect[i].InflateRect(5,5); 
 
			 
		} 
		IsRgn = TRUE; 
	} 
	//dc.SelectObject(oldpen); 
 
	 
	CDC memDC; 
	memDC.CreateCompatibleDC(&dc);	 
 
	CBitmap *oldbitmap; 
	BITMAP bmpInfo; 
 
	oldbitmap = memDC.SelectObject(&maskbmp1); 
	maskbmp1.GetBitmap(&bmpInfo);	 
	dc.BitBlt(ta5[0].x-bmpInfo.bmWidth/2,30,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCAND); 
	memDC.SelectObject(oldbitmap); 
	oldbitmap = memDC.SelectObject(&bmp1); 
	dc.BitBlt(ta5[0].x-bmpInfo.bmWidth/2,30,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCPAINT); 
	memDC.SelectObject(oldbitmap); 
 
	oldbitmap = memDC.SelectObject(&maskbmp1); 
	maskbmp1.GetBitmap(&bmpInfo);	 
	dc.BitBlt(ta5[1].x-bmpInfo.bmWidth/2,ta5[1].y-bmpInfo.bmHeight/2,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCAND); 
	memDC.SelectObject(oldbitmap); 
	oldbitmap = memDC.SelectObject(&bmp1); 
	dc.BitBlt(ta5[1].x-bmpInfo.bmWidth/2,ta5[1].y-bmpInfo.bmHeight/2,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCPAINT); 
	memDC.SelectObject(oldbitmap);	 
	 
 
	oldbitmap = memDC.SelectObject(&maskbmp1); 
	maskbmp1.GetBitmap(&bmpInfo);	 
	dc.BitBlt(ta5[4].x-bmpInfo.bmWidth/2,ta5[4].y-bmpInfo.bmHeight/2,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCAND); 
	memDC.SelectObject(oldbitmap); 
	oldbitmap = memDC.SelectObject(&bmp1); 
	dc.BitBlt(ta5[4].x-bmpInfo.bmWidth/2,ta5[4].y-bmpInfo.bmHeight/2,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCPAINT); 
	memDC.SelectObject(oldbitmap); 
 
 
	CBrush *oldbrush; 
	oldbrush = (CBrush*)dc.SelectObject(&m_back); 
	dc.Ellipse(CenterPoint.x - (radius-10),CenterPoint.y - (radius-10), 
		       CenterPoint.x + (radius-10),CenterPoint.y + (radius-10)); 
	dc.SelectObject(oldbrush); 
 
	oldbitmap = memDC.SelectObject(&maskbmp2); 
	maskbmp2.GetBitmap(&bmpInfo);	 
	dc.BitBlt(ta5[3].x-5-8,ta5[3].y-bmpInfo.bmHeight/2-8,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCAND); 
	memDC.SelectObject(oldbitmap); 
	oldbitmap = memDC.SelectObject(&bmp2); 
	dc.BitBlt(ta5[3].x-5-8,ta5[3].y-bmpInfo.bmHeight/2-8,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCPAINT); 
	memDC.SelectObject(oldbitmap); 
 
	oldbitmap = memDC.SelectObject(&maskbmp3); 
	maskbmp3.GetBitmap(&bmpInfo);	 
	dc.BitBlt(ta5[2].x-bmpInfo.bmWidth+8,ta5[2].y-bmpInfo.bmHeight/2-8,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCAND); 
	memDC.SelectObject(oldbitmap); 
	oldbitmap = memDC.SelectObject(&bmp3); 
	dc.BitBlt(ta5[2].x-bmpInfo.bmWidth+8,ta5[2].y-bmpInfo.bmHeight/2-8,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,0,0,SRCPAINT); 
	memDC.SelectObject(oldbitmap); 
 
	oldpen = (CPen*)dc.SelectObject(&m_pen); 
 
	BOOL ShouldDrawtropic = FALSE; 
 
	for(i = 0;i<5;i++) 
	{ 
		if(m_pthinker->tropicStatus[i] == 0) 
		{ 
			dc.MoveTo(tropic5[i].x,tropic5[i].y);		 
			dc.LineTo((tropic5[i].x - (tropic5[i].x - CenterPoint.x)/4), 
				(tropic5[i].y - (tropic5[i].y - CenterPoint.y)/4)); 
		}	 
		 
	} 
	 
	for( i = 0;i<5;i++) 
	{	 
		if(m_pthinker->thinkerStatus[i] == EATING_STATUS) 
		{ 
			dc.MoveTo(usetropic[i].x,usetropic[i].y); 
			dc.LineTo((usetropic[i].x - (usetropic[i].x - CenterPoint.x)/4), 
			          (usetropic[i].y - (usetropic[i].y - CenterPoint.y)/4));		 
			 
		} 
		 
	} 
 
	//for(i = 0;i<5;i++) 
	//{ 
	//	dc.Rectangle(m_pthinker->thinkerRect[i]); 
	//} 
	dc.SelectObject(oldpen); 
 
 
	 
 
 
 
	HFONT hfontOld; 
	if(pFont) 
		hfontOld = (HFONT)SelectObject(dc.m_hDC, (HFONT)pFont->m_hObject); 
 
	::SetBkMode(dc, TRANSPARENT); 
	GetClientRect(&rect); 
	 
	for(i = 0;ithinkerStatus[i] == THINKING_STATUS) 
				m_sTEXT = "1+1=?"; 
			else if(m_pthinker->thinkerStatus[i] == EATING_STATUS) 
				m_sTEXT = "好香呀!"; 
			else if(m_pthinker->thinkerStatus[i] == HUNGRY_STATUS) 
				m_sTEXT = "我饿喔!"; 
			else m_sTEXT = " "; 
 
			::DrawText(dc, m_sTEXT, -1, &m_pthinker->thinkerRect[i],  
			           DT_SINGLELINE|DT_VCENTER|DT_CENTER); 
	//	} 
 
	} 
 
	/*if(m_bCenter) 
		::DrawText(dc, m_sTEXT, -1, &rect, DT_SINGLELINE|DT_VCENTER|DT_CENTER); 
	else 
	{ 
		rect.left+=m_iLeftSpacing; 
		::DrawText(dc, m_sTEXT, -1, &rect, DT_SINGLELINE|DT_VCENTER|DT_LEFT); 
	}*/ 
 
	if(pFont) 
		::SelectObject(dc.m_hDC, hfontOld); 
} 
 
void CGradientStatic::SetWindowText(LPCSTR lpszString) 
{ 
	m_sTEXT = lpszString; 
	Invalidate(TRUE); 
} 
 
CString CGradientStatic::GetWindowText() 
{ 
	return m_sTEXT; 
 
}