VC中利用MFC设计绘图程序初步

首先我们说下通过鼠标的移动来绘制直线。

  这里要捕获到鼠标的两个消息:WM_LBUTTONDOWN, WM_LBUTTONUP。响应WM_LBUTTONDOWN消息记录直线的起始点,响应WM_LBUTTONUP消息记录直线的终点并绘制直线。

  好了,我们看看怎么响应。

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
 //MessageBox("Left Button Clicks DrawView");
 m_ptOrigin = point ; //这里先定义了一个内部变量保存直线的起始点
 CView::OnLButtonDown(nFlags, point);
}

  下面看看响应WM_LBUTTONUP消息记录直线的终点并绘制直线。

//方法一
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
 HDC hdc;
 hdc = ::GetDC(m_hWnd); //调用全局函数
 MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,0);
 LineTo(hdc,point.x,point.y);
 ::ReleaseDC(m_hWnd,hdc);
 CView::OnLButtonUp(nFlags, point);
}
//方法二
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
 CDC *pDC = GetDC();
 pDC->MoveTo(m_ptOrigin);
 pDC->LineTo(point);
 ReleaseDC(pDC);
}
//方法三
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
 CClientDC dc(this) ; //CClientDC对象构造的时候就调用了GetDC,析构的时候调用

 ReleaseDC ,只能访问客户区
 CClientDC dc(GetParent());
 dc.MoveTo(m_ptOrigin);
 dc.LineTo(point);
}
//方法四
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
 CWindowDC dc(this) ; //CWindowDC可以访问客户区和非客户区
 dc.MoveTo(m_ptOrigin);
 dc.LineTo(point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
 CWindowDC dc(GetDesktopWindow()) ; //现在可以访问桌面
 dc.MoveTo(m_ptOrigin);
 dc.LineTo(point);
}

首先我们说下通过鼠标的移动来绘制直线。

  这里要捕获到鼠标的两个消息:WM_LBUTTONDOWN, WM_LBUTTONUP。响应WM_LBUTTONDOWN消息记录直线的起始点,响应WM_LBUTTONUP消息记录直线的终点并绘制直线。

  好了,我们看看怎么响应。

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
 //MessageBox("Left Button Clicks DrawView");
 m_ptOrigin = point ; //这里先定义了一个内部变量保存直线的起始点
 CView::OnLButtonDown(nFlags, point);
}

  下面看看响应WM_LBUTTONUP消息记录直线的终点并绘制直线。

//方法一
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
 HDC hdc;
 hdc = ::GetDC(m_hWnd); //调用全局函数
 MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,0);
 LineTo(hdc,point.x,point.y);
 ::ReleaseDC(m_hWnd,hdc);
 CView::OnLButtonUp(nFlags, point);
}
//方法二
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
 CDC *pDC = GetDC();
 pDC->MoveTo(m_ptOrigin);
 pDC->LineTo(point);
 ReleaseDC(pDC);
}
//方法三
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
 CClientDC dc(this) ; //CClientDC对象构造的时候就调用了GetDC,析构的时候调用

 ReleaseDC ,只能访问客户区
 CClientDC dc(GetParent());
 dc.MoveTo(m_ptOrigin);
 dc.LineTo(point);
}
//方法四
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
 CWindowDC dc(this) ; //CWindowDC可以访问客户区和非客户区
 dc.MoveTo(m_ptOrigin);
 dc.LineTo(point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
 CWindowDC dc(GetDesktopWindow()) ; //现在可以访问桌面
 dc.MoveTo(m_ptOrigin);
 dc.LineTo(point);
}

//画带边线的扇型
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
 if ( m_bDraw )
 {
  CClientDC dc(this) ;
  CPen pen( PS_SOLID , 1 , RGB(255,128,128) );
  CPen *pOldPen = dc.SelectObject(&pen);
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(m_ptOld);
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(point);
  dc.MoveTo(m_ptOld);
  dc.LineTo(point);
  m_ptOld = point ;
  dc.SelectObject(pOldPen);
 }
 CView::OnMouseMove(nFlags, point);
}

//看看绘图的模式设置方法
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
 if ( m_bDraw )
 {
  CClientDC dc(this) ;
  dc.SetROP2(R2_BLACK); //绘图的模式设置,始终绘制黑色图形
  CPen pen( PS_SOLID , 1 , RGB(255,128,128) );
  CPen *pOldPen = dc.SelectObject(&pen);
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(m_ptOld);
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(point);
  dc.MoveTo(m_ptOld);
  dc.LineTo(point);
  m_ptOld = point ;
  dc.SelectObject(pOldPen);
 }
 CView::OnMouseMove(nFlags, point);
}

  到此,我们知道了一般地绘图方法了。

---------------------------------------------------------------------------------------------------------------------

一、Invalidate介绍

  void Invalidate( BOOL bErase = TRUE );
  该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的 消息队列 中放置WM_PAINT消息。 MFC 窗口类 提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了 OnDraw 函数,实际的重绘工作由OnDraw来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。

二、与UpdateWindow( )的区别

  UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等 消息队列 中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值