四、设备上下文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);
}
一、绘制直线
原理:在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);
}
相关文章推荐
- linux网络设备应用与驱动编程学习4——模板与实例(C)——其它方法
- Linux设备驱动编程---miscdevice杂类设备的使用方法
- MFC中的DC、CDC、HDC、句柄、设备上下文的不同意思,适合初学者参考
- 设备上下文(DC)与内存设备上下文中的位图与画刷属性的一些零碎
- VB中的GDI编程-1 设备环境DC
- 对Windows程序中设备上下文DC(device context)的理解
- OpenCL异构并行计算编程笔记(1):平台、设备与上下文
- Linux设备驱动编程---miscdevice杂类设备的使用方法
- Android编程获取设备MAC地址的实现方法
- SSDP协议编程 upnp设备查找方法
- MFC的运行机制 以及 MFC中的DC、CDC、HDC、句柄、设备上下文(整理) .
- 设备上下文(DC)
- 详解DC、CDC、HDC、句柄、设备上下文
- 浅析设备上下文(DC)
- Linux设备驱动编程---miscdevice杂类设备的使用方法
- DC---DeviceContext 中文翻译为设备上下文或者设备描述表
- SSDP协议编程 upnp设备查找方法
- 设备上下文DC(又称设备描述表)
- linux网络设备应用与驱动编程学习4——模板与实例(B)——打开和释放方法
- 对Windows程序中设备上下文DC(device context)的理解