YUV播放器中,显示界面(主窗口)和设置界面分离,所有参数均在Setting子窗口设置,故需要主窗口和子窗口中实现参数传递。下面是方法。
在主窗口CYUVPlayerDlg类中定义子窗口变量:
1
| CSettingDlg* m_pSettingDlg;
|
并在初始化时将其置为NULL:
显示子窗口较简单,主要是申请资源,调用Create函数,指定窗口ID即可。代码如下:
1 2 3 4 5 6 7 8 9 10 11
| void CYUVPlayerDlg::ShowSettingWindow() { // 非模态对话框 if (m_pSettingDlg == NULL) { m_pSettingDlg = new CSettingDlg(); m_pSettingDlg->Create(IDD_DIALOG_SETTING, this); }
m_pSettingDlg->ShowWindow(SW_SHOW); }
|
退出或析构函数要释放资源:
1 2 3 4 5
| if (m_pSettingDlg != NULL) { delete m_pSettingDlg; m_pSettingDlg = NULL; }
|
下面实现参数传递。
在CSettingDlg类中定义主窗口变量并赋值:
1 2
| CYUVPlayerDlg *m_pParentWnd; // 窗口参数传递 void SetParentWnd(CYUVPlayerDlg* pWnd) {m_pParentWnd = pWnd;}
|
当子窗口需要主动将参数传给主窗口时,则使用m_pParentWnd访问主窗口函数。如:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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(); }
|
这样,子窗口的值就传到主窗口中了。当主窗口需要拿子窗口数据时,也使用类似的方法。下面是子窗口的函数:
1 2 3 4 5 6 7 8
| 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窗口进行初始化,获取播放参数,代码如下:
1 2 3 4 5 6 7 8 9
| // 初始化 设置 对话框 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