15,979
社区成员
发帖
与我相关
我的任务
分享
void CsingleView::OnDraw(CDC* pDC)
{
CsingleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
//取得客户区域,并转化为相对坐标
CRect WndRect;
this->GetWindowRect(&WndRect);
this->ScreenToClient(&WndRect);
CDC mdc; //内存DC
CBitmap bmp; //临时位图,为内存DC提供绘图环境
CPen FramePen; //画矩形框使用画笔
CPen PtPen; //画点时使用的画笔
CBrush BkBrush; //背景画刷,灰色
CBrush PtBrush; //画点时用的画刷,红色
//初始化GDI对象
mdc.CreateCompatibleDC(pDC);
bmp.CreateCompatibleBitmap(pDC,WndRect.Width(),WndRect.Height());
mdc.SelectObject (&bmp);
FramePen.CreatePen(PS_SOLID,3,RGB(0,0,0));
mdc.SelectObject(&FramePen);
BkBrush.CreateSolidBrush(RGB(128,128,128));
//绘制矩形区域
int width = MAX_X_NUM * GRID_SIZE, height = MAX_Y_NUM * GRID_SIZE;
mdc.Rectangle(START_POS_X,START_POS_Y,width+START_POS_X,height+START_POS_Y);
PtBrush.CreateSolidBrush(PS_SOLOD,1,RGB(0,0,0));
mdc.SelectObject(&PtPen);
PtBrush.CreateSolidBrush(RGB(255,0,0));
mdc.SelectObject(&PtBrush);
//枚举CSingleDoc类中的点集数据
int i, j;
for (i = 0; i<MAX_X_NUM; i++)
{
for (j = 0; j< MAX_Y_NUM;j++)
{
//检测指定点的状态,如果为TRUE则在指定位置绘制红点
if (pDoc->GetGridStatus(i,j))
{
int x = START_POS_X + GRID_SIZE * i;
int y = START_POS_Y + GRID_SIZE * j;
mdc.Ellipse(x, y, x + GRID_SIZE, y + GRID_SIZE);
}
}
}
pDC->BitBlt( 0, 0, WndRect.Width(),WndRect.Height(), &mdc, 0, 0, SRCCOPY);
//删除临时GDI对象
bmp.DeleteObject();
FramePen.DeleteObject();
PtPen.DeleteObject();
BkBrush.DeleteObject();
PtBrush.DeleteObject();
mdc.DeleteDC();
}