您的位置:程序门 -> vc/mfc -> 图形处理/算法



初学者提问:鼠标移动路径显示和路径记录,多谢了


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


初学者提问:鼠标移动路径显示和路径记录,多谢了
发表于:2007-09-28 11:24:01 楼主
感谢各位大虾关心我的问题:
我要实现的功能是:点击鼠标左键后开始显示鼠标路径,抬起后便停止显示
;在显示路径同时记录鼠标每时刻坐标与position.bin文件中;最后读取bin文件。
现在我的程序中完成了前两个,但是当按下左键开始拖动鼠标时,就报错了。而且是filecore.cpp中的错误,不知道怎么修改。因此现在请教各位资深编程前辈指点一二,小弟不胜感激!!多谢大家了。
主要程序如下:
void   cmyview::onlbuttondown(uint   nflags,   cpoint   point)
{
updatedata(true);
m_begindraw=false;//判断鼠标是否按下
m_ptorigin=point;

//建立存储位置的   position文件
//-----------------------------------------------------

route.format( "h:\\route.bin ");   file.open( "route ",cfile::modecreate);

//-------------------------------------------------------

cview::onlbuttondown(nflags,   point);
}


void   cmyview::onmousemove(uint   nflags,   cpoint   point)
{
updatedata(true);


//显示坐标
//------------------------------------------------------------
cstring   str;
str.format( "x=%d,y=%d ",point.x,point.y);
((cmainframe*)getparent())-> m_wndstatusbar.setwindowtext(str);

//-------------------------------------------------------------

if(m_begindraw){}//如果m_bdraw的值是初始值,即真,则不作图,不记录
else   //如果m_bdraw的值已经设为假,则开始画图,记录
{

//开始画路径
//--------------------------------------------------------------
cclientdc   dc(this);
dc.moveto(m_ptorigin);
dc.lineto(point);
m_ptorigin=point;
//--------------------------------------------------------------

//开始记录坐标位置与route.bin文件中
//--------------------------------------------------------------

m_pointmouse.x=point.x;
m_pointmouse.y=point.y;


if(file.open( "route ",cfile::modewrite))
{
file.seektoend();
file.write(&m_pointmouse,sizeof(m_pointmouse));
}

//--------------------------------------------------------------
}

cview::onmousemove(nflags,   point);
}


void   cmyview::onlbuttonup(uint   nflags,   cpoint   point)
{

m_begindraw=true;//当鼠标键抬起时,m_bdraw又变成假,则停止作图

//按键抬起
//-------------------------------------
route.format( "%d ",file.getlength());
file.close();
//-------------------------------------
cview::onlbuttonup(nflags,   point);
}
发表于:2007-09-28 11:30:471楼 得分:0

调试看哪儿出错吧

但是你在移动鼠标的过程中打开文件并且写入这种方式不好

应该在鼠标按下的时候就打开文件,频繁打开性能影响很大
发表于:2007-09-28 11:30:552楼 得分:0
去掉updatedata(true);
估计崩溃是在((cmainframe*)getparent())-> m_wndstatusbar.setwindowtext(str);
发表于:2007-09-28 12:18:483楼 得分:0
首先谢谢以上两位的热心了
调试过程中是没有报告有错误的
只有在执行的时候,鼠标点下左键也没什么,开始拖动后就在microsoft   visual   c++   debug   library   的对话框中报以下错误

debug   assertion   failed!
program:(这里面写的是我声称的可执行文件路径以及文件名)
file:filecore.cpp
line:121
for   information   on   how   your   program   can   cause   an   assertion
failure,see   the   visual   c++   documention   on   asserts.
然后叫我选择终止,重试还是忽略。

其中我查到了filecore.cpp的第121行是这么条语句
assert(m_hfile   ==   invalid_handle_value);
//   cfile   objects   are   always   binary   and   createfile   does   not   need   flag

二楼的大哥说是去掉updatedata(true);我也试过了,效果还是一样的
发表于:2007-09-28 14:21:464楼 得分:0
assert(m_hfile   ==   invalid_handle_value);
很明显,文件无效,检查一下file
发表于:2007-09-28 14:53:215楼 得分:0
文件打开和关闭要一一对应,你在onmousemove中不断打开文件……况且在onlbuttondown中已经打开文件了。
发表于:2007-09-28 15:07:076楼 得分:0
1。assert(m_hfile   ==   invalid_handle_value);这个是因为文件句柄无效导致的引起系统的断言的。
2。   在mousemove中频繁的打开文件并不是一个好的选择,这样容易出现打开多个文件,而没有关闭文件,你的打开方式又不是共享的方式,可能就引起错误了,因为程序已经打开。
3。最好不要在mousemove中这样打开文件,原因是:
1)容易使文件没有关闭,导致资源浪费。
2)触发的很频繁,导致程序运行变慢。
3)出现文件打开失败。
发表于:2007-09-28 15:31:367楼 得分:0
谢谢楼上的好心人
我似乎明白问题的所在了,但是有没有相对好一点的处理方式么??我暂时想不出来,哪位高手能不能指明一个大体方向阿
而且,现在应该是按下左键应该是就生成一个bin文件才对,但是却提示说“没有找到一个未命名的文件”,这又是怎么回事呢??
小弟实属初来乍到,大家有点耐心点吧


快速检索

最新资讯
热门点击