阅读:2302回复: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。
|
|
|