- 浏览: 4199425 次
最新评论
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); } }
代码整体上通俗易懂,调用的都是很常见的函数,不多解释了。
相关推荐
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange...
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA...
功能: ... 特点: 1、动态填写提示信息,可在代码里修改;也可在控件资源里设置提示信息。 程序关键点: 1、函数:CAboutDlg::OnToolTipText() ...1、对话框里加好工具栏:CAboutDlg::OnInitDialog()
里面简要描述了编程计算器的简要过程CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
5:IDC_BUTTONFIVE 6:IDC_BUTTONSIX 1:C_BUTTONONE 2:IDC_BUTTONTWO 3:IDC_BUTTONTHREE 0:IDC_BUTTONZERO 清除按钮标识:IDC_BUTTONCLEAR 关于按钮标识:IDC_BUTTONABOUT 类的成员变量: class CCalcDlg : ...
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialog { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange...
C++学籍管理系统课程设计报告(含代码) LT 3.5修改密码功能及代码设计…………………………………………30 3.6删除功能及代码设计………………………………………………34 3.7修改功能及代码设计…………………………...
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA...
初学计算器 class CAboutDlg : ...// 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() };
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() /...
class CAboutDlg : public CDialog // *** 关于对话框 *** { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual ...
本例所述为使用VC编写的一个可以动态生成菜单项的类文件,...// 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialog { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUT
//自行添加的程序代码,目的是在初始化对话框的时候就自动显示出本地的ip地址 if(AfxSocketInit(NULL)==0) { AfxMessageBox("CSocket 初始化失败!"); } BYTE f0,f1,f2,f3; CString name; CClientSocket::...
2、MFC AppWizard是一个辅助我们生成源代码的向导工具,它可以帮助我们自动生成基于MFC框架的源代码 二、基于MFC的程序框架剖析 1、MFC程序的ClassView标签页(图) 2、继承关系 (1)CMainFrame继承于CFrameWnd (2)...
编写方法及详细解释见以下代码:#include "3DBar.h"public: CAboutDlg(); C3DBar bar;void CAboutDlg::OnPaint(){ CPaintDC dc(this); // device context for painting CRect rcClient; GetClientRect(&rc...
BOOL CModelRecognitionDlg::...// 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 自己写的,有点小BUG 基本功能实现
各种关于文件的操作在程序设计中是十分常见,如果能对其各种操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而在较短的时间内编写出高效的代码,因而熟练的掌握文件操作是十分重要的。本文将对Visual C++...
本系统由一个主对话框和5个功能对话框组成: 1. 主对话框IDD_GBLQ_DILOG,起菜单、控制作用; 2. 基本信息对话框IDD_JBXX,输入/输出应聘人员的基本信息; 基本信息包括:姓名、性别、出生年月、最后学历和任职...
// shujukuDlg.cpp : implementation file // #include "stdafx.h" #include "shujuku.h" #include "shujukuDlg.h...//读取数据库内容的代码 m_db.Close(); UpdateData(false); CDialog::OnTimer(nIDEvent); }
class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{...