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

2016-02-19 20:13 95 1 收藏

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。

【 tulaoshi.com - 编程语言 】

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  这里要捕获到鼠标的两个消息: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);
}

  连续线绘图:

  思路:鼠标移动的信号被捕捉到,然后随时响应该信号,绘制图线。

  这里要设置一个BOOL变量 m_bDraw 来判断是否鼠标左键按下了。

//画连续的线条
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
 if ( m_bDraw )
 {
  CClientDC dc(this) ;
  dc.MoveTo(m_ptOrigin); //移动到原来的点
  dc.LineTo(point); //绘制直线
  m_ptOrigin = point ; //将现在的点赋值给原来的坐标,以便下次调用
 }
 CView::OnMouseMove(nFlags, 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(point);
  m_ptOrigin = point ;
  dc.SelectObject(pOldPen);
 }
 CView::OnMouseMove(nFlags, 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);
  m_ptOld = point ;
  dc.SelectObject(pOldPen);
 }
 CView::OnMouseMove(nFlags, 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);
}

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

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

来源:https://www.tulaoshi.com/n/20160219/1623032.html

延伸阅读
摘要: 本文主要介绍了一种在MFC应用程序中实现起来比较方便的浏览PDF、Word格式文档文件的方法,同时给出了具体的编程步骤和较详细的实现代码。 概述 随着网络技术的迅速发展,越来越多的电子图书资料能够更加方便的从网上被检索、下载。其文件格式也不仅限于HTML格式的Web页,PDF、Word等多种格式也逐渐成为网络资料交换的主...
使用 MFC 编写打印程序 作者:戎亚新 南京航空航天大学仿真与控制实验室 下载源代码 摘要 本文首先介绍了利用MFC提供的文档视图框架来实现一个打印程序,实现打印预览,在此基础上,同时通过对MFC源代码的深入探讨,提出了利用该方法在对话框上用MFC实现打印功能,结果表明,利用MFC实现打...
内容提要:本文以简单的例子介绍在Visual C++编程中数据读写的基本方法和可序列化类的实现,并简单介绍了Visual C++中序列化的使用。 数据读写是应用程序中必不可少的一部分,Visual C++中数据的读写当然也十分重要,因此VisualC++在MFC中对数据的读写创造了十分好的支持,这使得我们可以十分方便的实现我们对数据读写操作的需要。 ...
    如何抛出(throw)由CUserException派生的异常?     当我试图捕获(catch)一个派生类异常时,我得到以下错误"error C2039:'classCMyException': is not a member of 'CMyException' 'classCMyException': undeclared identifier 'IsKindOf': cannot convert parameter ...
    1、生成CInternetSession变量。 CInternetSession ses; 2、打开FTP连接。 CFtpConnection* pFTP=ses.GetFtpConnection("ftp.microsoft.com","user","password",port,FALSE); 3、打开文件。 CInternetFile* pF=pFTP-OpenFile("abc.exe"); 更简单的是使用CFtpConnect::GetFile(...) ; CFtpConn...

经验教程

474

收藏

16
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部