我的YUV播放器MFC小笔记:非模态对话框建立及窗口间传值
YUV播放器中,显示界面(主窗口)和设置界面分离,所有参数均在Setting子窗口设置,故需要主窗口和子窗口中实现参数传递。下面是方法。
1、
在主窗口CYUVPlayerDlg类中定义子窗口变量:
CSettingDlg* m_pSettingDlg;
并在初始化时将其置为NULL:
m_pSettingDlg = NULL;
显示子窗口较简单,主要是申请资源,调用Create函数,指定窗口ID即可。代码如下:
void CYUVPlayerDlg::ShowSettingWindow() { // 非模态对话框 if (m_pSettingDlg == NULL) { m_pSettingDlg = new CSettingDlg(); m_pSettingDlg->Create(IDD_DIALOG_SETTING, this); } m_pSettingDlg->ShowWindow(SW_SHOW); }
退出或析构函数要释放资源:
if (m_pSettingDlg != NULL) { delete m_pSettingDlg; m_pSettingDlg = NULL; }
下面实现参数传递。
在CSettingDlg类中定义主窗口变量并赋值:
CYUVPlayerDlg *m_pParentWnd; // 窗口参数传递 void SetParentWnd(CYUVPlayerDlg* pWnd) {m_pParentWnd = pWnd;}
当子窗口需要主动将参数传给主窗口时,则使用m_pParentWnd访问主窗口函数。如:
void CYUVPlayerDlg::SetParentParameters(int width, int height, int fps, int fmt, BOOL loop) { m_nWidth = width; m_nHeight = height; m_nFps = fps; m_nYuvFormat = fmt; m_fLoop = loop; // 恢复原始状态 if (!IsOpen()) return; ShowOpenedFrame(); }
这样,子窗口的值就传到主窗口中了。当主窗口需要拿子窗口数据时,也使用类似的方法。下面是子窗口的函数:
void SetParametersToParentWnd(int& width, int& height, int& fps, int& fmt, BOOL& loop) { width = m_nWidth; height = m_nHeight; fps = m_nFps; fmt = m_nYuvFormat; loop = m_fLoop; }
当主窗口需要子窗口参数时,比如在主窗口的初始化时对Setting窗口进行初始化,获取播放参数,代码如下:
// 初始化 设置 对话框 if (m_pSettingDlg == NULL) { m_pSettingDlg = new CSettingDlg(); m_pSettingDlg->Create(IDD_DIALOG_SETTING, this); m_pSettingDlg->SetParentWnd(this); // 将子窗口的值传递给本窗口 m_pSettingDlg->SetParametersToParentWnd(m_nWidth, m_nHeight, m_nFps, m_nYuvFormat, m_fLoop); }
李迟 2015.8.15
如果本文对阁下有帮助,可赞助笔者以输出更多好文章。
支付宝[email protected] 或 微信fly_camel_fly 均可。感谢!
本文固定链接: /programming-under-windows/yuvplayer-modeless-dialog-box.html