📄 diningguidlg.cpp
字号:
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 + -