如何用鼠标画直线

liujing_1007 2009-12-22 09:24:16
整个过程中一直显示直线状态,请问高手,如何实现??
...全文
318 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
starytx 2009-12-24
  • 打赏
  • 举报
回复
用链表记录点,在OnPaint或OnDraw中遍历链表进行绘制
maple_zhj 2009-12-24
  • 打赏
  • 举报
回复
画在内存DC中,
然后每次要画新的线,继续加到内存DC中,

再显示到屏幕。


其中 ,内存DC实例应一直存在 。
caostorm 2009-12-24
  • 打赏
  • 举报
回复
等着接分呢 :D
liujing_1007 2009-12-24
  • 打赏
  • 举报
回复
谢谢大家的帮助,问题解决了,嘿嘿。。。
zjfhgdx 2009-12-23
  • 打赏
  • 举报
回复
楼主的意思是要画垂直线和水平线吗?

在第二次单击鼠标的CLICK事件里把点击的位置取出来,把X或Y的位置改成第一次点击的位置便可。

还是要实现移动鼠标的时候实时更新线条
你可以用DC的SETROP2(R2_NOT)来实现。这个是用来画反色的。具体查查这个东东的用法你就知道。很好用的
caostorm 2009-12-23
  • 打赏
  • 举报
回复
你可以保存当前DC,就是从DC中将bitmap数据拿出来,下次画的时候再载入bitmap数据,在载入的基础上再画,没必要保存历史信息,除非你要做撤销操作才需要保存历史信息

CDC*pDC=GetDC();
CRect rect;
GetClientRect(&rect);

PBYTE pBuffer;
pBuffer = new BYTE[rect.Width()*rect.Height()*3];

CBitmap Bmp,*pBmp;
Bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());

CDC memDC;
memDC.CreateCompatibleDC(pDC);
pBmp=memDC.SelectObject(&Bmp);
memDC.BitBlt(rect.left, rect.top, rect.right, rect.bottom, pDC,0,0,SRCCOPY);

pBmp=memDC.SelectObject(pBmp);
pBmp->GetBitmapBits(rect.Width()*rect.Height()*3,pBuffer);


pBuffer内的就是DC上画的RGB数据,至于载入的话可以用CBitmap::SetBitmapBits(),然后再SelectObject来做。
或者干脆就不用取出RGB数据,直接保存Bmp也成。
chenzhixin 2009-12-23
  • 打赏
  • 举报
回复
用链表保存线条的点,重绘的时候一起绘制
tractor2012 2009-12-23
  • 打赏
  • 举报
回复
看孙鑫的<<VC++深入详解>>,里边介绍的很详细的。

楼主还要多看书啊。
oldn123 2009-12-23
  • 打赏
  • 举报
回复
只能是把之前画过的点都保存起来,然后每次paint时再把这些点全画出来
mmilmf 2009-12-23
  • 打赏
  • 举报
回复
使用文档序列化来保存数据,以防刷新的时候原来的图消失
http://mmilmf.download.csdn.net/

我这有个画图的程序你看下吧,如果还不行的,再给你个简单的例子
liujing_1007 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mmilmf 的回复:]
C/C++ codeif(m_DrawType==1)//画直线 {
pDC->MoveTo(m_StartPoint);
pDC->LineTo(m_EndPoint);
}

此段代码写于OnDraw()函数中,m_StartPoint起始点,m_EndPoint终点都是全局变量
C/C++ codevoid CXXXView::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: Add your message handler code here and/or call default m_StartPoint=point;//起始点为鼠标按下的点 CView::OnLButtonDown(nFlags, point);
}void CXXXView::OnMouseMove(UINT nFlags, CPoint point)
{// TODO: Add your message handler code here and/or call default
m_EndPoint=point;//终止点为鼠标当前位置 Invalidate();

CView::OnMouseMove(nFlags, point);
}void CXXXView::OnLButtonUp(UINT nFlags, CPoint point)
{// TODO: Add your message handler code here and/or call default
m_EndPoint=point;//终止点为鼠标当前位置 Invalidate();//刷新界面
CView::OnLButtonUp(nFlags, point);
}
[/Quote]
不好意思,再问一下:如果这样写的话,画一条线后要想再画就会把上一条线刷新掉,如果不刷新掉上边画过的线,该怎么解决?
liujing_1007 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 liujing_1007 的回复:]
整个过程中一直显示直线状态,请问高手,如何实现??
[/Quote]
不好意思,再问一下:如果这样写的话,画一条线后要想再画就会把上一条线刷新掉,如果不刷新掉上边画过的线,该怎么解决?
aidy22 2009-12-23
  • 打赏
  • 举报
回复
GDI的做法是
pDC->MoveTo(X,Y);直线的起点

pDC->LineTo(X,Y);直线的终点

GDI+的就更简单的了,只是前提你要有GDI+库。可以去百度GOOGLE一下
maple_zhj 2009-12-23
  • 打赏
  • 举报
回复
pDC->MoveTo(X,Y);移到到此

pDC->LineTo(X,Y);从上次移到的位置开始,连接直线 到设置的位置。
oldn123 2009-12-22
  • 打赏
  • 举报
回复
主要是看你在什么位置加的画线代码.
加在OnPaint中就OK,view的话加在OnDraw中也可以
mmilmf 2009-12-22
  • 打赏
  • 举报
回复

if(m_DrawType==1) //画直线
{
pDC->MoveTo(m_StartPoint);
pDC->LineTo(m_EndPoint);
}


此段代码写于OnDraw()函数中,m_StartPoint起始点,m_EndPoint终点都是全局变量

void CXXXView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_StartPoint=point; //起始点为鼠标按下的点
CView::OnLButtonDown(nFlags, point);
}

void CXXXView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

m_EndPoint=point; //终止点为鼠标当前位置
Invalidate();

CView::OnMouseMove(nFlags, point);
}

void CXXXView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

m_EndPoint=point; //终止点为鼠标当前位置
Invalidate(); //刷新界面

CView::OnLButtonUp(nFlags, point);
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