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

本节通过编写画图程序,理解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);
}


 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值