AboutDlg.cpp
上传用户:qc13828
上传日期:2007-06-21
资源大小:63k
文件大小:13k
源码类别:

ICQ弱点检测代码

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. // 预处理
  3. #include "Define.h"
  4. #include <Windows.h>
  5. #include "AboutDlg.h"
  6. #include "Resource.h"
  7. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  8. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. // 宏定义
  10. #define IDC_Help 1234 // 帮助命令标识
  11. #define VAL_AboutDlg_Width 400 // 对话框宽度
  12. #define VAL_AboutDlg_Height 275 // 对话框高度
  13. #define IDT_AboutDlg_Close 1534 // 关闭时钟标识
  14. #define COLOR_AboutDlg_Link 0x00FF0000 // 超链接颜色
  15. #define COLOR_AboutDlg_HotLink 0x000000FF // 鼠标热点超链接颜色
  16. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  17. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  18. // CAboutDlg 类静态变量
  19. CAboutDlg::DIALOGINFO CAboutDlg::m_diDialog =
  20. {
  21. {DS_CENTER | WS_POPUP | WS_BORDER | WS_VISIBLE, 0, 0, 0, 0,
  22. (VAL_AboutDlg_Width * 2 / 3), (VAL_AboutDlg_Height * 2 / 3)}, // 对话框模板
  23. };
  24. CAboutDlg::LINEINFO CAboutDlg::m_liLines[] =
  25. {
  26. {{0, 1, 88, 74}, 0x00FF9966}, // 蓝线组
  27. {{60, 116, VAL_AboutDlg_Width, 132}, 0x00FF9966}, // 蓝线组
  28. {{60, 175, VAL_AboutDlg_Width, 176}, 0x00000000}, // 一根黑线
  29. };
  30. CAboutDlg::RECTINFO CAboutDlg::m_riRects[] =
  31. {
  32. {{0, 75, VAL_AboutDlg_Width, 111}, 0x00FF9966}, // 蓝色矩形
  33. {{0, 111, VAL_AboutDlg_Width, 115}, 0x00CC3333}, // 深蓝色矩形
  34. {{60, 47, 116, 103}, 0x00CC3333}, // 图标外框深蓝色矩形
  35. {{64, 51, 112, 99}, 0x00FFFFFF}, // 图标外框白色矩形
  36. {{68, 55, 86, 73}, RGB(0xEE, 0xEE, 0xEE + VER_Major % 16)}, // 图标背景淡灰色矩形
  37. {{90, 55, 108, 73}, RGB(0xEE, 0xEE, 0xEE + VER_Minor % 16)}, // 图标背景淡灰色矩形
  38. {{68, 79, 86, 95}, RGB(0xEE, 0xEE, 0xEE + VER_Release % 16)}, // 图标背景淡灰色矩形
  39. {{90, 79, 108, 95}, RGB(0xEE, 0xEE, 0xEE + VER_Build % 16)}, // 图标背景淡灰色矩形
  40. };
  41. CAboutDlg::TEXTINFO CAboutDlg::m_tiTexts[] =
  42. {
  43. {60, 162, TEXT(""), 0x00000000}, // 状态信息
  44. {60, 140, TEXT(""), 0x00BBBBBB}, // 版本信息
  45. {230, 140, TEXT(""), 0x00BBBBBB}, // 编译信息
  46. {60, 240, STR_Description, 0x00000000}, // 描述信息
  47. {60, 255, STR_Copyright, 0x00000000}, // 版权信息
  48. {125, 95, STR_Support, 0x00FFFFFF}, // 支持信息
  49. #ifdef _BETA
  50. {270, 40, TEXT("BETA"), 0x00AAAAAA}, // 测试版本
  51. #endif // _BETA
  52. };
  53. CAboutDlg::FONTTEXTINFO CAboutDlg::m_ftiTexts[] =
  54. {
  55. {125, 40, STR_AppName, 0x00000000, {36, 0, 0, 0, 800, 1,
  56. 0, 0, 0, 0, 0, ANTIALIASED_QUALITY, 0, TEXT("Arial")}}, // 程序名称
  57. };
  58. CAboutDlg::LINKINFO CAboutDlg::m_liLinks[] =
  59. {
  60. {{60, 185, 0, 185 + 13}, STR_ViewHelp, STR_ViewHelpTip, (PCTSTR) IDC_Help}, // 查看帮助
  61. {{60, 200, 0, 200 + 13}, STR_VisitWeb, STR_VisitWebTip, STR_WebUrl}, // 访问网站
  62. {{60, 215, 0, 215 + 13}, STR_WriteEmail, STR_WriteEmailTip, STR_EmailUrl}, // 写信给作者
  63. };
  64. HWND CAboutDlg::m_hWnd = NULL;
  65. BOOL CAboutDlg::m_bSplash = FALSE;
  66. INT CAboutDlg::m_iLinkIndex = -1;
  67. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  68. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  69. // 显示关于对话框
  70. VOID CAboutDlg::Show(HWND hParent)
  71. {
  72. if (m_hWnd == NULL)
  73. {
  74. DialogBoxIndirect(GetModuleHandle(NULL), (LPDLGTEMPLATE) &m_diDialog, hParent, (DLGPROC) AboutDlgProc);
  75. }
  76. }
  77. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  78. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79. // 以 Splash 方式显示关于对话框
  80. VOID CAboutDlg::Splash(HWND hParent, UINT uTimer)
  81. {
  82. if (m_hWnd == NULL)
  83. {
  84. // 创建无模式对话框
  85. CreateDialogIndirect(GetModuleHandle(NULL), (LPDLGTEMPLATE) &m_diDialog, hParent, (DLGPROC) AboutDlgProc);
  86. // 如果指定了自动关闭
  87. if (uTimer)
  88. {
  89. SetTimer(m_hWnd, IDT_AboutDlg_Close, uTimer, NULL);
  90. }
  91. // 设置当前窗口以 Splash 方式显示的标记
  92. m_bSplash = TRUE;
  93. }
  94. }
  95. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  96. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  97. // 关闭窗口关于对话框
  98. VOID CAboutDlg::Close(UINT uTimer)
  99. {
  100. // 如果是立即关闭
  101. if (uTimer)
  102. {
  103. SetTimer(m_hWnd, IDT_AboutDlg_Close, uTimer, NULL);
  104. }
  105. else
  106. {
  107. // 删除定时器
  108. KillTimer(m_hWnd, IDT_AboutDlg_Close);
  109. // 如果当前窗口以 Splash 方式显示
  110. if (m_bSplash)
  111. {
  112. DestroyWindow(m_hWnd);
  113. m_bSplash = FALSE;
  114. }
  115. else
  116. {
  117. EndDialog(m_hWnd, 0);
  118. }
  119. m_hWnd = NULL;
  120. m_tiTexts[0].tzText[0] = 0;
  121. }
  122. }
  123. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  124. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  125. // 设置状态信息
  126. VOID CAboutDlg::SetStatus(PCTSTR ptzText)
  127. {
  128. HDC hDC;
  129. RECT rtRect;
  130. // 状态信息矩形
  131. rtRect.left = m_tiTexts[0].x;
  132. rtRect.top = m_tiTexts[0].y;
  133. rtRect.right = VAL_AboutDlg_Width;
  134. rtRect.bottom = rtRect.top + _RectHeight(m_liLinks[0].rtRect);
  135. // 获取状态信息
  136. if (ptzText)
  137. {
  138. lstrcpy(m_tiTexts[0].tzText, ptzText);
  139. }
  140. else
  141. {
  142. m_tiTexts[0].tzText[0] = 0;
  143. }
  144. // 绘制状态信息
  145. hDC = GetDC(m_hWnd);
  146. SetTextColor(hDC, m_tiTexts[0].crColor);
  147. FillRect(hDC, &rtRect, (HBRUSH) GetStockObject(WHITE_BRUSH));
  148. SelectObject(hDC, (HFONT) GetStockObject(DEFAULT_GUI_FONT));
  149. TextOut(hDC, m_tiTexts[0].x, m_tiTexts[0].y, m_tiTexts[0].tzText, lstrlen(m_tiTexts[0].tzText));
  150. ReleaseDC(m_hWnd, hDC);
  151. }
  152. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  153. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  154. // 关于对话框回调函数
  155. INT_PTR CALLBACK CAboutDlg::AboutDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  156. {
  157. INT i;
  158. HDC hDC;
  159. POINT ptPoint;
  160. switch (uMsg)
  161. {
  162. case WM_INITDIALOG:
  163. // 初始化变量
  164. m_hWnd = hWnd;
  165. m_iLinkIndex = NULL;
  166. // 设置鼠标指针
  167. SetClassLong(m_hWnd, GCL_HCURSOR, 0);
  168. SetCursor(LoadCursor(NULL, IDC_ARROW));
  169. // 设置对话框风格
  170. if (GetParent(m_hWnd) == NULL)
  171. {
  172. SetWindowLong(m_hWnd, GWL_EXSTYLE, (GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_TOOLWINDOW));
  173. }
  174. SetWindowPos(m_hWnd, GetParent(m_hWnd) ? 0 : HWND_TOPMOST, 0, 0, VAL_AboutDlg_Width, VAL_AboutDlg_Height, SWP_NOMOVE);
  175. // 获取语言相关字符串
  176. wsprintf(m_tiTexts[1].tzText, STR_VersionStamp, STR_Version);
  177. wsprintf(m_tiTexts[2].tzText, STR_BuildStamp, STR_BuilDateTime);
  178. /* lstrcpy(m_tiTexts[3].tzText, STR_Description);
  179. lstrcpy(m_tiTexts[4].tzText, STR_Copyright);
  180. lstrcpy(m_liLinks[0].tzTitle, STR_ViewHelp);
  181. lstrcpy(m_liLinks[1].tzTitle, STR_VisitWeb);
  182. lstrcpy(m_liLinks[2].tzTitle, STR_WriteEmail);
  183. lstrcpy(m_liLinks[0].tzTip, STR_ViewHelpTip);
  184. lstrcpy(m_liLinks[1].tzTip, STR_VisitWebTip);
  185. lstrcpy(m_liLinks[2].tzTip, STR_WriteEmailTip);*/
  186. break;
  187. case WM_CTLCOLORDLG:
  188. case WM_CTLCOLORSTATIC:
  189. return (INT_PTR) GetStockObject(WHITE_BRUSH);
  190. case WM_PAINT:
  191. OnPaint();
  192. break;
  193. case WM_ACTIVATEAPP:
  194. // 激活程序
  195. GetCursorPos(&ptPoint);
  196. MapWindowPoints(NULL, m_hWnd, &ptPoint, 1);
  197. SendMessage(m_hWnd, WM_MOUSEMOVE, 0, MAKELONG(ptPoint.x, ptPoint.y));
  198. break;
  199. case WM_MOUSEMOVE:
  200. // 如果鼠标所在位置的超链接改变
  201. ptPoint.x = LOWORD(lParam);
  202. ptPoint.y = HIWORD(lParam);
  203. i = GetLinkIndex(ptPoint);
  204. if (i != m_iLinkIndex)
  205. {
  206. m_iLinkIndex = i;
  207. hDC = GetDC(m_hWnd);
  208. PaintLinks(hDC);
  209. ReleaseDC(m_hWnd, hDC);
  210. }
  211. break;
  212. case WM_LBUTTONDOWN:
  213. // 如果在图标框内,拖动对话框
  214. ptPoint.x = LOWORD(lParam);
  215. ptPoint.y = HIWORD(lParam);
  216. if (PtInRect(&m_riRects[2].rtRect, ptPoint))
  217. {
  218. ReleaseCapture();
  219. PostMessage(m_hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
  220. }
  221. break;
  222. case WM_ENTERSIZEMOVE:
  223. SetCursor(LoadCursor(NULL, IDC_SIZEALL));
  224. break;
  225. case WM_EXITSIZEMOVE:
  226. SetCursor(LoadCursor(NULL, IDC_ARROW));
  227. break;
  228. case WM_LBUTTONUP:
  229. // 如果鼠标在超链接内
  230. if (m_iLinkIndex != -1)
  231. {
  232. // 如果 HIWORD(ptzUrl) 为 0,表示命令,否则表示超链接
  233. if (HIWORD(m_liLinks[m_iLinkIndex].ptzUrl))
  234. {
  235. ShellExecute(NULL, NULL, m_liLinks[m_iLinkIndex].ptzUrl, NULL, NULL, SW_NORMAL);
  236. }
  237. else
  238. {
  239. PostMessage(m_hWnd, WM_COMMAND, (WPARAM) m_liLinks[m_iLinkIndex].ptzUrl, 0);
  240. }
  241. }
  242. else
  243. {
  244. // 关闭对话框
  245. Close();
  246. }
  247. break;
  248. case WM_COMMAND:
  249. // 处理命令消息
  250. switch (LOWORD(wParam))
  251. {
  252. case IDC_Help:
  253. // 查看帮助
  254. MessageBox(hWnd, TEXT("晕!这么简单的东东也需要帮助?"), STR_AppName, MB_ICONINFORMATION);
  255. break;
  256. case IDOK:
  257. case IDCANCEL:
  258. // 关闭对话框
  259. Close();
  260. break;
  261. }
  262. break;
  263. case WM_TIMER:
  264. case WM_RBUTTONUP:
  265. // 关闭对话框
  266. Close();
  267. break;
  268. }
  269. return 0;
  270. }
  271. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  272. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  273. // 绘制对话框
  274. VOID CAboutDlg::OnPaint()
  275. {
  276. INT i;
  277. INT j;
  278. HDC hDC;
  279. HPEN hPen;
  280. HBRUSH hBrush;
  281. POINT ptPoint;
  282. PAINTSTRUCT psPaint;
  283. // 开始绘制
  284. hDC = BeginPaint(m_hWnd, &psPaint);
  285. // 绘制水平线组
  286. for (i = 0; i < _NumberOf(m_liLines); i++)
  287. {
  288. hPen = (HPEN) SelectObject(hDC, CreatePen(PS_SOLID, 0, m_liLines[i].crColor));
  289. for(j = m_liLines[i].rtRect.top; j < m_liLines[i].rtRect.bottom; j += 2)
  290. {
  291. MoveToEx(hDC, m_liLines[i].rtRect.left, j, NULL);
  292. LineTo(hDC, m_liLines[i].rtRect.right, j);
  293. }
  294. DeleteObject(SelectObject(hDC, hPen));
  295. }
  296. // 绘制矩形区域
  297. for (i = 0; i < _NumberOf(m_riRects); i++)
  298. {
  299. hBrush = CreateSolidBrush(m_riRects[i].crColor);
  300. FillRect(hDC, &m_riRects[i].rtRect, hBrush);
  301. DeleteObject(hBrush);
  302. }
  303. // 绘制图标
  304. DrawIcon(hDC,
  305. m_riRects[2].rtRect.left + (_RectWidth(m_riRects[2].rtRect) - 32) / 2,
  306. m_riRects[2].rtRect.top + (_RectHeight(m_riRects[2].rtRect) - 32) / 2,
  307. LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_Main)));
  308. // 绘制超链接
  309. GetCursorPos(&ptPoint);
  310. MapWindowPoints(NULL, m_hWnd, &ptPoint, 1);
  311. m_iLinkIndex = GetLinkIndex(ptPoint);
  312. PaintLinks(hDC);
  313. // 使用对话框默认字体、透明背景绘制文本
  314. SetBkMode(hDC, TRANSPARENT);
  315. SelectObject(hDC, (HFONT) GetStockObject(DEFAULT_GUI_FONT));
  316. for (i = 0; i < _NumberOf(m_tiTexts); i++)
  317. {
  318. SetTextColor(hDC, m_tiTexts[i].crColor);
  319. TextOut(hDC, m_tiTexts[i].x, m_tiTexts[i].y, m_tiTexts[i].tzText, lstrlen(m_tiTexts[i].tzText));
  320. }
  321. // 绘制指定字体的文本
  322. for (i = 0; i < _NumberOf(m_ftiTexts); i++)
  323. {
  324. HFONT hFont = (HFONT) SelectObject(hDC, CreateFontIndirect(&m_ftiTexts[i].lfFont));
  325. SetTextColor(hDC, m_ftiTexts[i].crColor);
  326. TextOut(hDC, m_ftiTexts[i].x, m_ftiTexts[i].y, m_ftiTexts[i].ptzText, lstrlen(m_ftiTexts[i].ptzText));
  327. DeleteObject(SelectObject(hDC, hFont));
  328. }
  329. // 结束绘制
  330. EndPaint(m_hWnd, &psPaint);
  331. }
  332. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  333. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  334. // 获取指定点的超链接
  335. INT CAboutDlg::GetLinkIndex(POINT ptPoint)
  336. {
  337. for (INT i = 0; i < _NumberOf(m_liLinks); i++)
  338. {
  339. if (PtInRect(&m_liLinks[i].rtRect, ptPoint))
  340. {
  341. return i;
  342. }
  343. }
  344. return -1;
  345. }
  346. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  347. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  348. // 绘制超链接
  349. VOID CAboutDlg::PaintLinks(HDC hDC)
  350. {
  351. HFONT hFont;
  352. LOGFONT lfFont;
  353. PTSTR ptzCursor;
  354. GetObject((HFONT) GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), &lfFont);
  355. for (INT i = 0; i < _NumberOf(m_liLinks); i++)
  356. {
  357. lfFont.lfUnderline = (i == m_iLinkIndex);
  358. hFont = (HFONT) SelectObject(hDC, CreateFontIndirect(&lfFont));
  359. SetTextColor(hDC, lfFont.lfUnderline ? COLOR_AboutDlg_HotLink : COLOR_AboutDlg_Link);
  360. // 计算矩形框,绘制文本
  361. m_liLinks[i].rtRect.bottom = m_liLinks[i].rtRect.top +
  362. DrawText(hDC, m_liLinks[i].tzTitle, -1, &m_liLinks[i].rtRect,
  363. DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER | DT_CALCRECT);
  364. DrawText(hDC, m_liLinks[i].tzTitle, -1, &m_liLinks[i].rtRect, DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER);
  365. DeleteObject(SelectObject(hDC, hFont));
  366. }
  367. if ((m_iLinkIndex == -1))
  368. {
  369. SetStatus();
  370. ptzCursor = IDC_ARROW;
  371. }
  372. else
  373. {
  374. SetStatus(m_liLinks[m_iLinkIndex].tzTip);
  375. ptzCursor = IDC_HAND;
  376. }
  377. SetCursor(LoadCursor(NULL, ptzCursor));
  378. }
  379. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////