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);
}
}
代码整体上通俗易懂,调用的都是很常见的函数,不多解释了。
Media Player Classic - HC 源代码分析 5:关于对话框 (CAboutDlg)的更多相关文章
- Media Player Classic - HC 源代码分析 7:详细信息选项卡(CPPageFileInfoDetails)
===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...
- Media Player Classic - HC 源代码分析 6:MediaInfo选项卡 (CPPageFileMediaInfo)
===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...
- Media Player Classic - HC 源代码分析 4:核心类 (CMainFrame)(3)
===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...
- Media Player Classic - HC 源代码分析 3:核心类 (CMainFrame)(2)
===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...
- Media Player Classic - HC 源代码分析 2:核心类 (CMainFrame)(1)
===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...
- Media Player Classic - HC 源代码分析 1:整体结构
===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...
- 转:Media Player Classic - HC 源代码分析
VC2010 编译 Media Player Classic - Home Cinema (mpc-hc) Media Player Classic - Home Cinema (mpc-hc)播放器 ...
- MediaInfo源代码分析 1:整体结构
MediaInfo 用来分析视频和音频文件的编码和内容信息,是一款是自由软件 (免费使用.免费获得源代码).之前编程的时候,都是直接调用它提供的Dll,这次突然来了兴趣,想研究一下它内部究竟是怎么实现 ...
- CVE-2012-0003 Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞 分析
[CNNVD]Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞(CNNVD-201201-110) Microsoft Wi ...
随机推荐
- 网络爬虫框架Scrapy简介
作者: 黄进(QQ:7149101) 一. 网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本:它是一个自动提取网页的程序,它为搜索引擎从万维 ...
- Leetcode解题-链表(2.2.0)基础类
1 基类的作用 在开始练习LeetCode链表部分的习题之前,首先创建好一个Solution基类,其作用就是: Ø 规定好每个子Solution都要实现纯虚函数test做测试: Ø 提供了List ...
- Dynamics CRM2013 从subgrid中打开快速创建窗体创建数据
在页面上使用subgrid时,在subgrid中新建数据时需要跳转到另一个页面,这种操作比较麻烦且很不友好,这时我们想到了快速创建窗体,像下图这样直接在当前页上方下拉出现一个窗体,填写内容后点击保存就 ...
- tomcat自动运行磁盘任意位置上的项目、使用Maven对tomcat进行自动部署
对于非Maven的web项目,有时候我们想不时常通过打war包.拷贝war包.启动tomcat来运行项目.这时候我们可以通过以下方式来进行配置: 1.1:创建web工程.工程结构如下: 1.2. ...
- Linux--NFS和DHCP服务器
(1) 在网络中,时常需要进行文件的共享,如果都是在Linux系统下,可以使用NFS 来搭建文件服务器,达到文件共享的目的. (2) 在网络管理中,为了防止IP 冲突和盗用,有效的控制IP 资源 ...
- scala for spark
写了点scala的内容,方便看spark源码,估计一两天就能看完,内容比较粗浅. 下载地址: http://download.csdn.net/detail/lsshlsw/7983541
- Xcode7.2使用sqlite3数据库的方法
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 之前版本的Xcode是可以直接连接sqlite3的库文件的,但 ...
- 消息字节——MessageBytes
在tomcat核心处理中有这么一个需求--"为了提高编码性能,对于socket接收到的字节流不马上进行某种编码的转码,而是应该保留字节流的形式,在需要时.在指定编码时才进行转码工作" ...
- Linux下多线程编程遇到的一些问题
今天在学习了Linux的多线程编程的基础的知识点.于是就试着做了一个简单的Demo.本以为会得到预期的结果.不成想却遇到了意想不到的问题. 代码展示 我的C 代码很简单,就是一个简单的示例程序,如下: ...
- tomcat服务器虚拟目录的映射方式
lWEB应用程序指供浏览器问的程序,通常也简称为web应用 l l一个web应用由多个静态web资源和动态web资源组成,如: •html.css.js文件 •jsp文件.servlet程序.支持ja ...