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

探讨了在MFC应用程序中如何实现多个对话框共享同一个定时器的问题,提供了通过发送消息更新界面的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

各位,我有这样一个问题:我要做一个多对话框的工程,里面有两个以上的对话框,后台有一个线程进行串口通信,每个对话框都会根据读入串口的内容进行更新。比如一个对话框显示数据,一个对话框绘制波形。
我的通信会采用定时方式,比如100毫秒收发一次,然后对话框的内容也是100MS更新一次。现在我的问题是,我在一个窗体里SETTIMER(),在另一个对话里无法对这个定时器进行处理。有什么办法能让几个对话框共用一个定时器吗?因为我的通信和数据解析都是后台进行的,我希望几个对话框都同步更新。我尝试过控件指针的方式在一个对话框里间接访问其他对话框,但是运行时会发生异常,不知道什么原因?
解决方案 »
  1. 可以这么做,,只用一个定时器,负责读数据, 然后将数据分发给(SendMessage or PostMessage)对话框.
      

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

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

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);
}

}
解决方案 »
  1. 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); 
      

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

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

  4. 在TimerTryDlg.h中定义,出现致命性错误是因为m_Dlg.DoModal() 产生的对话框窗口是局部的,你关闭它后,
    OnTime()如果会去画屏,就会出错,可在画屏前加入判断。
    if(!IsWindow(m_Dlg.m_hWnd))
      return;
    CWnd  *pWnd=m_Dlg.GetDlgItem(IDC_STATIC); 


               14.03.11

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值