`

Media Player Classic - HC 源代码分析 5:关于对话框 (CAboutDlg)

 
阅读更多

 

注:写了一系列分析Media Player Classic - HC 源代码的文章,在此列一个列表:

Media Player Classic - HC 源代码分析 1:整体结构
Media Player Classic - HC 源代码分析 2:核心类 (CMainFrame)(1)
Media Player Classic - HC 源代码分析 3:核心类 (CMainFrame)(2)
Media Player Classic - HC 源代码分析 4:核心类 (CMainFrame)(3)
Media Player Classic - HC 源代码分析 5:关于对话框 (CAboutDlg)
Media Player Classic - HC 源代码分析 6:MediaInfo选项卡 (CPPageFileMediaInfo)
Media Player Classic - HC 源代码分析 7:详细信息选项卡(CPPageFileInfoDetails)

前几篇文章分析了Media Player Classic - HC(mpc-hc)的核心类(CMainFrame):

Media Player Classic - HC 源代码分析 2:核心类 (CMainFrame)(1)

Media Player Classic - HC 源代码分析 3:核心类 (CMainFrame)(2)

Media Player Classic - HC 源代码分析 4:核心类 (CMainFrame)(3)

核心类已经分析的差不多了,现在可以看一看其他类的定义了。可是如此多的类,看看什么好呢?本着由易到难的原则,应该先看看“关于”对话框的代码。“关于”对话框作为mpc-hc系统的一部分,比较有代表性,而且代码相对来说十分简单,因而适合刚入门的人进行学习。

如图所示,“关于”对话框类的定义和实现都在最前面(因为开头是'A'......= =)。类的名字叫做CAboutDlg,定义位于AboutDlg.h,实现位于AboutDlg.cpp。

先看看“关于”对话框是什么样子的吧:

其实相比于其他的“关于”对话框来说,这个还算是一个相对比较复杂的。包含了编译器信息,版本等等信息。

CAboutDlg定义如下所示:

 

/*
 * (C) 2012 see Authors.txt
 *
 * This file is part of MPC-HC.
 *
 * MPC-HC is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * MPC-HC is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#pragma once

#include <afxwin.h>
#include "resource.h"

class CAboutDlg : public CDialog
{
    CStatic m_icon;

    CString m_appname;
    CString m_strBuildNumber;
    CString m_MPCCompiler;
#ifndef MPCHC_LITE
    CString m_FFmpegCompiler;
#endif
    CString m_credits;
    CString m_AuthorsPath;

public:
    CAboutDlg();

    virtual BOOL OnInitDialog();

    afx_msg void OnHomepage(NMHDR* pNMHDR, LRESULT* pResult);
    afx_msg void OnAuthors(NMHDR* pNMHDR, LRESULT* pResult);

    // Dialog Data
    //{{AFX_DATA(CAboutDlg)
    enum { IDD = IDD_ABOUTBOX };
    //}}AFX_DATA

    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CAboutDlg)
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

    // Implementation
protected:
    //{{AFX_MSG(CAboutDlg)
    // No message handlers
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};


从代码上来看。该对话框类和普通的MFC对话框类没有什么区别。不过这个“高端”的“关于”对话框确实包含了不少信息:mpc-hc版本,ffmpeg版本,编译器版本等等。这里就不再多说了,看看它类的实现部分的代码:

 

/*
 * (C) 2012-2013 see Authors.txt
 *
 * This file is part of MPC-HC.
 *
 * MPC-HC is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * MPC-HC is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#include "stdafx.h"
#include "AboutDlg.h"
#include "mpc-hc_config.h"
#ifndef MPCHC_LITE
#include "FGFilterLAV.h"
#endif
#include "mplayerc.h"
#include "version.h"
#include "SysVersion.h"
#include "WinAPIUtils.h"

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    , m_appname(_T(""))
    , m_strBuildNumber(_T(""))
    , m_MPCCompiler(_T(""))
#ifndef MPCHC_LITE
    , m_LAVFiltersVersion(_T(""))
#endif
{
    //{{AFX_DATA_INIT(CAboutDlg)
    //}}AFX_DATA_INIT
}
//初始化
BOOL CAboutDlg::OnInitDialog()
{
    // Get the default text before it is overwritten by the call to __super::OnInitDialog()
    GetDlgItem(IDC_STATIC1)->GetWindowText(m_appname);
    GetDlgItem(IDC_AUTHORS_LINK)->GetWindowText(m_credits);
#ifndef MPCHC_LITE
    GetDlgItem(IDC_LAVFILTERS_VERSION)->GetWindowText(m_LAVFiltersVersion);
#endif

    __super::OnInitDialog();

    // Because we set LR_SHARED, there is no need to explicitly destroy the icon
    m_icon.SetIcon((HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 48, 48, LR_SHARED));

#if MPC_BETA_RELEASE || _WIN64
    m_appname += _T(" (");
#endif

#if MPC_BETA_RELEASE
    m_appname += MPC_VERSION_BETA;
#endif

#if MPC_BETA_RELEASE && _WIN64
    m_appname += _T(", ");
#endif

#ifdef _WIN64
    m_appname += _T("64-bit");
#endif

#if MPC_BETA_RELEASE || _WIN64
    m_appname += _T(")");
#endif

#ifdef MPCHC_LITE
    m_appname += _T(" Lite");
#endif

    // Build the path to Authors.txt
    m_AuthorsPath = GetProgramPath() + _T("Authors.txt");
    // Check if the file exists
    if (FileExists(m_AuthorsPath)) {
        // If it does, we make the filename clickable
        m_credits.Replace(_T("Authors.txt"), _T("<a>Authors.txt</a>"));
    }

    m_homepage.Format(_T("<a>%s</a>"), WEBSITE_URL);

    m_strBuildNumber = MPC_VERSION_STR_FULL;

#if defined(__INTEL_COMPILER)
#if (__INTEL_COMPILER >= 1210)
    m_MPCCompiler = _T("ICL ") MAKE_STR(__INTEL_COMPILER) _T(" Build ") MAKE_STR(__INTEL_COMPILER_BUILD_DATE);
#else
#error Compiler is not supported!
#endif
#elif defined(_MSC_VER)
#if (_MSC_VER == 1700) // 2012
#if (_MSC_FULL_VER == 170060610)
    m_MPCCompiler = _T("MSVC 2012 Update 3");
#elif (_MSC_FULL_VER == 170060315)  // MSVC 2012 Update 2
#error VS2012 Update 2 is not supported because the binaries will not run on XP. Install Update 3 instead.
#elif (_MSC_FULL_VER == 170051106)
    m_MPCCompiler = _T("MSVC 2012 Update 1");
#elif (_MSC_FULL_VER < 170050727)   // MSVC 2012
#error Please install the latest Update for VS2012.
#else
    m_MPCCompiler = _T("MSVC 2012");
#endif
#elif (_MSC_VER == 1600) // 2010
#if (_MSC_FULL_VER >= 160040219)
    m_MPCCompiler = _T("MSVC 2010 SP1");
#else
    m_MPCCompiler = _T("MSVC 2010");
#endif
#elif (_MSC_VER < 1600)
#error Compiler is not supported!
#endif
#else
#error Please add support for your compiler
#endif

#if (__AVX__)
    m_MPCCompiler += _T(" (AVX)");
#elif (__SSSE3__)
    m_MPCCompiler += _T(" (SSSE3)");
#elif (__SSE3__)
    m_MPCCompiler += _T(" (SSE3)");
#elif !defined(_M_X64) && defined(_M_IX86_FP)
#if (_M_IX86_FP == 2)   // /arch:SSE2 was used
    m_MPCCompiler += _T(" (SSE2)");
#elif (_M_IX86_FP == 1) // /arch:SSE was used
    m_MPCCompiler += _T(" (SSE)");
#endif
#endif

#ifdef _DEBUG
    m_MPCCompiler += _T(" Debug");
#endif

#ifndef MPCHC_LITE
	//版本
    CString LAVFiltersVersion = CFGFilterLAV::GetVersion();
    if (!LAVFiltersVersion.IsEmpty()) {
        m_LAVFiltersVersion = LAVFiltersVersion;
    }
#endif

    m_buildDate = _T(__DATE__) _T(" ") _T(__TIME__);

    OSVERSIONINFOEX osVersion = SysVersion::GetFullVersion();
    m_OSName.Format(_T("Windows NT %1u.%1u (build %u"),
                    osVersion.dwMajorVersion, osVersion.dwMinorVersion, osVersion.dwBuildNumber);
    if (osVersion.szCSDVersion[0]) {
        m_OSName.AppendFormat(_T(", %s)"), osVersion.szCSDVersion);
    } else {
        m_OSName += _T(")");
    }
    m_OSVersion.Format(_T("%1u.%1u"), osVersion.dwMajorVersion, osVersion.dwMinorVersion);
    if (SysVersion::Is64Bit()) {
        m_OSVersion += _T(" (64-bit)");
    }

    UpdateData(FALSE);

    GetDlgItem(IDOK)->SetFocus();

    return FALSE;
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CAboutDlg)
    //}}AFX_DATA_MAP
    DDX_Control(pDX, IDR_MAINFRAME, m_icon);
    DDX_Text(pDX, IDC_STATIC1, m_appname);
    DDX_Text(pDX, IDC_AUTHORS_LINK, m_credits);
    DDX_Text(pDX, IDC_HOMEPAGE_LINK, m_homepage);
    DDX_Text(pDX, IDC_VERSION, m_strBuildNumber);
    DDX_Text(pDX, IDC_MPC_COMPILER, m_MPCCompiler);
#ifndef MPCHC_LITE
    DDX_Text(pDX, IDC_LAVFILTERS_VERSION, m_LAVFiltersVersion);
#endif
    DDX_Text(pDX, IDC_STATIC2, m_buildDate);
    DDX_Text(pDX, IDC_STATIC3, m_OSName);
    DDX_Text(pDX, IDC_STATIC4, m_OSVersion);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    //{{AFX_MSG_MAP(CAboutDlg)
    // No message handlers
    //}}AFX_MSG_MAP
    ON_NOTIFY(NM_CLICK, IDC_HOMEPAGE_LINK, OnHomepage)
    ON_NOTIFY(NM_CLICK, IDC_AUTHORS_LINK, OnAuthors)
    ON_BN_CLICKED(IDC_BUTTON1, OnCopyToClipboard)
END_MESSAGE_MAP()

void CAboutDlg::OnHomepage(NMHDR* pNMHDR, LRESULT* pResult)
{
    ShellExecute(m_hWnd, _T("open"), WEBSITE_URL, nullptr, nullptr, SW_SHOWDEFAULT);
    *pResult = 0;
}

void CAboutDlg::OnAuthors(NMHDR* pNMHDR, LRESULT* pResult)
{
    ShellExecute(m_hWnd, _T("open"), m_AuthorsPath, nullptr, nullptr, SW_SHOWDEFAULT);
    *pResult = 0;
}
//拷贝到剪切板
void CAboutDlg::OnCopyToClipboard()
{
	//把各种信息添加到一个字符串中
    CStringW info = m_appname;
    info += _T("\n----------------------------------\n\n");
    info += _T("Build information:\n");
    info += _T("    Version:            ") + m_strBuildNumber + _T("\n");
    info += _T("    MPC-HC compiler:    ") + m_MPCCompiler + _T("\n");
    info += _T("    Build date:         ") + m_buildDate + _T("\n\n");
#ifndef MPCHC_LITE
    info += _T("LAV Filters:\n");
    info += _T("    LAV Splitter:       ") + CFGFilterLAV::GetVersion(CFGFilterLAV::SPLITTER) + _T("\n");
    info += _T("    LAV Video:          ") + CFGFilterLAV::GetVersion(CFGFilterLAV::VIDEO_DECODER) + _T("\n");
    info += _T("    LAV Audio:          ") + CFGFilterLAV::GetVersion(CFGFilterLAV::AUDIO_DECODER) + _T("\n\n");
#endif
    info += _T("Operating system:\n");
    info += _T("    Name:               ") + m_OSName + _T("\n");
    info += _T("    Version:            ") + m_OSVersion + _T("\n");

    COleDataSource* pData = DEBUG_NEW COleDataSource();

    int len = info.GetLength() + 1;
    HGLOBAL hGlob = GlobalAlloc(GMEM_FIXED, len * sizeof(WCHAR));

    if (pData && hGlob) {
        wcscpy_s((WCHAR*)hGlob, len, (LPCWSTR)info);

        pData->CacheGlobalData(CF_UNICODETEXT, hGlob);

        // The system will take care of removing the allocated memory
        pData->SetClipboard();
    } else if (pData) {
        delete pData;
    } else if (hGlob) {
        GlobalFree(hGlob);
    }
}



 

 

 

代码整体上通俗易懂,调用的都是很常见的函数,不多解释了。

 

 

分享到:
评论

相关推荐

    基于http客户端下载程序设计

    `CAboutDlg` 类用于显示关于对话框,通常包含软件的版本信息、版权声明等。 - **成员变量**:无特殊成员变量。 - **构造函数**:`CAboutDlg()` 初始化关于对话框。 - **DoDataExchange()**:实现对话框数据交换。 ...

    windows编程基础——对话框2

    - **`CAboutDlg`类**:继承自`CDialog`,通常用于显示关于对话框的信息。 #### 六、对话框应用程序的开发步骤 1. **设计对话框模板资源**:使用Visual Studio等IDE中的资源编辑器来设计对话框模板。 2. **为对话框...

    MFC教职工管理系统代码

    根据提供的文件信息,我们可以总结出以下关于“MFC教职工管理系统代码”的相关知识点: ### 一、项目概述 #### 1.1 标题解析 - **MFC教职工管理系统代码**:该标题指明了这是一个使用Microsoft Foundation Classes...

    Windows编程基础——对话框

    - `CAboutDlg`:同样继承自`CDialog`类,通常用于显示关于对话框。 #### 六、对话框应用程序的开发过程 开发一个基本的对话框应用程序通常包括以下几个步骤: 1. **设计对话框模板资源**:使用资源编辑器来设计...

    用C++编写音乐播放器

    - **CAboutDlg**:关于对话框类,显示软件相关信息。 2. **创建项目** - 打开Visual C++ 6.0,通过“文件”→“新建”菜单创建一个新的MFC应用程序项目。 - 在“MFC AppWizard(exe)”向导中,选择“基本对话框”...

    calc

    - `CAboutDlg`:关于对话框类,用于显示应用程序的关于信息。 - `CCalcDlg`:主计算器对话框类,包含计算器的主要功能。 - **成员函数**: - `CAboutDlg::CAboutDlg()`:构造函数。 - `CAboutDlg::...

    vc++文件加密程序软件

    `CAboutDlg` 类主要用于显示关于对话框的信息,提供应用程序的基本介绍等。此类包含了一个简单的构造函数和 `DoDataExchange` 方法,用于处理数据交换。 - **构造函数**: `CAboutDlg::CAboutDlg()` 初始化对话框。 ...

    基于VC的串口通信程序源代码

    给定的源代码片段展示了基于VC的串口通信程序的一部分,其中包含了对话框类`CChuankouDlg`和`CAboutDlg`的定义与实现。以下是对关键部分的详细解析: #### CAAboutDlg类 该类主要用于显示关于对话框,即应用程序的...

    VC6.0为对话框添加菜单

    这里的CAboutDlg是关于对话框的类,DoModal()函数用于显示模态对话框。 5. **添加右键菜单**: - 为对话框增加对WM_CONTEXTMENU消息的响应,这会在用户右键点击对话框时触发。 - 在消息/事件列表中选择WM_...

    软件实习报告

    例如,可以看到`CAboutDlg`类用于展示关于对话框的信息等。 综上所述,这份软件实习报告不仅涵盖了理论知识的学习,还通过实践项目加深了对B/S架构的理解,尤其是对于FTP客户端的设计与实现有了较为深入的认识。这...

    mfc视频播放器代码

    **关于对话框(CAboutDlg)** 这部分代码定义了一个名为`CAboutDlg`的类,继承自`CDialog`。主要用于显示软件的“关于”信息。 - `DoDataExchange`:实现数据交换功能,即从对话框获取数据或将数据写入对话框。 -...

    讲座三-VS2010(MFC)编程-对话框(加法计算器) (2).pdf

    完成以上步骤后,你会看到解决方案资源管理器中包含的类:CAboutDlg(关于对话框类)、CAdditionApp(派生自CWinApp的应用程序类)和CAdditionDlg(主对话框类)。 2. **对话框模板**: - 在“Resource View”中,...

    MFC基于对话框基础程序解析

    - **CAboutDlg**:这是一个用于显示关于对话框的类,通常包含应用程序的版权信息、版本号等。 - **CDialogDlg**:这是用户自定义的对话框类,负责展示应用程序的主要界面和交互逻辑。 #### MFC中的主应用程序类:...

    文件加密C++源代码

    ### 文件加密C++源代码分析 #### 一、概述 本文档主要介绍了一份关于文件加密的C++源代码。这份代码实现了对文件的基本加密与解密功能,采用的是AES(Advanced Encryption Standard)加密算法。AES是一种对称加密...

    MFC单文档应用程序实例

    * CAboutDlg:关于对话框类 * CMainFrame:主框架窗口类 * CXxxApp:应用程序类 * CXxxDoc:文档类 * CXxxView:视类 每个类的主要函数: * CAboutDlg::DoDataExchange:数据交换函数 * CMainFrame::OnCreate:...

    讲座三-VS2010(MFC)编程-对话框(加法计算器).pdf

    完成以上步骤后,工程将包含三个主要类:CAboutDlg(关于对话框类),CAdditionApp(应用程序主类,继承自CWinApp),以及CAdditionDlg(主对话框类)。 2. 修改对话框属性: - 在“Resource View”中,可以看到...

    C++编程-时钟程序.doc

    - `CAboutDlg`:这是一个关于对话框的类,用于显示程序的版权信息或其他相关信息。它继承自`CDialog`类,并通过`DECLARE_MESSAGE_MAP`和`BEGIN_MESSAGE_MAP`宏定义了消息映射,用于处理对话框中的事件。 - `CClock...

Global site tag (gtag.js) - Google Analytics