xref: /MusicPlayer2/MusicPlayer2/AboutDlg.cpp (revision f7b792b9060cc61181aa6630454c6ceb8ebcf026)
1 #include "stdafx.h"
2 #include "MusicPlayer2.h"
3 #include "AboutDlg.h"
4 #include "CDonateDlg.h"
5 #include "MessageDlg.h"
6 
CAboutDlg()7 CAboutDlg::CAboutDlg()
8     : CBaseDialog(IDD_ABOUTBOX)
9 {
10 }
11 
~CAboutDlg()12 CAboutDlg::~CAboutDlg()
13 {
14 }
15 
GetDialogName() const16 CString CAboutDlg::GetDialogName() const
17 {
18     return L"AboutDlg";
19 }
20 
InitializeControls()21 bool CAboutDlg::InitializeControls()
22 {
23     wstring temp;
24     temp = theApp.m_str_table.LoadText(L"TITLE_ABOUTBOX");
25     SetWindowTextW(temp.c_str());
26     temp = L"MusicPlayer2,V" APP_VERSION;
27 
28 #ifdef COMPILE_IN_WIN_XP
29     temp += L" (For WinXP)";
30 #endif // COMPILE_FOR_WINXP
31 
32 #ifdef _M_X64
33     temp += L" (x64)";
34 #endif
35 
36 #ifdef _DEBUG
37     temp += L" (Debug)";
38 #endif
39 
40     wstring time_str, hash_str;
41     CCommon::GetLastCompileTime(time_str, hash_str);
42     if (!hash_str.empty())
43         temp += L"   (" + hash_str + L")";
44 
45     SetDlgItemTextW(IDC_STATIC_VERSION, temp.c_str());
46     temp = L"Copyright (C) 2017-" COPY_RIGHT_YEAR L" By ZhongYang\r\n";
47     temp += theApp.m_str_table.LoadTextFormat(L"TXT_ABOUTBOX_LAST_BUILD_DATE", { time_str });
48     SetDlgItemTextW(IDC_STATIC_COPYRIGHT, temp.c_str());
49     temp = theApp.m_str_table.LoadText(L"TXT_ABOUTBOX_THIRD_PARTY_LIB");
50     SetDlgItemTextW(IDC_STATIC_THIRD_PARTY_LIB, temp.c_str());
51     temp = theApp.m_str_table.LoadText(L"TXT_ABOUTBOX_OTHER_SOFTWARE");
52     SetDlgItemTextW(IDC_STATIC_OTHER_SOFTWARE, temp.c_str());
53     temp = L"<a>" + theApp.m_str_table.LoadText(L"TXT_ABOUTBOX_CONTACT_AUTHOR") + L"</a>";
54     SetDlgItemTextW(IDC_SYSLINK1, temp.c_str());
55     temp = L"<a>" + theApp.m_str_table.LoadText(L"TXT_ABOUTBOX_CHECK_UPDATE") + L"</a>";
56     SetDlgItemTextW(IDC_SYSLINK2, temp.c_str());
57     temp = L"<a>" + theApp.m_str_table.LoadText(L"TXT_ABOUTBOX_GITHUB") + L"</a>";
58     SetDlgItemTextW(IDC_GITHUB_SYSLINK, temp.c_str());
59     temp = L"<a>" + theApp.m_str_table.LoadText(L"TXT_ABOUTBOX_LICENSE") + L"</a>";
60     SetDlgItemTextW(IDC_LICENSE_SYSLINK, temp.c_str());
61     temp = L"<a>" + theApp.m_str_table.LoadText(L"TXT_ABOUTBOX_DONATE") + L"</a>";
62     SetDlgItemTextW(IDC_DONATE_SYSLINK, temp.c_str());
63     temp = L"<a>" + theApp.m_str_table.LoadText(L"TXT_ABOUTBOX_ACKNOWLEDGEMENT") + L"</a>";
64     SetDlgItemTextW(IDC_ACKNOWLEDGEMENT_SYSLINK, temp.c_str());
65     temp = theApp.m_str_table.LoadText(L"TXT_OK");
66     SetDlgItemTextW(IDOK, temp.c_str());
67 
68     RepositionTextBasedControls({
69         { CtrlTextInfo::L3, IDC_SYSLINK1, CtrlTextInfo::W_50 },
70         { CtrlTextInfo::L2, IDC_SYSLINK2, CtrlTextInfo::W_50 },
71         { CtrlTextInfo::L1, IDC_GITHUB_SYSLINK, CtrlTextInfo::W_50 },
72         { CtrlTextInfo::L3, IDC_LICENSE_SYSLINK, CtrlTextInfo::W_50 },
73         { CtrlTextInfo::L2, IDC_DONATE_SYSLINK, CtrlTextInfo::W_50 },
74         { CtrlTextInfo::L1, IDC_ACKNOWLEDGEMENT_SYSLINK, CtrlTextInfo::W_50 }
75         });
76 
77     return true;
78 }
79 
DoDataExchange(CDataExchange * pDX)80 void CAboutDlg::DoDataExchange(CDataExchange* pDX)
81 {
82     CBaseDialog::DoDataExchange(pDX);
83 }
84 
BEGIN_MESSAGE_MAP(CAboutDlg,CBaseDialog)85 BEGIN_MESSAGE_MAP(CAboutDlg, CBaseDialog)
86     ON_NOTIFY(NM_CLICK, IDC_SYSLINK1, &CAboutDlg::OnNMClickSyslink1)
87     ON_NOTIFY(NM_CLICK, IDC_SYSLINK2, &CAboutDlg::OnNMClickSyslink2)
88     ON_NOTIFY(NM_CLICK, IDC_GITHUB_SYSLINK, &CAboutDlg::OnNMClickGithubSyslink)
89     ON_NOTIFY(NM_CLICK, IDC_DONATE_SYSLINK, &CAboutDlg::OnNMClickDonateSyslink)
90     ON_WM_PAINT()
91     ON_NOTIFY(NM_CLICK, IDC_LICENSE_SYSLINK, &CAboutDlg::OnNMClickLicenseSyslink)
92     ON_WM_ERASEBKGND()
93     ON_WM_CTLCOLOR()
94     ON_NOTIFY(NM_CLICK, IDC_SYSLINK_BASS, &CAboutDlg::OnNMClickSyslinkBass)
95     ON_NOTIFY(NM_CLICK, IDC_SYSLINK_TAGLIB, &CAboutDlg::OnNMClickSyslinkTaglib)
96     ON_NOTIFY(NM_CLICK, IDC_SYSLINK_TINYXML2, &CAboutDlg::OnNMClickSyslinkTinyxml2)
97     ON_NOTIFY(NM_CLICK, IDC_SYSLINK_SCINTILLA, &CAboutDlg::OnNMClickSyslinkScintilla)
98     ON_NOTIFY(NM_CLICK, IDC_SYSLINK_TRAFFICMONITOR, &CAboutDlg::OnNMClickSyslinkTrafficmonitor)
99     ON_NOTIFY(NM_CLICK, IDC_SYSLINK_SIMPLENOTEPAD, &CAboutDlg::OnNMClickSyslinkSimplenotepad)
100     ON_NOTIFY(NM_CLICK, IDC_ACKNOWLEDGEMENT_SYSLINK, &CAboutDlg::OnNMClickAcknowledgementSyslink)
101 END_MESSAGE_MAP()
102 
103 BOOL CAboutDlg::OnInitDialog()
104 {
105     CBaseDialog::OnInitDialog();
106 
107     // 设置背景色为白色,为使用CBaseDialog::OnCtlColor需要此初始化
108     SetBackgroundColor(GetSysColor(COLOR_WINDOW));
109 
110     m_tool_tip.Create(this);
111     m_tool_tip.AddTool(GetDlgItem(IDC_SYSLINK1), (theApp.m_str_table.LoadText(L"TIP_ABOUTBOX_SEND_EMAIL_TO_AUTHOR") + L"\r\nmailto:[email protected]").c_str());
112     m_tool_tip.AddTool(GetDlgItem(IDC_GITHUB_SYSLINK), (theApp.m_str_table.LoadText(L"TIP_ABOUTBOX_GOTO_GITHUB") + L"\r\nhttps://github.com/zhongyang219/MusicPlayer2").c_str());
113     m_tool_tip.AddTool(GetDlgItem(IDC_SYSLINK_BASS), L"http://www.un4seen.com/bass.html");
114     m_tool_tip.AddTool(GetDlgItem(IDC_SYSLINK_TAGLIB), L"http://taglib.org/");
115     m_tool_tip.AddTool(GetDlgItem(IDC_SYSLINK_TINYXML2), L"https://github.com/leethomason/tinyxml2");
116     m_tool_tip.AddTool(GetDlgItem(IDC_SYSLINK_SCINTILLA), L"https://www.scintilla.org/index.html");
117     m_tool_tip.AddTool(GetDlgItem(IDC_SYSLINK_TRAFFICMONITOR), (theApp.m_str_table.LoadText(L"TIP_ABOUTBOX_TRAFFICMONITOR_DESCRIPTION") + L"\r\nhttps://github.com/zhongyang219/TrafficMonitor").c_str());
118     m_tool_tip.AddTool(GetDlgItem(IDC_SYSLINK_SIMPLENOTEPAD), (theApp.m_str_table.LoadText(L"TIP_ABOUTBOX_SIMPLENOTEPAD_DESCRIPTION") + L"\r\nhttps://github.com/zhongyang219/SimpleNotePad").c_str());
119     m_tool_tip.SetDelayTime(300);   //设置延迟
120     m_tool_tip.SetMaxTipWidth(theApp.DPI(400));
121 
122     //设置图片的位置
123     CRect rect;
124     GetClientRect(rect);
125     m_rc_pic = rect;
126     ::GetWindowRect(GetDlgItem(IDC_STATIC_VERSION)->GetSafeHwnd(), rect);
127     ScreenToClient(rect);
128     m_rc_pic.bottom = rect.top - theApp.DPI(6);
129     if (m_rc_pic.Height() <= 0)
130         m_rc_pic.bottom = m_rc_pic.top + theApp.DPI(50);
131     // 计算背景白色区域高度
132     ::GetWindowRect(GetDlgItem(IDOK)->GetSafeHwnd(), rect);
133     ScreenToClient(rect);
134     m_white_height = rect.top - theApp.DPI(8);
135 
136     //载入图片
137     m_about_pic.LoadFromResource(AfxGetResourceHandle(), IDB_DEFAULT_COVER);
138 
139     return TRUE;  // return TRUE unless you set the focus to a control
140                   // 异常: OCX 属性页应返回 FALSE
141 }
142 
OnNMClickSyslink1(NMHDR * pNMHDR,LRESULT * pResult)143 void CAboutDlg::OnNMClickSyslink1(NMHDR* pNMHDR, LRESULT* pResult)
144 {
145     // TODO: 在此添加控件通知处理程序代码
146     //点击了“联系作者”
147     ShellExecute(NULL, _T("open"), _T("mailto:[email protected]"), NULL, NULL, SW_SHOW); //打开超链接
148     *pResult = 0;
149 }
150 
OnNMClickSyslink2(NMHDR * pNMHDR,LRESULT * pResult)151 void CAboutDlg::OnNMClickSyslink2(NMHDR* pNMHDR, LRESULT* pResult)
152 {
153     // TODO: 在此添加控件通知处理程序代码
154     //点击了“检查更新”
155     theApp.CheckUpdateInThread(true);
156     *pResult = 0;
157 }
158 
OnNMClickGithubSyslink(NMHDR * pNMHDR,LRESULT * pResult)159 void CAboutDlg::OnNMClickGithubSyslink(NMHDR* pNMHDR, LRESULT* pResult)
160 {
161     // TODO: 在此添加控件通知处理程序代码
162     ShellExecute(NULL, _T("open"), _T("https://github.com/zhongyang219/MusicPlayer2/"), NULL, NULL, SW_SHOW);   //打开超链接
163     *pResult = 0;
164 }
165 
PreTranslateMessage(MSG * pMsg)166 BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg)
167 {
168     // TODO: 在此添加专用代码和/或调用基类
169     if (pMsg->message == WM_MOUSEMOVE)
170         m_tool_tip.RelayEvent(pMsg);
171 
172 
173     //if (pMsg->message == WM_KEYDOWN)
174     //{
175     //  if ((GetKeyState(VK_CONTROL) & 0x80) && (GetKeyState(VK_SHIFT) & 0x8000) && pMsg->wParam == 'Z')
176     //  {
177     //      CTest::Test();
178     //  }
179     //}
180 
181 
182     return CBaseDialog::PreTranslateMessage(pMsg);
183 }
184 
185 
186 
OnNMClickDonateSyslink(NMHDR * pNMHDR,LRESULT * pResult)187 void CAboutDlg::OnNMClickDonateSyslink(NMHDR* pNMHDR, LRESULT* pResult)
188 {
189     // TODO: 在此添加控件通知处理程序代码
190     CDonateDlg dlg;
191     dlg.DoModal();
192 
193     *pResult = 0;
194 }
195 
196 
OnPaint()197 void CAboutDlg::OnPaint()
198 {
199     CPaintDC dc(this); // device context for painting
200                        // TODO: 在此处添加消息处理程序代码
201                        // 不为绘图消息调用 CBaseDialog::OnPaint()
202     CDrawCommon draw;
203     draw.Create(&dc);
204     //填充背景
205     draw.GetDC()->FillSolidRect(m_rc_pic, RGB(212, 230, 255));
206 
207     //画背景图
208     CSize img_size{ m_about_pic.GetWidth(), m_about_pic.GetHeight() };
209     draw.DrawImage(m_about_pic, m_rc_pic.TopLeft(), m_rc_pic.Size(), CDrawCommon::StretchMode::FILL);
210 }
211 
212 
OnNMClickLicenseSyslink(NMHDR * pNMHDR,LRESULT * pResult)213 void CAboutDlg::OnNMClickLicenseSyslink(NMHDR* pNMHDR, LRESULT* pResult)
214 {
215     // TODO: 在此添加控件通知处理程序代码
216     CMessageDlg dlg(L"LicenseDlg");
217     dlg.SetWindowTitle(theApp.m_str_table.LoadText(L"TITLE_LICENSE"));
218     dlg.SetInfoText(theApp.m_str_table.LoadText(L"TXT_LICENSE_EXPLAIN"));
219     dlg.SetMessageText(CCommon::GetTextResource(IDR_LICENSE, CodeType::UTF8_NO_BOM));
220     dlg.DoModal();
221     *pResult = 0;
222 }
223 
224 
OnEraseBkgnd(CDC * pDC)225 BOOL CAboutDlg::OnEraseBkgnd(CDC* pDC)
226 {
227     // TODO: 在此添加消息处理程序代码和/或调用默认值
228 
229     CRect draw_rect;
230     GetClientRect(draw_rect);
231     int client_bottom = draw_rect.bottom;
232     //绘制白色背景
233     draw_rect.bottom = m_white_height;
234     pDC->FillSolidRect(draw_rect, GetSysColor(COLOR_WINDOW));
235 
236     //绘制“确定”按钮上方的分割线
237     draw_rect.top = draw_rect.bottom;
238     draw_rect.bottom = draw_rect.top + max(theApp.DPI(1), 1);
239     pDC->FillSolidRect(draw_rect, RGB(210, 210, 210));
240 
241     //绘制灰色背景
242     draw_rect.top = draw_rect.bottom;
243     draw_rect.bottom = client_bottom;
244     pDC->FillSolidRect(draw_rect, GetSysColor(COLOR_BTNFACE));
245 
246     return TRUE;
247 }
248 
249 
OnCtlColor(CDC * pDC,CWnd * pWnd,UINT nCtlColor)250 HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
251 {
252     CRect rect;
253     ::GetWindowRect(pWnd->GetSafeHwnd(), rect);
254     ScreenToClient(rect);
255     // 如果控件在白色区域那么使用CBaseDialog的方法修改控件背景色,灰色区域使用原版CDialog的方法
256     if (rect.top < m_white_height)
257         return CBaseDialog::OnCtlColor(pDC, pWnd, nCtlColor);
258     else
259         return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
260 }
261 
262 
OnNMClickSyslinkBass(NMHDR * pNMHDR,LRESULT * pResult)263 void CAboutDlg::OnNMClickSyslinkBass(NMHDR* pNMHDR, LRESULT* pResult)
264 {
265     // TODO: 在此添加控件通知处理程序代码
266     ShellExecute(NULL, _T("open"), _T("http://www.un4seen.com/bass.html"), NULL, NULL, SW_SHOW);    //打开超链接
267     *pResult = 0;
268 }
269 
270 
OnNMClickSyslinkTaglib(NMHDR * pNMHDR,LRESULT * pResult)271 void CAboutDlg::OnNMClickSyslinkTaglib(NMHDR* pNMHDR, LRESULT* pResult)
272 {
273     // TODO: 在此添加控件通知处理程序代码
274     ShellExecute(NULL, _T("open"), _T("http://taglib.org/"), NULL, NULL, SW_SHOW);  //打开超链接
275     *pResult = 0;
276 }
277 
278 
OnNMClickSyslinkTinyxml2(NMHDR * pNMHDR,LRESULT * pResult)279 void CAboutDlg::OnNMClickSyslinkTinyxml2(NMHDR* pNMHDR, LRESULT* pResult)
280 {
281     // TODO: 在此添加控件通知处理程序代码
282     ShellExecute(NULL, _T("open"), _T("https://github.com/leethomason/tinyxml2"), NULL, NULL, SW_SHOW); //打开超链接
283     *pResult = 0;
284 }
285 
286 
OnNMClickSyslinkScintilla(NMHDR * pNMHDR,LRESULT * pResult)287 void CAboutDlg::OnNMClickSyslinkScintilla(NMHDR* pNMHDR, LRESULT* pResult)
288 {
289     // TODO: 在此添加控件通知处理程序代码
290     ShellExecute(NULL, _T("open"), _T("https://www.scintilla.org/index.html"), NULL, NULL, SW_SHOW);    //打开超链接
291     *pResult = 0;
292 }
293 
294 
OnNMClickSyslinkTrafficmonitor(NMHDR * pNMHDR,LRESULT * pResult)295 void CAboutDlg::OnNMClickSyslinkTrafficmonitor(NMHDR* pNMHDR, LRESULT* pResult)
296 {
297     // TODO: 在此添加控件通知处理程序代码
298     ShellExecute(NULL, _T("open"), _T("https://github.com/zhongyang219/TrafficMonitor"), NULL, NULL, SW_SHOW);  //打开超链接
299     *pResult = 0;
300 }
301 
302 
OnNMClickSyslinkSimplenotepad(NMHDR * pNMHDR,LRESULT * pResult)303 void CAboutDlg::OnNMClickSyslinkSimplenotepad(NMHDR* pNMHDR, LRESULT* pResult)
304 {
305     // TODO: 在此添加控件通知处理程序代码
306     ShellExecute(NULL, _T("open"), _T("https://github.com/zhongyang219/SimpleNotePad"), NULL, NULL, SW_SHOW);   //打开超链接
307     *pResult = 0;
308 }
309 
310 
OnNMClickAcknowledgementSyslink(NMHDR * pNMHDR,LRESULT * pResult)311 void CAboutDlg::OnNMClickAcknowledgementSyslink(NMHDR* pNMHDR, LRESULT* pResult)
312 {
313     // TODO: 在此添加控件通知处理程序代码
314     CMessageDlg dlg(L"AcknowledgementDlg");
315     dlg.SetWindowTitle(theApp.m_str_table.LoadText(L"TITLE_ACKNOWLEDGEMENT"));
316     std::wstringstream wss;
317     wss << theApp.m_str_table.LoadText(L"TXT_ACKNOWLEDGEMENT_INFO") << L"\r\n"
318         << CCommon::GetTextResource(IDR_ACKNOWLEDGEMENT, CodeType::UTF8_NO_BOM);
319 
320     // 这里排版需要重做
321     wss << L"\r\nTranslators\r\n------------------------";
322     const auto& lang_list = theApp.m_str_table.GetLanguageList();
323     // translator保证至少有一个元素
324     for (const auto& lang : lang_list)
325     {
326         wss << L"\r\n" << lang.display_name + L"(" + lang.file_name + L")    " << lang.translator.front();
327         for (auto iter = lang.translator.begin() + 1; iter != lang.translator.end(); ++iter)
328             wss << L"; " << *iter;
329     }
330 
331     dlg.SetMessageText(wss.str());
332     dlg.DoModal();
333     *pResult = 0;
334 }
335