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

📄 diningguidlg.cpp

📁 哲学家进餐问题
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		dcMem.CreateCompatibleDC(&dc);
		map.LoadBitmap(arr[i]);
		dcMem.SelectObject(&map);
		map.GetBitmap(&infoSpoon[i]);

		dc.BitBlt(x,y,infoSpoon[i].bmWidth,infoSpoon[i].bmHeight,&dcMem,0,0,
				SRCCOPY);

		/*
		dcMem.BitBlt(0,0,infoSpoon.bmWidth,infoSpoon.bmHeight,&dcSpoon,0,0,
				SRCINVERT);
		dcMem.BitBlt(0,0,infoSpoon.bmWidth,infoSpoon.bmHeight,&dcSpoonMask,0,0,
				SRCAND);
		dcMem.BitBlt(0,0,infoSpoon.bmWidth,infoSpoon.bmHeight,&dcSpoon,0,0,
				SRCINVERT);
		dc.BitBlt(x,y,infoSpoon.bmWidth,infoSpoon.bmHeight,&dcMem,0,0,
				SRCCOPY);
		*/
	}
	/*
	for(i=1;i<=5;i++)
	{
		int x = CDiningGUIDlg::rcSpoons[i].left;
		int y = CDiningGUIDlg::rcSpoons[i].top;
		CRect rc(x,y,x+infoSpoon[i].bmWidth,y+infoSpoon[i].bmHeight);
		dc.Draw3dRect(rc,0,0);
		//dc.Rectangle(rc);
	}
	*/
	/*
	CBrush br(RGB(rand()%255,rand()%255,rand()%255));
	dc.SelectObject(br);
	CRgn rgn;
	rgn.CreateEllipticRgn(rcDinningTable.left,rcDinningTable.top,rcDinningTable.right,rcDinningTable.bottom);
	dc.SelectClipRgn(&rgn);
	
	BITMAP infoTable;
	mapMem.DeleteObject();
	dcMem.DeleteDC();

	dcMem.CreateCompatibleDC(&dc);
	mapMem.LoadBitmap(IDB_BITMAP_NOODLES);
	dcMem.SelectObject(mapMem);
	mapMem.GetBitmap(&infoTable);
	dc.BitBlt(rcDinningTable.left+rand()%10,rcDinningTable.top+rand()%10,
			  infoTable.bmWidth,infoTable.bmHeight,&dcMem,0,0,SRCCOPY);	
	*/
	
	/*
	//dc.Ellipse(rcDinningTable);
	CRect rc;
	wnd->GetClientRect(rc);
	dc.FillSolidRect(rc,RGB(rand()%255,rand()%255,rand()%255));
	for(int j=0;j<=50;j++)
	{
		
		int x= rand()%rcDinningTable.Width()+rcDinningTable.Width()/2;
		int y=rand()%rcDinningTable.Height()+rcDinningTable.Height()/2;
		if(x<rcDinningTable.left)
			x = rcDinningTable.left;
		if(y<rcDinningTable.top)
			y = rcDinningTable.top;
		CRect rcTmp(x,y,x+rand()%50,y+rand()%50);
		//dc.Arc(rcTmp,CPoint(0,0),CPoint(rand()%360,rand()%360));
		dc.Arc(rcTmp,CPoint(0,0),CPoint(0,0));
		
		x = (rcDinningTable.left+rcDinningTable.right)/2;
		y = (rcDinningTable.top+rcDinningTable.bottom)/2;
		dc.MoveTo(x,y);
		CPen pen(PS_SOLID,rand()%2,RGB(rand()%255,rand()%255,rand()%255));
		dc.SelectObject(&pen);
		dc.LineTo(rand()%rc.Width(),rand()%rc.Height());
	}
	*/
}
void DrawEatingPhilosophor(int nNumber,int nTime)
{
	CWnd *wnd = AfxGetMainWnd();
	CClientDC dc(wnd);
	int nMod = 1;
	int tTime=0;
	//CWnd *wndSpoon = wnd->GetDlgItem(spoonUsage[nNumber].nSpoonLeftID);
	//wndSpoon->ShowWindow(SW_HIDE);
	//wndSpoon = wnd->GetDlgItem(spoonUsage[nNumber].nSpoonRightID);
	//wndSpoon->ShowWindow(SW_HIDE);
	int arr[6] ={0,IDB_BITMAP_PHILL1,IDB_BITMAP_PHILL2,
				   IDB_BITMAP_PHILL3,IDB_BITMAP_PHILL4,
				   IDB_BITMAP_PHILL5};
	int arrEat[6] = {0,IDB_BITMAP_PHILL1_EAT,IDB_BITMAP_PHILL2_EAT,
					   IDB_BITMAP_PHILL3_EAT,IDB_BITMAP_PHILL4_EAT,
					   IDB_BITMAP_PHILL5_EAT};
	while(1)
	{
		CBitmap map;
		CDC dcMem;
		dcMem.CreateCompatibleDC(&dc);
		if(nMod%2)
			//map.LoadBitmap(IDB_BITMAP1);
			map.LoadBitmap(arr[nNumber]);
			//map.LoadBitmap(IDC_PHILOSOPHOR1);
			
		else
			//map.LoadBitmap(IDB_BITMAP2);
			map.LoadBitmap(arrEat[nNumber]);

		
		dcMem.SelectObject(&map);
		
		BITMAP info;
		map.GetBitmap(&info);
		
		int x=CDiningGUIDlg::rcPhil[nNumber].left;
		int y=CDiningGUIDlg::rcPhil[nNumber].top;
		
		
//		mem.FillSolidRect(0,0,info.bmWidth,info.bmHeight,RGB(0,255,0));
//		mem.BitBlt(0,0,info.bmWidth,info.bmHeight,&dcMem,0,0,SRCINVERT);
//		mem.BitBlt(0,0,info.bmWidth,info.bmHeight,&dcMemCand,0,0,SRCAND);
//		mem.BitBlt(0,0,info.bmWidth,info.bmHeight,&dcMem,0,0,SRCINVERT);
//		dc.BitBlt(x,y,info.bmWidth,info.bmHeight,&mem,0,0,SRCCOPY);
		dc.BitBlt(x,y,info.bmWidth,info.bmHeight,&dcMem,0,0,SRCCOPY);
		
		CFont *fnt =  wnd->GetFont();
		dc.SelectObject(fnt);
		
		/*
		dc.FillSolidRect(spoonUsage[nNumber].rcLeft.left,
						 spoonUsage[nNumber].rcLeft.top,
						 infoSpoon[nNumber].bmWidth,
						 infoSpoon[nNumber].bmHeight,
						 RGB(0,255,0));	
		dc.FillSolidRect(spoonUsage[nNumber].rcRight.left,
						 spoonUsage[nNumber].rcRight.top,
						 infoSpoon[nNumber].bmWidth,
						 infoSpoon[nNumber].bmHeight,
						 RGB(0,255,0));
		*/
		if(!nTime) return;
		CBitmap mapWood;
		CDC dcWood;
		BITMAP infoWood;

		mapWood.LoadBitmap(IDB_BITMAP_WOOD);
		mapWood.GetBitmap(&infoWood);
		dcWood.CreateCompatibleDC(&dc);
		dcWood.SelectObject(&mapWood);

		CRect rcTmp = CRect(spoonUsage[nNumber].rcLeft.left,
						    spoonUsage[nNumber].rcLeft.top,
						    spoonUsage[nNumber].rcLeft.left+
						    spoonUsage[nNumber].infoSponLeft.bmWidth,
						    spoonUsage[nNumber].rcLeft.top+
						    spoonUsage[nNumber].infoSponLeft.bmHeight);
		
		dc.SetStretchBltMode(COLORONCOLOR);
		//dc.Rectangle(rcTmp);
		//dc.FillSolidRect(rcTmp,RGB(0,255,0));
		dc.StretchBlt(rcTmp.left,rcTmp.top,rcTmp.Width(),rcTmp.Height(),
					  &dcWood,0,0,infoWood.bmWidth,infoWood.bmHeight,SRCCOPY);
		
		rcTmp = CRect(spoonUsage[nNumber].rcRight.left,
					  spoonUsage[nNumber].rcRight.top,
					  spoonUsage[nNumber].rcRight.left+
					  spoonUsage[nNumber].infoSponRight.bmWidth,
					  spoonUsage[nNumber].rcRight.top+
					  spoonUsage[nNumber].infoSponRight.bmHeight);
		dc.StretchBlt(rcTmp.left,rcTmp.top,rcTmp.Width(),rcTmp.Height(),
					  &dcWood,0,0,infoWood.bmWidth,infoWood.bmHeight,SRCCOPY);
		//dc.Rectangle(rcTmp);
		//dc.FillSolidRect(rcTmp,RGB(0,255,0));
		//*/

		y-=20;
		char sBuf[123] = {0x00};
		sprintf(sBuf,"Philosophor %d",nNumber);
		dc.SetBkMode(TRANSPARENT);
		dc.SetTextColor(RGB(0,rand()%255,rand()%255));
		//dc.TextOut(x,y,sBuf);
		dc.TextOut(x,y,szNames[nNumber]);
		nMod++;
		if(nMod>1000)
			nMod=1;
		Sleep(400);
		tTime+=100;
		if(tTime>nTime)
			break;
	}
	DrawAllSpoons();
	//wndSpoon = wnd->GetDlgItem(spoonUsage[nNumber].nSpoonLeftID);
	//wndSpoon->ShowWindow(SW_SHOW);
	//wndSpoon->Invalidate();
	//wndSpoon = wnd->GetDlgItem(spoonUsage[nNumber].nSpoonRightID);
	//wndSpoon->ShowWindow(SW_SHOW);
	//wndSpoon->Invalidate();
}

