当前位置: 首页 > Windows程序, 业余研究 > 正文

我的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

本文固定链接: http://www.latelee.org/programming-under-windows/yuvplayer-modeless-dialog-box.html

目前暂无评论

发表评论

*

快捷键:Ctrl+Enter