void CTestView::DoubleBuffer(CDC *pDC)
{
CRect rect;//获取客户区
GetClientRect(&rect);
CDC memDC;//缓冲区设备上下文要与显示设备上下文兼容
memDC.CreateCompatibleDC(pDC);
CBitmap newBitmap, * pOldBitmap;//准备好缓冲区
//创建和显示设备上下文客户区一致的位图,用于绘图
newBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
pOldBitmap = memDC.SelectObject(&newBitmap);//将位图选入缓冲区
memDC.FillSolidRect(rect, pDC->GetBkColor());//填充缓冲区背景
DrawTriangle(&memDC);//画三角形,缓冲区绘制完后将图像拷贝回显示设备上下文
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBitmap);//恢复缓冲区设备上下文
newBitmap.DeleteObject();//释放用毕资源
memDC.DeleteDC();
}
void CTestView::DrawTriangle(CDC *pDC)
{
pDC->SelectStockObject(GRAY_BRUSH);//选灰色画刷
for (int i = 0; i < 3; ++i)
{
//3个顶点依次处理
CString str;
str.Format(CString("x=%d,y=%d"), p[i].x, p[i].y);
pDC->SetTextColor(RGB(255, 0, 0));
pDC->TextOut(p[i].x, p[i].y, str);//输出顶点实时坐标
//绘制顶点的引力域
pDC->Rectangle(p[i].x - 5, p[i].y - 5, p[i].x + 5, p[i].y + 5);
//连线,画三角形
if (i == 0)pDC->MoveTo(p[i]);
else pDC->LineTo(p[i]);
}
pDC->LineTo(p[0]);//连最后一条边
}
void CTestView::OnDrawIcon(CDC *pDC)
{
CClientDC dc(this);
CDC m_compatibleDc ;
if (m_compatibleDc.CreateCompatibleDC(&dc)) //判断是否创建了兼容DC
{
CRect rect;
GetClientRect(&rect); //获得客户区矩形的区域
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc,350,200); //获得创建兼容位图
m_compatibleDc.SelectObject(&bitmap);//选择位图
//将原始设备描述表的颜色表及像素数据块拷贝到兼容设备描述表
m_compatibleDc.StretchBlt(0, 0, 350,200,&dc,0,0,rect.Width(),rect.Height(),SRCCOPY);
//将兼容DC的显示描述表数据拷贝到目的DC,即屏幕,这行必须要
pDC->BitBlt(1000,100,rect.Width(),rect.Height(),&m_compatibleDc,0,0,SRCCOPY);
}
}