之前提问了下,本来以为几位回复的可以解决问题,结果发现不行,只好再次咨询下,看看有没有高人能帮忙解释下。
我用VC6.0开发了一个MFC对话框程序,主要是用串口接收数据,然后显示接收到的数据,包括一些变量的曲线绘制。主界面上有一个TabCtrl,其每个页面都是一个子对话框DLG,每个子对话框其实完全相同,上面只有一个绘制曲线的控件,别的什么也没有,因为需要同时与多个机器通信,参数都是相同的,我只需要用不同的子对话框来区分开即可。为了实现这些,我定义了一个指针数组,根据需要监控的机器数量,创建一个新的DLG,然后添加到TabCtrl上,根据用户点击选择,来控制不同的DLG的显示和隐藏。
   我目前的实现是在串口控件MSCOMM的接收过程中,实现曲线的绘制,比如与A机通信,获取数据后就将新的点添加到上面所说的子对话框上;与B机通信也是相同的过程,因为通过指针数组能正确找到对应的子对话框,这些过程都没有问题。
   现在的问题是当用户切换的其他程序,再切换回来后,TabCtrl上的子对话框显示为默认状态(我在对话框编辑器里面设置的状态),并没有曲线显示,除非我单击一次曲线或者有数据更新才会显示。
   在界面版提问时,几位说需要在OnPaint函数中来实现曲线绘制,本来以为修改下应该可以,发现好像不行。一个是我定义了一个通用的DLG,后面的都是一样的,只不过添加的数据点不同,曲线不同而已,或者可以通过重载来实现,但是毕竟麻烦,修改比较大;另外我尝试了一下如果不用TabCtrl,而在一个对话框上添加曲线控件,用一个定时器来添加数据点,绘制曲线就没有任何问题!怎么切换都能正确显示曲线,也没有在OnPaint里面添加什么东东,只是调用了CDialog的OnPaint()函数,而在需要显示在TabCtrl上的子对话框的OnPaint()函数中,就提示“Do not call CDialog::OnPaint() for painting messages”不知道是什么意思。
   我考虑的是,会不会是因为我使用了指针数组来指向这些子对话框,切换回来后刷新界面时并不能正确识别到当前的子对话框?然后我就在主界面的OnPaint函数中,添加了TabCtrl和当前应该显示的子对话框的UpdataData(FALSE)都没有任何作用,甚至是子对话框上的曲线控件执行UpdataData(FALSE)也是老样子。
   百思不得其解,单独一个对话框上的曲线控件就显示无误,为何在TabCtrl上就不行了?
   希望有高人指点一下,到底是怎么回事?

解决方案 »

  1.   

    确是有点奇怪,
    “Do not call CDialog::OnPaint() for painting messages” 的意思就是不要手动去调用OnPaint()函数,无论在哪个地方,一般不要手动调用这个函数,这个函数是由系统自动调用的
      

  2.   

    添加size 和 sizing 消息,在 OnSize() OnSizing()中更新绘图区域。
      

  3.   

    这种情况建议用 CPropertySheet 和 CPropertyPage 来做界面,省事多了。
    毕竟是控件,自绘是不太可能,另外 OnPaint() 里面不要 UpdataData()。
      

  4.   

    建议:每次在 OnChangeTab时得到当前tab页, 然后刷新该tab页。
      

  5.   

    在OnPaint里面加标志标示不同的tab页,画不同的曲线
    你切换tab页时,强制刷新下界面试试
      

  6.   

    试一下把TABCTRL的重绘类型去掉:
    LONG lc = ::GetClassLong(hTabWnd,GCL_STYLE);
    lc &= ~(CS_HREDRAW|CS_VREDRAW);
    ::SetClassLong(hTabWnd,GCL_STYLE,lc);
    然后在WM_SIZE消息里刷新一下:
    InvalidateRect(NULL,TRUE);
      

  7.   

    不好意思,前些日子请假没有上班,一直没有时间上来看看,感谢各位的回复。
    to muzizongheng和zoulie:二位的方法我都试过了,还是一样,只要切换,就显示初始状态,而不是当前实时的数据曲线。to dx03680:不知道CPropertySheet 和 CPropertyPage比TabCtrl强在哪儿?我感觉在实现属性页上应该是一样的。当前我碰到的问题是刷新的问题,可是曲线更新又不能在OnPaint函数中实现,在数据接收函数中完成,然后调用描点函数来进行曲线绘制。to ringphone:WM_SIZE应该是在窗口移动或者变化时才会触发的吧,我的窗口切换时用SPY++看并没有触发WM_SIZE消息。
      

  8.   

    不知道是不是你代码的bug, 
    首先cpropertysheet也是用的tabctrl, 因此没有区别然后就是你用的是CTabCtrl 还是 CMFCTabCtrl, 若是后者有些小bug。你在切换tab页时调用 updatewindow肯定会重画的,还有问题, 肯定是你画图有问题。 和dlg无关。