VC++ MFC橡皮筋技术
来源:互联网 发布:linux 查看ip归属地 编辑:程序博客网 时间:2024/05/17 05:56
在MFC下绘制直线,使用橡皮筋技术,可以使直线效果跟随鼠标移动
m_ptOrigin = m_ptEnd = point;
//OnMouseMove
CClientDC dc(this);
if (nFlags == MK_LBUTTON )
{
dc.SetROP2(R2_NOT);
dc.MoveTo(m_ptOrigin);
dc.LineTo(m_ptEnd);
m_ptEnd = point;
dc.MoveTo(m_ptOrigin);
dc.LineTo(m_ptEnd);
} 但是这个只能实现黑色直线的绘制,我们想要画其他颜色的线,并且希望使用不同类型的线和线宽,因此要建一个画笔,指定想要的画笔的类型,如实线、虚线、点线,指定线宽和画笔颜色。void CGraphic1View::OnMouseMove(UINT nFlags, CPoint point)
{
if(MK_LBUTTON == nFlags)
{
CClientDC dc(this);
int oldmode=dc.SetROP2(R2_NOTXORPEN);
CPen pen(m_nLineStyle, m_nLineWidth, m_clr), *oldpen;
oldpen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(m_ptEnd);
m_ptEnd=point;
dc.MoveTo(m_ptOrigin);
dc.LineTo(m_ptEnd);
dc.SelectObject(oldpen);
dc.SetROP2(oldmode);
ReleaseDC(&dc);
}
CScrollView::OnMouseMove(nFlags, point);
}其中CPen pen(m_nLineStyle, m_nLineWidth, m_clr), *oldpen;m_nLineStyle是线型,m_nLineWidth是线宽,m_clr是画笔颜色,也可以指定如下:CPen pen(0, 0, RGB(255, 0, 0)), *oldpen;
下面说一下,橡皮筋效果是如何实现的。当我们按下鼠标左键后,有m_ptOrigin = m_ptEnd = point;
这时鼠标移动就会发送WM_MOUSEMOVE消息,调用OnMouseMove进行处理,我们就在这个响应函数中实现橡皮筋的效果。if(MK_LBUTTON == nFlags)判断是否左键按下的鼠标移动。SetROP2函数主要用于设定当前前景色的混合模式。参数取值R2_NOT就是取反的意思,即前景色为背景色的反色,经常用R2_NOT来画橡皮线,因为两次取反可以还原背景色,但是只能话黑色的线。
而R2_NOTXORPEN画出来的颜色与R2_XORPEN相反,R2_XORPEN是屏幕颜色和画笔颜色的异或。OnMouseMove第一次被调用时,还没画线,所以屏幕的颜色是白色的,R2_XORPEN是当前画笔的颜色取反,那么R2_NOTXORPEN就是当前画笔颜色了。就是说第一次画的线是画笔的颜色。
第二次调用OnMouseMove时,m_ptOrigin和m_ptEnd两个点还没变,所以可以用这两个点再画线,将第一次画的线覆盖掉,变成画布的颜色,然后在新的point点和m_ptOrigin之间重新画线,颜色为画笔颜色。在旧的直线上面画线,因为线本来有颜色,所以R2_XORPEN(屏幕的颜色==画笔颜色)就会变成黑色(1 xor 1=0,0 xor 0=0),取反,即R2_NOTXORPEN为白色,就是画布的颜色,看起来就像消失了一样,其实只不过是线变成白色了(如果画笔不是白色,比如使用你系统设置了护眼配色,客户区变成不伤眼的浅绿色,这样显示出来的颜色还是白色,而不是客户区的颜色)。旧的直线删除了,就可以在新的点point上再次画线了。
扩展:如果想实现矩形、椭圆的橡皮筋效果将语句
dc.MoveTo(m_ptOrigin);dc.LineTo(m_ptEnd);换成:dc.Rectangle(CRect(this->m_ptOrigin, m_ptEnd));或者dc.Ellipse(CRect(this->m_ptOrigin, m_ptEnd));就可以了。
- VC++ MFC橡皮筋技术
- mfc橡皮筋技术哦亲~
- MFC橡皮筋矩形框技术
- VC橡皮筋绘图技术的实现
- VC橡皮筋绘图技术的实现
- VC橡皮筋绘制技术的实现
- mfc橡皮筋程序
- VC/MFC调试技术
- VC/MFC调试技术
- 橡皮筋技术画直线
- OpenGL 橡皮筋技术
- 橡皮筋技术的实现
- VC++的GDI绘图函数:SetROP2 橡皮筋绘图技术中的应用
- VC++的GDI绘图函数:SetROP2 橡皮筋绘图技术中的应用
- C# GDI+ 橡皮筋技术(转)
- OpenGL仿作橡皮筋技术
- 橡皮筋
- 橡皮筋
- 用zeromq搭建行情数据平台
- Hash Sum mismatch and apt-get
- CURLOPT_HTTPPROXYTUNNEL参数的意义
- poj 2785 4 Values whose Sum is 0(hash)
- MySQL数据库调优之四
- VC++ MFC橡皮筋技术
- 强大的async.auto!
- C/C++中如何嵌入汇编
- 快排中注意的小细节
- ruby 的多态
- 音视频应用技术(即时通讯)
- Spring简介
- Ubuntu12.04歌词显示osd-lyrics 和 解决播放器乱码
- python日志输出—logging直接代码配置