之前提问了下,本来以为几位回复的可以解决问题,结果发现不行,只好再次咨询下,看看有没有高人能帮忙解释下。
我用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上就不行了?
希望有高人指点一下,到底是怎么回事?
我用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上就不行了?
希望有高人指点一下,到底是怎么回事?
“Do not call CDialog::OnPaint() for painting messages” 的意思就是不要手动去调用OnPaint()函数,无论在哪个地方,一般不要手动调用这个函数,这个函数是由系统自动调用的
毕竟是控件,自绘是不太可能,另外 OnPaint() 里面不要 UpdataData()。
你切换tab页时,强制刷新下界面试试
LONG lc = ::GetClassLong(hTabWnd,GCL_STYLE);
lc &= ~(CS_HREDRAW|CS_VREDRAW);
::SetClassLong(hTabWnd,GCL_STYLE,lc);
然后在WM_SIZE消息里刷新一下:
InvalidateRect(NULL,TRUE);
to muzizongheng和zoulie:二位的方法我都试过了,还是一样,只要切换,就显示初始状态,而不是当前实时的数据曲线。to dx03680:不知道CPropertySheet 和 CPropertyPage比TabCtrl强在哪儿?我感觉在实现属性页上应该是一样的。当前我碰到的问题是刷新的问题,可是曲线更新又不能在OnPaint函数中实现,在数据接收函数中完成,然后调用描点函数来进行曲线绘制。to ringphone:WM_SIZE应该是在窗口移动或者变化时才会触发的吧,我的窗口切换时用SPY++看并没有触发WM_SIZE消息。
首先cpropertysheet也是用的tabctrl, 因此没有区别然后就是你用的是CTabCtrl 还是 CMFCTabCtrl, 若是后者有些小bug。你在切换tab页时调用 updatewindow肯定会重画的,还有问题, 肯定是你画图有问题。 和dlg无关。