void CDiningGUIDlg::OnPaint() 
{
	CPaintDC dc(this); 
	CRect rc;
	GetClientRect(rc);
	dc.FillSolidRect(rc,RGB(0,255,0));	

	
	
	DrawEatingPhilosophor(1,0);
	DrawEatingPhilosophor(2,0);
	DrawEatingPhilosophor(3,0);
	DrawEatingPhilosophor(4,0);
	DrawEatingPhilosophor(5,0);
	DrawAllSpoons();

	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CDiningGUIDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CDiningGUIDlg::OnOK() 
{
	//AfxBeginThread(Thread,NULL);
	//CDialog::OnOK();
	TooCleverByHalf();
}
int TooCleverByHalf()
{
	InitializeCriticalSection(&cs);	
	for(int i=1;i<=5;i++)
	{
		hndEvents[i] = CreateEvent(NULL,0,0,NULL);
	}

	AfxBeginThread(Philosophor1,NULL);
	//Sleep(0);
	AfxBeginThread(Philosophor2,NULL);
	//Sleep(0);
	AfxBeginThread(Philosophor3,NULL);
	//Sleep(0);
	AfxBeginThread(Philosophor4,NULL);
	//Sleep(0);
	AfxBeginThread(Philosophor5,NULL);

	//AfxMessageBox("wait until Dark");
	return 0;
}

⌨️ 快捷键说明

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