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

📄 gradientstatic.cpp

📁 根据哲学家就餐算法实现的程序。主要是解决可能出现的死锁问题。
💻 CPP
字号:
// GradientStatic.cpp : implementation file
//

#include "stdafx.h"
#include "Eating.h"
#include "GradientStatic.h"

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


CPoint ta5[5];
CPoint tropic5[5];
CPoint usetropic[5];

int radius;
CPoint CenterPoint;

/////////////////////////////////////////////////////////////////////////////
// CGradientStatic

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,"Gradienfill"));
	}

	m_RunBrush.CreateSolidBrush(RGB(255,0,0));
	m_IdleBrush.CreateSolidBrush(RGB(255,255,255));
	bmp1.LoadBitmap(IDB_BITMAP11);
	bmp2.LoadBitmap(IDB_BITMAP21);
	bmp3.LoadBitmap(IDB_BITMAP31);
	maskbmp1.LoadBitmap(IDB_BITMAPm11);
	maskbmp2.LoadBitmap(IDB_BITMAPm21);
	maskbmp3.LoadBitmap(IDB_BITMAPm31);
	zoumianbmp.LoadBitmap(IDB_BITMAPZM);

	m_back.CreatePatternBrush(&zoumianbmp);
	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();
}

void CGradientStatic::SetWindowText(LPCSTR lpszString)
{
	m_sTEXT=lpszString;
	Invalidate(TRUE);
}

CString CGradientStatic::GetWindowText()
{
	return m_sTEXT;
}
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
	
	// TODO: Add your message handler code here
	
	// Do not call CStatic::OnPaint() for painting messages
	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);
		::SetTextColor(dc,clText);
	}
	else
	{
		::SetTextColor(dc,GetSysColor(COLOR_BTNTEXT));
	}
	int i;
	CPen *oldpen;
	int x1,y1,x2,y2;
	int top,left,right,bottom;
	if(!IsRgn)
	{
		for(i = 0;i<5;i++)
		{			
			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++)
		{
			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->userRect[i].SetRect(left,top,right,bottom);	
			m_pthinker->userRect[i].InflateRect(5,5);
		}
		IsRgn = TRUE;
	}
	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));		
		}
	}
	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(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);
}

⌨️ 快捷键说明

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