我的YUV播放器MFC小笔记:非模态对话框建立及窗口间传值

YUV播放器中,显示界面(主窗口)和设置界面分离,所有参数均在Setting子窗口设置,故需要主窗口和子窗口中实现参数传递。下面是方法。

在主窗口CYUVPlayerDlg类中定义子窗口变量:

1
CSettingDlg* m_pSettingDlg;

并在初始化时将其置为NULL:

1
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