您的位置:首页 > 其它

MFC学习笔记之多对话框中使用定时器

2014-03-11 19:20 387 查看
http://www.debugease.com/vc/1917040.html


多个对话框可以共用一个定时器吗?

各位,我有这样一个问题:我要做一个多对话框的工程,里面有两个以上的对话框,后台有一个线程进行串口通信,每个对话框都会根据读入串口的内容进行更新。比如一个对话框显示数据,一个对话框绘制波形。

我的通信会采用定时方式,比如100毫秒收发一次,然后对话框的内容也是100MS更新一次。现在我的问题是,我在一个窗体里SETTIMER(),在另一个对话里无法对这个定时器进行处理。有什么办法能让几个对话框共用一个定时器吗?因为我的通信和数据解析都是后台进行的,我希望几个对话框都同步更新。我尝试过控件指针的方式在一个对话框里间接访问其他对话框,但是运行时会发生异常,不知道什么原因?


解决方案 »

可以这么做,,只用一个定时器,负责读数据, 然后将数据分发给(SendMessage or PostMessage)对话框.

1、你这个不需要那么多定时器的。把你的界面和数据逻辑分开。你的数据有改变的时候通知界面重画就ok了。

有数据改变,post消息到相应的界面,让其做相应的修改即可。2、“我尝试过控件指针的方式在一个对话框里间接访问其他对话框,但是运行时会发生异常,不知道什么原因?”这个你调试一下就知道原因了,一般指针这样传递的话判断指针的值是否有效,另外你现在是窗口中使用计时器之类的,需要判断窗口的句柄来判断窗口是否已经创建好。

http://www.debugease.com/vc/2069750.html


如何在子对话框中使用Timer定时器?

MFC菜鸟第一次发贴,请各位高人指教:我需要做一个基于对话框的程序,主对话框TimerTryDlg上就两个按钮,确定钮按下后执行消息处理OnFirstOK(),先初始化定时器,再打开有模式对话框TestDlg,定时器时间到了执行OnTimer-在子对话框上的一个静态控件上画点,但OnTimer在CTimerTryDlg主对话框类中定义。现在问题是,编译链接能通过,运行时,打开子对话框后时间一到,马上两个对话框都关闭了请各位指教,或者提供一下在子对话框(有模非模都可以了)中使用定时器的实例好吗?谢谢!以下是相关代码:class CTimerTryDlg : public CDialog

{

// Construction

public:

CTimerTryDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data

//{{AFX_DATA(CTimerTryDlg)

enum { IDD = IDD_TIMERTRY_DIALOG };

int m_nxPixel;

int m_nyPixel;

int m_nTimer;

.............void CTimerTryDlg::OnFirstOK()

{

// TODO: Add your control notification handler code here

m_nxPixel=0;

m_nyPixel=0;

m_nTimer = SetTimer(1,200,NULL); CTestDlg pDlg;

pDlg.DoModal();

}void CTimerTryDlg::OnTimer(UINT nIDEvent)

{

// TODO: Add your message handler code here and/or call default

if(nIDEvent==1)

{ CWnd *pWnd=GetDlgItem(IDC_STATIC); // IDC_STATIC是子对话框上的一个静态文本控件

CDC *pControlDC=pWnd->GetDC();

pControlDC->SelectStockObject(BLACK_BRUSH);

pControlDC->SetPixel(m_nxPixel,m_nyPixel,RGB(255,0,0));

m_nxPixel++;

m_nyPixel+=2;

pWnd->ReleaseDC(pControlDC);

}

}


解决方案 »

CWnd *pWnd=GetDlgItem(IDC_STATIC); // IDC_STATIC是子对话框上的一个静态文本控件

这句只能得到当前的CTimerTryDlg对话框上的静态文本控件。

如果要达到楼主的目的应该这样

CTestDlg m_Dlg;//这个变量定义为CTimerTryDlg的成员变量

在OnFirstOK() 中调用pDlg.DoModal()

在OnTimer(UINT nIDEvent) 中改为

CWnd *pWnd=m_Dlg.GetDlgItem(IDC_STATIC);

你检查一下pWnd为不为NULL,静态文本控件系统为我们默认ID为ID_STATIC,但如果你在程序需要操作静态文本控件的,必须改变其ID,把静态文本控件的ID:ID_STATIC改为ID_STATIC1试一下。

这个应该在哪里定义呢,在TimerTryDlg.h或者OnTimer中定义均会出现致命性错误

在TimerTryDlg.h中定义,出现致命性错误是因为m_Dlg.DoModal() 产生的对话框窗口是局部的,你关闭它后,

OnTime()如果会去画屏,就会出错,可在画屏前加入判断。

if(!IsWindow(m_Dlg.m_hWnd))

return;

CWnd *pWnd=m_Dlg.GetDlgItem(IDC_STATIC);

14.03.11
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: