jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
阅读:2283回复:15

为什么单步运行时,我跳不出我的函数??

楼主#
更多 发布于:2005-06-07 15:21
我在OnDraw()中调用一个绘图函数draw(),draw()在displayDoc.cpp中,我在draw中设断点单步运行,发现执行完后跳不出来。我把draw()改为:  
BOOL  CStroke::DrawStroke(CDC*  pDC)  
{  
return  TRUE;  
}  
还是跳不出来,为什么哪?  
 
比如我在DrawStroke中读取m_dataArray中的数据,
for(i=0;i<m_dataArray.GetSize();i++)
{  
 k=m_dataArray.m_data;
 str.Format( \"0x%02x\",m_dataArray.m_data);
 pDC->TextOut(100*i,15,str);
}
我单步运行时,i=0开始,一直到i=m_dataArray.GetSize()-1;通过k我观察到数据都是正确的。
当执行完本次循环在按F5时,i又变为0,又开始了一次循环,按道理函数应该结束了阿?
此次循环的前19个数是正确的,最后几个数也是正确的,中间的错了(变成了0x00和0xe0),而且数据的总个数也增加了。
接着F5又开始一次新的循环,数据和第二次循环一样!!
。。。。。。。。。。。。。
如果不但不运行,最后显示的结果,也是和错误的循环得出的结果一样。
怎么回事啊??
请指教,谢谢谢谢!!!!


[编辑 -  6/7/05 by  jackadandy]
s_6666_s_qd
驱动巨牛
驱动巨牛
  • 注册日期2004-08-14
  • 最后登录2006-07-11
  • 粉丝0
  • 关注0
  • 积分199分
  • 威望22点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-07 15:42
按F5时,又进行啦窗口刷新,当然又跳到OnDraw()中调用一个绘图函数draw()执行啦
jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-07 16:00
那问什么我直接执行时,得出的数据也是错的哪?就是说我直接执行时,应该就调用一次draw函数,那么
for(i=0;i<m_dataArray.GetSize();i++)
{
k=m_dataArray.m_data;
str.Format( \"0x%02x\",m_dataArray.m_data);
pDC->TextOut(100*i,15,str);
}
应该就执行一边,结果应该是正确的啊,为什么最后显示的结果是错误的哪?
jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-07 17:12
to maqian:
m_dataArray为CArray<CData,CData> m_dataArray;
CData是我定义的类。
m_data为成员函数,所以应该没问题,
只是str.Format( \"0x%02x\",k);。

我找到原因了!
执行程序后,第一次显示的数据是正确的,只不过当脱动视图的滚动条时,它再次调用draw函数去执行:
for(i=0;i<m_dataArray.GetSize();i++)
{
k=m_dataArray.m_data;
str.Format( \"0x%02x\",k);
pDC->TextOut(100*i,15,str);
}
我就是奇怪,第一次读它是正确的,为什么以后读出的数据就不对了哪?读的都是同一个数组m_dataArray。


[编辑 -  6/7/05 by  jackadandy]
jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-08 09:03
m_dataArray有三个成员变量,所以
str.Format(\"0x%02x\",m_dataArray[ i ] );
输出的是三种类型的数据。我只要m_data
所以str.Format(\"0x%02x\",m_dataArray[ i ].m_data);

我想能不能只在一开始调用ondraw函数,以后当改变窗口时,发出的消息被某个东西拦截,这样就不再调用ondraw了。

maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-06-08 09:16
你设置个static BOOL变量或BOOL成员变量不就行了。拦截消息不大好办。

[编辑 -  6/9/05 by  maqian]
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-06-08 10:23
你说设置静态变量是在哪设置,在ondraw里面?
如果在它里面设的话,它是不执行绘图函数,但视图就什么也没有拉。
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-06-08 10:30
我想能不能只在一开始调用ondraw函数,以后当改变窗口时,发出的消息被某个东西拦截,这样就不再调用ondraw了。

 

难道这话不是你说的?
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-06-08 10:32
把代码传上来吧,给你看看.
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-06-08 10:53
代码太多了,而且很麻烦。
刚才我没说清楚,如果在ondraw里面加静态变量,它还是要执行ondraw函数啊,只不过可以不执行ondraw里面的画图函数drawstroke。这样的话,因为调用了ondraw函数,所以视图变为空的,把上次的视图给“倾空”(姑且这么认为)了。

我的意思是直接不执行ondraw函数。
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-06-08 11:27
理解。
OnDraw是在OnPaint和打印处理函数中调用的。视图“倾空“是OnEraseBkgnd函数完成的。
你想只绘一次画,可以让OnDraw、OnEraseBkgnd直接返回。添加工具栏按钮,在处理函数中:
CClientDC dc(this);
drawstroke( &dc );
这样你想什么时候画就什么时候画,按一下按钮就行了。
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-06-08 14:07
你的意思是用按钮产生的消息来调用绘图函数,OnPaint调用的ondraw什么也不执行,对吧?
但是当触动窗口时(比如拓动窗口的滚动条),会产生OnPaint,
它调用OnEraseBkgnd和ondraw,这样的话,还是被倾空。
是不是要重载一下OnEraseBkgnd?
btw:OnEraseBkgnd什么时候执行?在调用ondraw之前?
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-06-08 14:41
理解。
OnDraw是在OnPaint和打印处理函数中调用的。视图“倾空“是OnEraseBkgnd函数完成的。
你想只绘一次画, 可以让OnDraw、OnEraseBkgnd直接返回。   添加工具栏按钮,在处理函数中:
CClientDC dc(this);
drawstroke( &dc );
这样你想什么时候画就什么时候画,按一下按钮就行了。
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-06-08 15:04
是不是要重载一下OnEraseBkgnd?

是的。
btw:OnEraseBkgnd什么时候执行?在调用ondraw之前?

是的,实际上在OnPaint的CPaintDC的构造函数中调用BeginPaint。
如果更新区域标记为背景擦除,BeginPaint发送WM_ERASEBKGND消息到窗口。
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-06-09 10:06
OnDrawGraph()是工具栏按钮的消息处理函数。
改为这样的话,图形只能显示在当前的区域,而且当拖动视图的滚动条时,图形就没了。好像又被擦除了。
void CDisplayviewView::OnDraw(CDC* pDC)
{

CDisplayviewDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
}
BOOL CDisplayviewView::OnEraseBkgnd(CDC* pDC)
{
    return TRUE;
}

消息处理函数:
void CDisplayviewView::OnDrawGraph()
{
 int i;
 CDisplayviewDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 CClientDC dc(this);

// TODO: Add your command handler code here
CTypedPtrList<CObList,CStroke*>&
                            strokeList = pDoc->m_strokeList;
POSITION pos = strokeList.GetHeadPosition();

  while (pos != NULL)
  {
   CStroke* pStroke = strokeList.GetNext(pos);
   i=all;
   pStroke->DrawStroke(&dc);
  }
}

绘图函数:
BOOL CStroke::DrawStroke(CClientDC *dc)
{
。。。。。。。。。。。。
}
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-06-09 15:42
建议你别再和OnDraw较劲了,数据又不是在显示时才出错。多设几个断点,多TRACE。
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
游客

返回顶部