`
mmdev
  • 浏览: 12894394 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

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被直接发送到目标窗口,从而导致窗口立即重绘。


分享到:
评论

相关推荐

    基于MFC的绘图程序

    典型的绘图程序,对初学者学习有很大帮助,vc2005编写

    VC6.0 MFC绘图

    VC6.0绘图MFC,

    VC MFC MVC球体绘图程序源码.rar

    VC MFC MVC球体绘图程序源码,多任务模式的VC 绘图程序实例,在以往的模式中,大家一般都采用 Input-Processing-Output 的单任务模式,但是现在在Windows的编程中,MVC模型更适合图形界面的设计,它将数据处理和数据...

    VC++6.0 MFC 课程设计简易绘图程序

    有铅笔工具,橡皮工具,画刷工具。可以画圆,椭圆,矩形,填充的透明的。直线,任意多边形。...有不少BUG,我不是专业学软件的,只是一次课程设计的作业,内附设计说明书和一份教程,还有老师给我的几个代码。

    VC/MFC文本输出与屏幕绘图程序设计

    给出了VC/MFC文本输出 屏幕绘图实例 位图操作 绘图句柄操作 等编程设计的28个实例,对学习绘图和文字输出方面的同学来说非常简单易懂,(本资源的实例均为本人从光盘中拷出来的,能够正常运行)

    利用MFC编写的画图程序及其源码

    利用VC6.0中MFC编写的画图小程序。适合初学者学习代码用。

    基于VC开发的完整的绘图程序可学习参考

    基于VC开发的完整的绘图程序可学习参考。非常完整的多文档开发的绘图程序学习参考必备

    VC中MFC的绘图控制

    在使用MFC时,介绍了对于图形绘制的一些基本的控制:设置相应的对话框,字体,改变控件的背景颜色及本文的颜色。并且在窗口中可以显示相应的位图

    VC MFC绘图打印技术范例.rar

    VC 6.0 基于MFC的绘图及打印技术实例,附上了完整源码,打开程序后,可单击“测试”按钮,弹出绘图设置窗口,设置好参数绘图,然后打印出数据。方法步骤:  //创建画笔C 对象  CPen* pPenBlue = new CPen;  //...

    VC实现扫雷游戏。利用MFC实现绘图。

    自己写的一个扫雷游戏,代码用VC实现。后续会上传俄罗斯方块的游戏实现。

    vc6.0做的绘图程序

    vc6.0做的绘图程序,有的功能不全的地方,请指教。

    MFC制作Windows画图程序

    Visual Studio,MFC,单文档 程序功能 1.实现设置画笔属性,选择画笔粗细的功能 2.实现颜色选择功能 3.实现油漆桶填充功能 4.实现画直线和铅笔画功能 5.实现特殊形状绘制(矩形、三角形、圆、椭圆)功能 6.实现局部...

    VC++ MFC 绘图程序 圆 椭圆 多边形 矩形 重绘

    VC++ MFC 绘图程序 橡皮筋功能 重绘 保存 绘图 分栏

    MFC显示Matlab绘图结果

    此代码实现在vc中计算,调用matlab进行绘图,并将绘图结果返回到VC中,利用MFC显示绘图结果,以提供较好的GUI

    MFC绘图软件 大二写得

    MFC绘图软件 用VC做的 MFC绘图软件 用VC做的 MFC绘图软件 用VC做的 MFC绘图软件 用VC做的搜索

    MFC绘图小软件源代码(可当VC大作业用,配套有一份试验报告我也传上去了!)

    这是我学VC时的大作业,就是编一个绘图的小软件!这个可以适合初学VC的同学看看简单,程序能运行! 这个软件有橡皮筋功能,有写字功能,能填充颜色,能对线条自定义,可以设置他的 宽度,类型,大小,颜色等等。 ...

    VC6.0 MFC处理绘图

    在工业控制系统中,经常需要实时的显示一些曲线,运用传统的绘图...现在常用的解决方法是:利用内存绘图的技术,将需显示的图形绘制在内存位图中,然后再拷贝到屏幕上,很好的解决了屏幕闪烁的问题。并且处理速度快。

    五子棋游戏(VC MFC GDI绘图)

    界面设计使用VC++ MFC,棋盘和棋子使用 GDI 绘图,棋盘落子信息使用二维数组保存,判断胜负采用循环遍历计数法。

    vc6.0 MFC 动态曲线 SetMapMode 双缓冲绘图

    vc6.0 动态曲线 运用了SetMapMode,SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportExt 注释也比较详细 双缓冲,但是我刷新还是用了全局,有点闪,没时间弄它。

    基于VC MFC程序设计——简易画图板

    C++ 实现基本绘图:三角形、矩形、椭圆

Global site tag (gtag.js) - Google Analytics