您的位置:首页 > 编程语言

四、设备上下文DC的编程方法

2008-09-19 13:45 381 查看
本节通过编写画图程序,理解dc相关知识。

一、绘制直线

原理:在view类中创建一个成员变量CPoint m_ptOrigin,并在构造函数中初始化为0 。

在OnLButtonDown中记录鼠标按下的点,保存到m_ptOrigin。

在鼠标弹起时,即OnLButtonUp函数中进行图形的绘制。

1、

HDC hdc;//创建hdc
hdc=::GetDC(m_hWnd);//获取view的dc
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);//将鼠标移动到原点
LineTo(hdc,point.x,point.y);//绘制直线
::ReleaseDC(m_hWnd,hdc);//释放dc

2、CDC类封装了所有绘图方法

CDC *pDC=GetDC();//创建CDC对象指针
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);//利用cdc对象的方法绘制直线
ReleaseDC(pDC);//释放对象空间

3、CClientDC 是cdc的派生类,不需要释放dc,this是view类指针

CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

4、GetParent()是获取view的父窗口指针,也就是frame指针

CClientDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

5、CWindowDC与CClientDC 类似,但是它可以绘制到客户区和非客户区,GetDesktopWindow()是获取桌面指针

CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

6、画笔pen可以改变线形、颜色

CPen pen(PS_DOT,1,RGB(0,255,0));//创建画笔
CClientDC dc(this);//创建dc
CPen *pOldPen=dc.SelectObject(&pen);//SelectObject将画笔pen选入dc,同时返回旧的画笔
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);//绘制
dc.SelectObject(pOldPen);//将旧的画笔选回,恢复dc

7、用位图话刷填充矩形区域

CBitmap bitmap;//定义位图对象
bitmap.LoadBitmap(IDB_BITMAP1);//加载位图insert--resource---new(bitmap)
CBrush brush(&bitmap);//将位图选入画刷

CClientDC dc(this);//创建dc
dc.FillRect(CRect(m_ptOrigin,point),&brush);//填充

8、注意CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));的用法

CClientDC dc(this);//dc

//GetStockObject(NULL_BRUSH)获取透明画刷句柄,FromHandle将句柄转换成c++对象指针
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *pOldBrush=dc.SelectObject(pBrush);//将画刷选入dc,同时返回旧的画刷
dc.Rectangle(CRect(m_ptOrigin,point));//填充
dc.SelectObject(pOldBrush);//选回旧的画刷

二、绘制扇形

原理,设置bool变量m_bDraw,在构造函数中初始化为false。当鼠标按下时为true,鼠标弹起时为false。

添加mousemove消息响应函数以及变量CPoint m_ptOld。

void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0));
CPen *pOldPen=dc.SelectObject(&pen);
if(m_bDraw==TRUE)
{
dc.SetROP2(R2_BLACK);//绘图模式
dc.MoveTo(m_ptOrigin);
//dc.LineTo(point);
dc.LineTo(m_ptOld);
//dc.MoveTo(m_ptOrigin);
dc.MoveTo(m_ptOld);
dc.LineTo(point);
//m_ptOrigin=point;
m_ptOld=point;
}
dc.SelectObject(pOldPen);
CView::OnMouseMove(nFlags, point);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: