MessageBox 会产生你意想不到的“副作用”?该怎么解决

MessageBox 会产生你意想不到的“副作用”?
我在A窗口的右半部分建了一个子窗口B,B窗口上我又建了三个Edit控件来接受用户输入的数据,以这三个数据作为原点和半径在A窗口的左部分画圆。B窗口还有两个Button控件,一个是“直接画圆”,一个是“动态画圆”,分别点击这两个按钮,调用不同的函数,其中那个“动态画圆”就是多了一个延时而已。 
下面是问题所在:
  当我画了一个圆,再画第二个圆时,第一个圆还在A窗口上,我想把它消去,就在B窗口响应按钮开始画圆的时候 调用了InvalidateRec(GetParent(hwnd),NULL,true);让它重绘父窗口并擦除背景,请看代码:

  下面是按下“直接画圆”或“动态画圆”按钮时的响应代码:
  (1) SendMessage(GetParent(hwnd),WM_PAINT,0,0);//本来想给父窗口发送一个WM_PAINT消息进行重绘 但它不擦除背景 
  //刚才画的圆还在
 
  (2) InvalidateRect(NULL,NULL,true); // 这句是要刷新所有的窗口 包括A和B,如只用这一句和第(5)句画圆函数,
  // 不用(1),(3),(4)直接画圆工作的很
  // 好,可是动态画圆的时候,它就把所有的背景都擦除了,然后在一个白色背
  //景窗口上画圆,画好圆之后,其他的组件才再次显示在窗口上,我怀疑直接
  // 画圆也是这样,只是没有延迟,没看到他的步骤而已。可是如果我加上第(4)
  // 句,就什么都会好好的,上一次画的圆也会清除  
   
  (3) InvalidateRect(GetParent(hwnd),NULL,true); //如果不用(1)和(2),只用这一句(3),那么你点击“直接画
  // 圆”按钮,就什么反应也没有(也可能是画了之后立刻被擦除了,我
  //没看到)。但是点击“动态画圆”,它就会在A窗口的左半部份画圆,
  //右半部分的B窗口也依然在那里 总之“动态画圆”显示的很好。可是只
  //要我一加上第(4)句,就什么都好了 “直接画圆”和“动态画圆”都
  //显示的好好的。
 
 (4) MessageBox(NULL,TEXT("我开始圆了"),NULL,MB_OKCANCEL); //这一句 加于不加 显示出来的结果大不同啊!!!!

 (5) DrawCircle();// 调用画圆函数


我现在就是不明白 一个MessageBox到底发挥的什么作用呢? 加 与 不加 差别咋就这么大呢????
还请高手一同讨论 赐教 小弟真的弄不明白到底是什么原因?  


------解决方案--------------------
好多,没有看完,MessageBox在你这里其实就是起到了一个延时的作用,你用Sleep替代看看,应该可以的,比如Sleep(2000);
------解决方案--------------------
他们在统一个进程中
------解决方案--------------------
MessageBox在这里就是帮你pump了一下父窗口的消息而已。
------解决方案--------------------
MessageBox模态对话框貌似会中断程序的执行!
------解决方案--------------------
当一个MessageBox显示的时候它要占用视图的空间吧。它显示在视图的上面。当关闭掉的时候视图又恢复到原来的样子,但这时视图必须调用OnPaint来重画。
所以当你加上MessageBox时会有你想要重画的结果。

当然你可以用Invalidv..()和UpdateWindow()函数代替。具体的我不知道函数该怎么写了。请勿见怪。
Invalidv..()使窗口无效,UpdateWindow()更新窗口。
------解决方案--------------------
只用:
(3) InvalidateRect(GetParent(hwnd),NULL,true); 
(5) DrawCircle();// 调用画圆函数
这两行不行吗?我看差不多啊
如果实在不行,就按照楼上的方法,在(3)之后,加上一个UpdateWindow()强迫窗口更新试一下,即
(3) InvalidateRect(GetParent(hwnd),NULL,true); 
UpdateWindow();
(5) DrawCircle();// 调用画圆函数
------解决方案--------------------
invalidaterect不会立即更新,传NULL会立即全部更新看MSDN,msgbox后会有时间分发消息处理重绘,invalid后可接着用updatewindow立即更新