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

📄 gradientstatic.cpp

📁 计算机仿真的实验
💻 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;i<THINKER_NUM;i++)
	{
		//if(i == 0)
		//{
			if(m_pthinker->thinkerStatus[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;

}

⌨️ 快捷键说明

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