MFC之简单绘图

在VC++中如何通过消息映射机制,用Win32 SDK,CDC类,CClientDC类,CWindowDC类实现绘图操作

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) 

{
// TODO: Add your message handler code here and/or call default
//MessageBox("MainFrame Clicked!");
m_bDraw = TRUE;
m_ptOrigin = point;
m_ptOld = point;
CView::OnLButtonDown(nFlags, point);
}


void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) 
{
//1.利用SDK全局函数实现画线功能
/*HDC hdc;//首先获得窗口的设备描述表
hdc = ::GetDC(m_hWnd);
//移动到线条起点
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
//画线
LineTo(hdc,point.x,point.y);
//释放设备描述表
::ReleaseDC(m_hWnd,hdc);*/     


//2.利用MFC的CDC类实现画线功能
/*CDC* pDC = GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);*/


//3.利用MFC的CClientDC类实现画线功能
/*CClientDC dc(this);    //用this只能在客户区画线
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/


//4.利用MFC的CWindowDC类实现画线功能
/*CWindowDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/


//5.在桌面窗口中画线
/*CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/


    //6.绘制彩色线条
/*CPen pen(PS_DOT,1,RGB(255,0,0));
CClientDC dc(this);
CPen* pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);*/


//7.使用画刷绘图(简单画刷)
/*CBrush brush(RGB(255,0,0));   //创建一个红色画刷
CClientDC dc(this);           //创建并获得设备描述表
dc.FillRect(CRect(m_ptOrigin,point),&brush);*/   //利用红色画刷填充鼠标拖拽过程中形成的矩形区域


//8.位图画刷
/*CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
    CBrush brush(&bitmap);
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);*/


//9.透明画刷
/*CClientDC dc(this);  //创建并获得设备描述表
//dc.Rectangle(CRect(m_ptOrigin,point));  //设备描述表中有一个默认的白色画刷
CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));  //创建一个空画刷,把画刷句柄转换为画刷对象
CBrush *pOldBrush = dc.SelectObject(pBrush);   //将空画刷选入设备描述表
dc.Rectangle(CRect(m_ptOrigin,point));   //绘制一个矩形
dc.SelectObject(pOldBrush);    //恢复先前的画刷?*/
//CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));这种调用方式之所以可行是因为GetStockObject()是一个静态函数。





    m_bDraw = FALSE;
CView::OnLButtonUp(nFlags, point);
}


//10.绘制连续线条
void CDrawView::OnMouseMove(UINT nFlags, CPoint point) 
{
CClientDC dc(this);
// dc.SetROP2(/*R2_MERGENOTPEN*/ R2_BLACK);   //设置绘图模式的函数
CPen pen(PS_SOLID,1,RGB(255,0,0));  //创建一个红色的,宽度为1的实线画笔
CPen *pOldPen = dc.SelectObject(&pen);  //把创建的画笔选入设备描述表
if(TRUE==m_bDraw)
{
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.LineTo(m_ptOld);//用来绘制带边线的扇形
//m_ptOrigin = point;// 修改线段的起点,没有这行代码时就可以绘制扇形了
m_ptOld = point;//用来绘制带边线的扇形
}
dc.SelectObject(pOldPen);  //恢复设备描述表
//懂了:当我们使用默认的画笔,画刷时,不需要用dc.SelectObject(&pen)把创建的画刷画笔选入设备描述表
//而只有在我们不使用默认的,而是自己创建了一个的时候才要调用dc.SelectObject(&pen)把创建的画刷画笔选入设备描述表,
//而在用过以后,要把原来的画刷画笔选回原来的,恢复设备描述表。
CView::OnMouseMove(nFlags, point);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值