16,472
社区成员
发帖
与我相关
我的任务
分享
void CDoubleDrawView::OnDraw(CDC* pDC)
{
CDoubleDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetClientRect(&rect);
CDC dc;
CBitmap bmp;
dc.CreateCompatibleDC(pDC);
bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
CBitmap * pOldBmp = dc.SelectObject(&bmp);
srand((unsigned int) time(NULL));
dc.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));
dc.LineTo(rand(),rand());
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);
pDC->SelectObject(pOldBmp);
// TODO: add draw code for native data here
}
void CGDITestDlg::myDraw()
{
CWnd *pWnd = GetDlgItem(IDC_FRAME);
CDC *pDC = GetDC();
CRect rect;
pWnd->GetClientRect(&rect);
CDC dc;//创建用于作图的内存DC
CBitmap bmp;//内存中承载临时图像的位图
CBitmap *pOldBmp = NULL;
dc.CreateCompatibleDC(pDC);//创建兼容内存DC
bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容的位图
pOldBmp = dc.SelectObject(&bmp);
Graphics myGraphics(dc.m_hDC);
Pen * myPen ;
myPen = new Pen(Color(255, 255, 0, 0), 5);
myPen->SetDashStyle(DashStyleDash);
int x(20),y(0);
// myGraphics.TranslateTransform(0,0);
switch(flag)
{
case 1:
myGraphics.DrawLine(myPen,0,10,500,10);
break;
case 2:
myGraphics.DrawLine(myPen,5,10,500,10);
myGraphics.DrawLine(myPen,2,10,0,10);//补充留白
break;
case 3:
myGraphics.DrawLine(myPen,10,10,500,10);
myGraphics.DrawLine(myPen,6,10,0,10);
break;
case 4:
myGraphics.DrawLine(myPen,14,10,500,10);
myGraphics.DrawLine(myPen,10,10,0,10);
break;
default:
break;
}
delete(myPen);
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);//缓冲区的图像拷到前台
dc.SelectObject(pOldBmp);
dc.DeleteDC();
bmp.DeleteObject();
pWnd->ReleaseDC(pDC)
其实DC也是用句柄来标识的,所以也具有句柄的不确定性,就是只能随用随取,不同时间两次取得的是不同的(使用过文件句柄地话,应该很容易理解的)。那么我们用全局变量保存的DC就没什么意义了,下次使用只是什么也画不出来。(这一点的理解可以这样: DC需要占用一定的内存,那么在频繁的页面调度中,位置难免改变,于是用来标志指针的句柄也就不同了)。