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
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
多个对话框可以共用一个定时器吗?
各位,我有这样一个问题:我要做一个多对话框的工程,里面有两个以上的对话框,后台有一个线程进行串口通信,每个对话框都会根据读入串口的内容进行更新。比如一个对话框显示数据,一个对话框绘制波形。我的通信会采用定时方式,比如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
相关文章推荐
- DebugDraw
- SHELL 脚本
- 黑马程序员___ final关键字
- SQL SERVER 2005 只有mdf文件的数据恢复方法
- Google搜索技巧-从入门到精通(从此学习进步、工作顺心)
- 解决APK安装成功后点击"打开"再按Home键遇到的问题
- LeetCode Reverse Integer
- nyoj-308-Substring
- CareerCup the Lexicographically Smallest Permutation
- 解决"emulator-5554 disconnected"问题
- google使用技巧
- ios 手动添加mapview
- 锐捷奖品
- HDOJ2035 人见人爱A^B 二分法
- Plus One
- HDU 2187 A sequence of numbers
- HDOJ2035 人见人爱A^B 二分法
- 转载 SPARSE列的使用
- ubuntu下安装Apache+PHP+Mysql
- Java操作properties文件