这篇文章展示了如何使用更新模态对话框的内容 一个回调函数。 一些背景知识。当开发通信应用程序时,it 是否需要显示包含一些信息的模态对话框 关于后台发生了什么(统计信息、通信状态) 等等)。最常见的解决方案是通过所有的知识背景 进程(es)到模态对话框,然后使用计时器定期更新 对话框的内容控制。这个解决方案是可以的,但是比较复杂 这种对话框的设计使得它很难有通用的 根据地点显示不同类型信息的对话框 它的创建位置。这种解决方案的重要副作用是 需要提供对后台进程类的所有数据成员的访问 或需要声明所有数据成员为公共。两个选项 使源代码复杂化。 这里给出的解决方案使用一个给对话框的回调函数 通过它的构造函数。回调函数是属于的成员函数 到CWnd派生类(完全相同的技术可以用于 属于CObject派生类的回调函数)。的责任 在对话框中创建一个计时器,并定期(从OnTimer() 调用提供的回调函数。对话可以提供一些信息 返回回调函数。它将从回调函数收集dta 并使用它更新其控件的内容。与寻常相反 解决方案,只有回调函数需要访问 后台进程,因为它是一个回调函数,也可以 成为后台过程的一部分。 这种设计降低了对话框的复杂性,并启用了通用 对话框显示不同类型的信息,使用不同类型的 回调函数。另一个重要的副作用是应用程序 设计更简单,更健壮。 首先,我们需要创建一个回调函数类型: 隐藏,复制Code
typedef BOOL (CWnd::*TWindowUpdate)(int& nCount, CString& sText, DWORD dwData);
这个函数的参数是特定于应用程序的。然后我们修改 对话框的构造函数: 隐藏,复制Code
// pWindow is a pointer to the CWnd derived object that implements the callback function TTestDialog(TWindowUpdate pUpdateCallback, CWnd *pWindow, DWORD dwData = 0, CWnd* pParent = NULL) // standard constructor
最后,我们调用回调函数(通常来自OnTimer()处理程序)。 隐藏,复制Code
if (m_pWindow && m_pWindowUpdateCallback) { int nCount = 0; CString str; if ((m_pWindow->*m_pWindowUpdateCallback)(nCount, str, m_dwData)) { CString strTemp; strTemp.Format("%d", nCount); m_ItemCount.SetWindowText(strTemp); m_LastItem.SetWindowText(str); } }
回调函数在CWnd派生窗口(主框架、视图等)中实现。 本文转载于:http://www.diyabc.com/frontweb/news10749.html