| 
					阅读:2437回复:15
				 为什么单步运行时,我跳不出我的函数??
					我在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] | |
| 沙发#发布于:2005-06-07 15:42 
					按F5时,又进行啦窗口刷新,当然又跳到OnDraw()中调用一个绘图函数draw()执行啦				 | |
| 板凳#发布于: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); } 应该就执行一边,结果应该是正确的啊,为什么最后显示的结果是错误的哪? | |
| 地板#发布于: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] | |
| 地下室#发布于: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了。 | |
| 5楼#发布于:2005-06-08 09:16 
					你设置个static BOOL变量或BOOL成员变量不就行了。拦截消息不大好办。 [编辑 - 6/9/05 by maqian] | |
| 
 | 
| 6楼#发布于:2005-06-08 10:23 
					你说设置静态变量是在哪设置,在ondraw里面?
 如果在它里面设的话,它是不执行绘图函数,但视图就什么也没有拉。 | |
| 7楼#发布于:2005-06-08 10:30 我想能不能只在一开始调用ondraw函数,以后当改变窗口时,发出的消息被某个东西拦截,这样就不再调用ondraw了。 难道这话不是你说的? | |
| 
 | 
| 8楼#发布于:2005-06-08 10:32 
					把代码传上来吧,给你看看.				 | |
| 
 | 
| 9楼#发布于:2005-06-08 10:53 
					代码太多了,而且很麻烦。
 刚才我没说清楚,如果在ondraw里面加静态变量,它还是要执行ondraw函数啊,只不过可以不执行ondraw里面的画图函数drawstroke。这样的话,因为调用了ondraw函数,所以视图变为空的,把上次的视图给“倾空”(姑且这么认为)了。 我的意思是直接不执行ondraw函数。 | |
| 10楼#发布于:2005-06-08 11:27 
					理解。
 OnDraw是在OnPaint和打印处理函数中调用的。视图“倾空“是OnEraseBkgnd函数完成的。 你想只绘一次画,可以让OnDraw、OnEraseBkgnd直接返回。添加工具栏按钮,在处理函数中: CClientDC dc(this); drawstroke( &dc ); 这样你想什么时候画就什么时候画,按一下按钮就行了。 | |
| 
 | 
| 11楼#发布于:2005-06-08 14:07 
					你的意思是用按钮产生的消息来调用绘图函数,OnPaint调用的ondraw什么也不执行,对吧?
 但是当触动窗口时(比如拓动窗口的滚动条),会产生OnPaint, 它调用OnEraseBkgnd和ondraw,这样的话,还是被倾空。 是不是要重载一下OnEraseBkgnd? btw:OnEraseBkgnd什么时候执行?在调用ondraw之前? | |
| 12楼#发布于:2005-06-08 14:41 理解。 | |
| 
 | 
| 13楼#发布于:2005-06-08 15:04 是不是要重载一下OnEraseBkgnd? 是的。 btw:OnEraseBkgnd什么时候执行?在调用ondraw之前? 是的,实际上在OnPaint的CPaintDC的构造函数中调用BeginPaint。 如果更新区域标记为背景擦除,BeginPaint发送WM_ERASEBKGND消息到窗口。 | |
| 
 | 
| 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) { 。。。。。。。。。。。。 } | |
| 15楼#发布于:2005-06-09 15:42 
					建议你别再和OnDraw较劲了,数据又不是在显示时才出错。多设几个断点,多TRACE。				 | |
| 
 | 
 
							
 
				 
				