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