先上效果图,图中小球是动态下落的,下落到对应桶里会更新相应计数。
《1》建立基于单文档的应用程序,名为:GEDB。
《2》为类CDEDBView添加成员函数void CGEDBView::DrawFrame(CDC *pDC),并添加如下代码:
void CGEDBView::DrawFrame(CDC *pDC)
{
CRect rc;//定义一个矩形区域变量
GetClientRect(rc);//获取当前窗口的客户区大小
CPoint point[12] ;
point[0] = (85 ,5) ;//画图区域的左上角
point[1] = (685 ,403) ;//画图区域的右下角
//设置每个钉子的半径为12
int R = 12 ;
//绘制图形区域的边缘(灰色)
CPen pen(PS_INSIDEFRAME,1,RGB(192,192,192));//定义画笔
CPen* oldPen=pDC->SelectObject(&pen); //将pen选入设备环境
CRect recttempt(85,5,685,403) ;
pDC->Rectangle(recttempt) ;
//绘制显示小球的所在区域
CRect rect1(85 -4*R ,300-23*R ,85-2*R ,300+7*R) ;
pDC->Rectangle(rect1) ;
pDC->SetBkColor(RGB(250,250,0)) ;
CString str[2]= {"顶部","底部"};
pDC->TextOut(85 -4*R,300-25*R,str[0]) ;
pDC->TextOut(85 -4*R,300+8*R,str[1]) ;
//绘制不同桶间的分割线(蓝色)
CPen Lpen0 ;
Lpen0.CreatePen(PS_SOLID ,2 ,RGB(0,0,255)) ;
pDC->SelectObject(Lpen0) ;
for (int i = 1 ;i<12 ;i++)
{
pDC->MoveTo(100 + i*4*R ,400) ;
pDC->LineTo(100 + i*4*R ,300) ;
}
//绘制高尔顿版的边缘(肖贡土色)
CPen Lpen1 ;
Lpen1.CreatePen(PS_DASH ,5 ,RGB(197,97,20)) ;
pDC->SelectObject(Lpen1) ;
pDC->MoveTo(100,400) ;
pDC->LineTo(100 ,300) ;
pDC->MoveTo(676,400) ;
pDC->LineTo(676 ,300) ;
pDC->MoveTo(100,400) ;
pDC->LineTo(676 ,400) ;
pDC->MoveTo(100 ,300) ;
pDC->LineTo(375 ,25) ;
pDC->MoveTo(676 ,300) ;
pDC->LineTo(406 ,25) ;
pDC->MoveTo(375 ,25) ;
pDC->LineTo(375 ,10) ;
pDC->MoveTo(406 ,25) ;
pDC->LineTo(406 ,10) ;
CPen Lpen3(PS_NULL ,1 ,RGB(0,0,0)) ;//创建无边缘的画笔
pDC->SelectObject(Lpen3) ;
CBrush brush(RGB(0,255,0)) ;
CBrush *OldBrush = pDC->SelectObject(&brush) ;
for (i = 0 ;i<12;i++)
{
for (int j = 1 ;j <12-i ;j++)
{
//绘制钉子
pDC->Ellipse(100+j*4*R-R + i*2*R ,300+R - i*2*R,100+j*4*R+R+ i*2*R ,
300-R - i*2*R) ;
//绘制小球下落位置的提示球
pDC->Ellipse(85 - 4*R ,300+R - i*2*R ,85 - 2*R ,300-R - i*2*R) ;
}
}
//因为提示球的行数比钉子多三个,故还需要画3个
for (i =1 ;i<4;i++)
{
CRect rectRange;
rectRange.left = 85 - 4*R ;
rectRange.top = 300 - R ;
rectRange.right = 85 - 2*R ;
rectRange.bottom = 300 +