绘图问题,完全送分

leon19850102 2006-11-28 03:28:19
用MOUSEMOVE函数进行鼠标画图的时候,不管是画点,还是画线,都会出现由于拖动造成的间距不等的问题,怎样可以解决?
详细代码,或直接重要的思路给分,困惑很久的问题.
...全文
351 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
CharlesPrince 2006-12-29
  • 打赏
  • 举报
回复
如果你只是要绘制点和线条的话,只需要处理WM_LBUTTONDOWN事件就可以了:
1.加入全局变量 BOOL IsDrawing;
CPoint prePoint;
//如果想支持重绘的话,可以加入
//CDC MemDC;

2.在构造函数中加入
IsDrawing=FALSE;
//如果支持重绘的话,在OnInitDialog()中加入
//CDC *pDC=GetDC();
//MemDC.CreateCompatibleDC(pDC);
//同时在WM_PAINT处理OnPaint()中
CRect WndRc;
GetWindowRect(&WndRc);
ScreenToClient(&WndRc);
pDC->BitBlt(WndRc.left,WndRc.top,WndRc.right,WndRc.bottom, &memDC,0,0, SRCCOPY);
//同时要注意MemDC的释放

3.生成处理WM_LBUTTONDOWN的函数
4.在这个事件中加入:
OnLButtonDown(UINT nFlag,CPoint point)
if(!IsDrawing)
{
prePoint=point;
IsDrawing=TRUE;
}
else
{
CDC pDC=GetDC()
pDC->MoveTo(&prePoint);
pDC->LineTo(&point);
//如果要重绘把这里的pDC换成为MemDC
//Invalidate(0);
prePoint=point;
}

hoocode 2006-12-29
  • 打赏
  • 举报
回复
http://www.hoocode.com/blog
mousemove
开始记录点
绘图
结束记录点
livedeal 2006-12-06
  • 打赏
  • 举报
回复
LineTo的时候,你最后一个点要用setpixel,不然的话,画的线中间会有断点出来的```
leon19850102 2006-12-06
  • 打赏
  • 举报
回复
wawaku(一堆裤衩!) ,我没有说我用不来MOVE TO ,LINE TO,汗
我问有的人,说直接画似乎没有办法解决这种因鼠标速度造成的问题,shl6894() ,我去找下你那个算法,你有代码吗?你可以详细点说吗?
一分之千 2006-12-05
  • 打赏
  • 举报
回复
现在出现的问题是,画线的时候两点间画直线会变成虚线,而且又不像虚线,每段线长度不一样,有点像上面说的线条不清晰的问题.画点的时候更是有的点多有的点少.
===================================================
你说的是虚线还是折线?折线是走样,虚线的话那就是你程序错误了吧。
如果觉得直接用moveto lineto画出来效果不好的话,建议直接使用象素画法。如布拉斯汉姆(braseham,好像这样写)算法来画。
wawaku 2006-12-05
  • 打赏
  • 举报
回复
-_-!!! 这都不会,汗个
qiujian5628 2006-12-05
  • 打赏
  • 举报
回复
画线会出现这样的问题吗?
画点肯定是会的 但是画线 直接Lineto应该不会有这样的问题
有可能是你的程序中漏掉了某些点的缘故 把前点和后点好好检查看看
leon19850102 2006-12-05
  • 打赏
  • 举报
回复
你的代码不对啊,m_Bitmap是定义的什么??
wacel 2006-12-05
  • 打赏
  • 举报
回复
对话框是不是有OnPaint这个函数,用它不就一样了吗!
eplanet 2006-12-05
  • 打赏
  • 举报
回复
感觉你说的好像是刷新方面的问题吧,可以试试双缓冲算法。

CDC这个东西必须要用一个CBitmap来初始化的,所以m_Bitmap就是做这个的。不然画不出东西。

还是不太理解你的为难题,希望对你有帮助
leon19850102 2006-12-04
  • 打赏
  • 举报
回复
我是在对话框做的啊,没有VIEW这个类,是不是要加到里面才可以?还是有其它办法?
wacel 2006-12-01
  • 打赏
  • 举报
回复
先在View类的OnCreate函数中创建内存DC:
m_clientWidth = GetSystemMetrics(SM_CXSCREEN);//获取客户区宽度
m_clientHeight = GetSystemMetrics(SM_CYSCREEN);//获取客户区高度

CClientDC dc(this);
pMemoDC = new CDC();
pMemoDC->CreateCompatibleDC(&dc);//初始化内存DC
m_Bitmap.CreateCompatibleBitmap(&dc,m_clientWidth,m_clientHeight);//初始化位图
pMemoDC->SelectObject(&m_Bitmap);//将位图选入内存DC

DrawAll();//此时内存DC上没有任何对象,调用此方法仅是将内存DC背景设为白色

注:DrawAll()是我定义的在内容DC上画图形的函数。
然后在MouseMove里面调用DrawAll()在pMemoDC上画图,再用Invalidate(0)使View重绘。不过先得在OnDraw()函数里定一句
pDC->BitBlt(0,0,m_clientWidth,m_clientHeight,pMemoDC,0,0,SRCCOPY);//将内存DC上的图形拷贝到客户区上。
OK了!
leon19850102 2006-11-30
  • 打赏
  • 举报
回复
汗,我表达能力真是差的可以,我详细说下,希望大家帮忙指点指点.就是我先左键点个位置,然后从那个地方开始画线(点),然后在MOUSEMOVE中来画,也就是鼠标跑到哪儿就画到哪儿,shl6894() 说的异或方式我已经解决.现在出现的问题是,画线的时候两点间画直线会变成虚线,而且又不像虚线,每段线长度不一样,有点像上面说的线条不清晰的问题.画点的时候更是有的点多有的点少.
wacel() 能把你的内存DC方法详细说下吗?
wacel 2006-11-29
  • 打赏
  • 举报
回复
你是什么意思呀?如果是鼠标移动过快不能画出流畅的直线的话就好办了。你可以建一个内存DC,先在内存DC上画好,然后把这个内存DC上的内容贴到客户区DC上,就不会出现这各现象了。
一分之千 2006-11-29
  • 打赏
  • 举报
回复
楼主问完问题就跑了啊?你说的是什么意思?
可以使用异或方式进行画图,使得拖动的时候不会造成尾迹
pDC->SetROP2(R2_NOTXORPEN);
然后在画图的时候画两遍
MOVETO(,)
lineto(,)
moveto(,)
lineto(,)
「已注销」 2006-11-29
  • 打赏
  • 举报
回复
如果是这样就好解决了,直接用LINETO连接两个点就行了啊,这样不管是快是慢都可以连续了
islife 2006-11-28
  • 打赏
  • 举报
回复
难道不会把鼠标速度降低后再记录下每次鼠标位置信息,和以往的位置距离进行计算,发现是等距离后再做图吗?
chenzhiwei021 2006-11-28
  • 打赏
  • 举报
回复
楼主的意思是由于鼠标的快速移动会造成的抖动,也就是线条不流畅?
desert_tian 2006-11-28
  • 打赏
  • 举报
回复
拖动造成的间距不等的问题?

不明白意思

「已注销」 2006-11-28
  • 打赏
  • 举报
回复
不明白,再解释一下
加载更多回复(6)

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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