一般遵循以下步骤;
(1)定义DC并创建DC
(2)定义并创建GDI对象
(3)调用dc对象的selectobject将GDI对象选入DC中
(4)调用DC对象中的各个函数进行绘图
(5)恢复系统原有的GDI对象----该对象是由selectobject返回值。
(6)释放GDI对象占用的系统资源-》通过GDI对象的DeleteObject函数释放
例如在OnPaint消息响应函数中:
void CMyDrawDlg::OnPaint()
{
CPaintDC dc(this); (1)定义DC并创建DC
// TODO: Add your message handler code here
CPen newPen(PS_SOLID,1,RGB(255,0,0));(2)定义并创建GDI对象
CPen *oldPen=dc.SelectObject(&newPen);(3)调用dc对象的selectobject将GDI对象选入DC中
//(4)调用DC对象中的各个函数进行绘图
dc.LineTo(20,20); //画线
dc.Ellipse(200,23,450,234);// 画椭圆
dc.SelectObject(oldPen);(5)恢复系统原有的GDI对象----该对象是由selectobject返回值。
newPen.DeleteObject();(6)释放GDI对象占用的系统资源-》通过GDI对象的DeleteObject函数释放
}
怎样画位图:还是六个步骤
void CMyDrawDlg::OnPaint()
{CPaintDC dc(this); //
CDC memDC;
memDC.CreateCompatibleDC(&dc);//创建内存兼容的DC
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CBitmap *pOld=memDC.SelectObject(&bitmap);
//(4)调用DC对象中的各个函数进行绘图
dc.BitBlt(0,0,200,200,&memDC,0,0,SRCCOPY);//方式一
dc.StretchBlt(210,210,200,200,&memDC,0,0,200,200,SRCCOPY);//方式二
dc.SelectObject(pOld);
bitmap.DeleteObject();
}
void CMyDrawDlg::OnPaint()//下面这个是演示将位图画到指定的Picture控件中去
{
CPaintDC dc(this); // device context for painting
CStatic *pStaic = (CStatic*)GetDlgItem(IDC_PHOTO);//获取资源ID=IDC_PHOTO控件指针,蓝颜色代码,就是关键
CBitmap bmp;
bmp.Attach(m_hPhotoBitmap);
BITMAP bm;
bmp.GetBitmap(&bm);
CDC dcMem;
dcMem.CreateCompatibleDC(GetDC());
CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(bmp);
CRect lRect;
pStaic->GetClientRect(&lRect);
lRect.NormalizeRect();
pStaic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(),
&dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
dcMem.SelectObject(&poldBitmap);
}
补充知识:
http://blog.csdn.net/zhangyulin54321/article/details/8098484