首先我们说下通过鼠标的移动来绘制直线。
这里要捕获到鼠标的两个消息: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被直接发送到目标窗口,从而导致窗口立即重绘。
分享到:
相关推荐
典型的绘图程序,对初学者学习有很大帮助,vc2005编写
VC6.0绘图MFC,
VC MFC MVC球体绘图程序源码,多任务模式的VC 绘图程序实例,在以往的模式中,大家一般都采用 Input-Processing-Output 的单任务模式,但是现在在Windows的编程中,MVC模型更适合图形界面的设计,它将数据处理和数据...
有铅笔工具,橡皮工具,画刷工具。可以画圆,椭圆,矩形,填充的透明的。直线,任意多边形。...有不少BUG,我不是专业学软件的,只是一次课程设计的作业,内附设计说明书和一份教程,还有老师给我的几个代码。
给出了VC/MFC文本输出 屏幕绘图实例 位图操作 绘图句柄操作 等编程设计的28个实例,对学习绘图和文字输出方面的同学来说非常简单易懂,(本资源的实例均为本人从光盘中拷出来的,能够正常运行)
利用VC6.0中MFC编写的画图小程序。适合初学者学习代码用。
基于VC开发的完整的绘图程序可学习参考。非常完整的多文档开发的绘图程序学习参考必备
在使用MFC时,介绍了对于图形绘制的一些基本的控制:设置相应的对话框,字体,改变控件的背景颜色及本文的颜色。并且在窗口中可以显示相应的位图
VC 6.0 基于MFC的绘图及打印技术实例,附上了完整源码,打开程序后,可单击“测试”按钮,弹出绘图设置窗口,设置好参数绘图,然后打印出数据。方法步骤: //创建画笔C 对象 CPen* pPenBlue = new CPen; //...
自己写的一个扫雷游戏,代码用VC实现。后续会上传俄罗斯方块的游戏实现。
vc6.0做的绘图程序,有的功能不全的地方,请指教。
Visual Studio,MFC,单文档 程序功能 1.实现设置画笔属性,选择画笔粗细的功能 2.实现颜色选择功能 3.实现油漆桶填充功能 4.实现画直线和铅笔画功能 5.实现特殊形状绘制(矩形、三角形、圆、椭圆)功能 6.实现局部...
VC++ MFC 绘图程序 橡皮筋功能 重绘 保存 绘图 分栏
此代码实现在vc中计算,调用matlab进行绘图,并将绘图结果返回到VC中,利用MFC显示绘图结果,以提供较好的GUI
MFC绘图软件 用VC做的 MFC绘图软件 用VC做的 MFC绘图软件 用VC做的 MFC绘图软件 用VC做的搜索
这是我学VC时的大作业,就是编一个绘图的小软件!这个可以适合初学VC的同学看看简单,程序能运行! 这个软件有橡皮筋功能,有写字功能,能填充颜色,能对线条自定义,可以设置他的 宽度,类型,大小,颜色等等。 ...
在工业控制系统中,经常需要实时的显示一些曲线,运用传统的绘图...现在常用的解决方法是:利用内存绘图的技术,将需显示的图形绘制在内存位图中,然后再拷贝到屏幕上,很好的解决了屏幕闪烁的问题。并且处理速度快。
界面设计使用VC++ MFC,棋盘和棋子使用 GDI 绘图,棋盘落子信息使用二维数组保存,判断胜负采用循环遍历计数法。
vc6.0 动态曲线 运用了SetMapMode,SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportExt 注释也比较详细 双缓冲,但是我刷新还是用了全局,有点闪,没时间弄它。
C++ 实现基本绘图:三角形、矩形、椭圆