www.pudn.com > DetourQQ.rar > AboutDlg.cpp
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 预处理 #include "Define.h" #include#include "AboutDlg.h" #include "Resource.h" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 宏定义 #define IDC_Help 1234 // 帮助命令标识 #define VAL_AboutDlg_Width 400 // 对话框宽度 #define VAL_AboutDlg_Height 275 // 对话框高度 #define IDT_AboutDlg_Close 1534 // 关闭时钟标识 #define COLOR_AboutDlg_Link 0x00FF0000 // 超链接颜色 #define COLOR_AboutDlg_HotLink 0x000000FF // 鼠标热点超链接颜色 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CAboutDlg 类静态变量 CAboutDlg::DIALOGINFO CAboutDlg::m_diDialog = { {DS_CENTER | WS_POPUP | WS_BORDER | WS_VISIBLE, 0, 0, 0, 0, (VAL_AboutDlg_Width * 2 / 3), (VAL_AboutDlg_Height * 2 / 3)}, // 对话框模板 }; CAboutDlg::LINEINFO CAboutDlg::m_liLines[] = { {{0, 1, 88, 74}, 0x00FF9966}, // 蓝线组 {{60, 116, VAL_AboutDlg_Width, 132}, 0x00FF9966}, // 蓝线组 {{60, 175, VAL_AboutDlg_Width, 176}, 0x00000000}, // 一根黑线 }; CAboutDlg::RECTINFO CAboutDlg::m_riRects[] = { {{0, 75, VAL_AboutDlg_Width, 111}, 0x00FF9966}, // 蓝色矩形 {{0, 111, VAL_AboutDlg_Width, 115}, 0x00CC3333}, // 深蓝色矩形 {{60, 47, 116, 103}, 0x00CC3333}, // 图标外框深蓝色矩形 {{64, 51, 112, 99}, 0x00FFFFFF}, // 图标外框白色矩形 {{68, 55, 86, 73}, RGB(0xEE, 0xEE, 0xEE + VER_Major % 16)}, // 图标背景淡灰色矩形 {{90, 55, 108, 73}, RGB(0xEE, 0xEE, 0xEE + VER_Minor % 16)}, // 图标背景淡灰色矩形 {{68, 79, 86, 95}, RGB(0xEE, 0xEE, 0xEE + VER_Release % 16)}, // 图标背景淡灰色矩形 {{90, 79, 108, 95}, RGB(0xEE, 0xEE, 0xEE + VER_Build % 16)}, // 图标背景淡灰色矩形 }; CAboutDlg::TEXTINFO CAboutDlg::m_tiTexts[] = { {60, 162, TEXT(""), 0x00000000}, // 状态信息 {60, 140, TEXT(""), 0x00BBBBBB}, // 版本信息 {230, 140, TEXT(""), 0x00BBBBBB}, // 编译信息 {60, 240, STR_Description, 0x00000000}, // 描述信息 {60, 255, STR_Copyright, 0x00000000}, // 版权信息 {125, 95, STR_Support, 0x00FFFFFF}, // 支持信息 #ifdef _BETA {270, 40, TEXT("BETA"), 0x00AAAAAA}, // 测试版本 #endif // _BETA }; CAboutDlg::FONTTEXTINFO CAboutDlg::m_ftiTexts[] = { {125, 40, STR_AppName, 0x00000000, {36, 0, 0, 0, 800, 1, 0, 0, 0, 0, 0, ANTIALIASED_QUALITY, 0, TEXT("Arial")}}, // 程序名称 }; CAboutDlg::LINKINFO CAboutDlg::m_liLinks[] = { {{60, 185, 0, 185 + 13}, STR_ViewHelp, STR_ViewHelpTip, (PCTSTR) IDC_Help}, // 查看帮助 {{60, 200, 0, 200 + 13}, STR_VisitWeb, STR_VisitWebTip, STR_WebUrl}, // 访问网站 {{60, 215, 0, 215 + 13}, STR_WriteEmail, STR_WriteEmailTip, STR_EmailUrl}, // 写信给作者 }; HWND CAboutDlg::m_hWnd = NULL; BOOL CAboutDlg::m_bSplash = FALSE; INT CAboutDlg::m_iLinkIndex = -1; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 显示关于对话框 VOID CAboutDlg::Show(HWND hParent) { if (m_hWnd == NULL) { DialogBoxIndirect(GetModuleHandle(NULL), (LPDLGTEMPLATE) &m_diDialog, hParent, (DLGPROC) AboutDlgProc); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 以 Splash 方式显示关于对话框 VOID CAboutDlg::Splash(HWND hParent, UINT uTimer) { if (m_hWnd == NULL) { // 创建无模式对话框 CreateDialogIndirect(GetModuleHandle(NULL), (LPDLGTEMPLATE) &m_diDialog, hParent, (DLGPROC) AboutDlgProc); // 如果指定了自动关闭 if (uTimer) { SetTimer(m_hWnd, IDT_AboutDlg_Close, uTimer, NULL); } // 设置当前窗口以 Splash 方式显示的标记 m_bSplash = TRUE; } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 关闭窗口关于对话框 VOID CAboutDlg::Close(UINT uTimer) { // 如果是立即关闭 if (uTimer) { SetTimer(m_hWnd, IDT_AboutDlg_Close, uTimer, NULL); } else { // 删除定时器 KillTimer(m_hWnd, IDT_AboutDlg_Close); // 如果当前窗口以 Splash 方式显示 if (m_bSplash) { DestroyWindow(m_hWnd); m_bSplash = FALSE; } else { EndDialog(m_hWnd, 0); } m_hWnd = NULL; m_tiTexts[0].tzText[0] = 0; } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 设置状态信息 VOID CAboutDlg::SetStatus(PCTSTR ptzText) { HDC hDC; RECT rtRect; // 状态信息矩形 rtRect.left = m_tiTexts[0].x; rtRect.top = m_tiTexts[0].y; rtRect.right = VAL_AboutDlg_Width; rtRect.bottom = rtRect.top + _RectHeight(m_liLinks[0].rtRect); // 获取状态信息 if (ptzText) { lstrcpy(m_tiTexts[0].tzText, ptzText); } else { m_tiTexts[0].tzText[0] = 0; } // 绘制状态信息 hDC = GetDC(m_hWnd); SetTextColor(hDC, m_tiTexts[0].crColor); FillRect(hDC, &rtRect, (HBRUSH) GetStockObject(WHITE_BRUSH)); SelectObject(hDC, (HFONT) GetStockObject(DEFAULT_GUI_FONT)); TextOut(hDC, m_tiTexts[0].x, m_tiTexts[0].y, m_tiTexts[0].tzText, lstrlen(m_tiTexts[0].tzText)); ReleaseDC(m_hWnd, hDC); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 关于对话框回调函数 INT_PTR CALLBACK CAboutDlg::AboutDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { INT i; HDC hDC; POINT ptPoint; switch (uMsg) { case WM_INITDIALOG: // 初始化变量 m_hWnd = hWnd; m_iLinkIndex = NULL; // 设置鼠标指针 SetClassLong(m_hWnd, GCL_HCURSOR, 0); SetCursor(LoadCursor(NULL, IDC_ARROW)); // 设置对话框风格 if (GetParent(m_hWnd) == NULL) { SetWindowLong(m_hWnd, GWL_EXSTYLE, (GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_TOOLWINDOW)); } SetWindowPos(m_hWnd, GetParent(m_hWnd) ? 0 : HWND_TOPMOST, 0, 0, VAL_AboutDlg_Width, VAL_AboutDlg_Height, SWP_NOMOVE); // 获取语言相关字符串 wsprintf(m_tiTexts[1].tzText, STR_VersionStamp, STR_Version); wsprintf(m_tiTexts[2].tzText, STR_BuildStamp, STR_BuilDateTime); /* lstrcpy(m_tiTexts[3].tzText, STR_Description); lstrcpy(m_tiTexts[4].tzText, STR_Copyright); lstrcpy(m_liLinks[0].tzTitle, STR_ViewHelp); lstrcpy(m_liLinks[1].tzTitle, STR_VisitWeb); lstrcpy(m_liLinks[2].tzTitle, STR_WriteEmail); lstrcpy(m_liLinks[0].tzTip, STR_ViewHelpTip); lstrcpy(m_liLinks[1].tzTip, STR_VisitWebTip); lstrcpy(m_liLinks[2].tzTip, STR_WriteEmailTip);*/ break; case WM_CTLCOLORDLG: case WM_CTLCOLORSTATIC: return (INT_PTR) GetStockObject(WHITE_BRUSH); case WM_PAINT: OnPaint(); break; case WM_ACTIVATEAPP: // 激活程序 GetCursorPos(&ptPoint); MapWindowPoints(NULL, m_hWnd, &ptPoint, 1); SendMessage(m_hWnd, WM_MOUSEMOVE, 0, MAKELONG(ptPoint.x, ptPoint.y)); break; case WM_MOUSEMOVE: // 如果鼠标所在位置的超链接改变 ptPoint.x = LOWORD(lParam); ptPoint.y = HIWORD(lParam); i = GetLinkIndex(ptPoint); if (i != m_iLinkIndex) { m_iLinkIndex = i; hDC = GetDC(m_hWnd); PaintLinks(hDC); ReleaseDC(m_hWnd, hDC); } break; case WM_LBUTTONDOWN: // 如果在图标框内,拖动对话框 ptPoint.x = LOWORD(lParam); ptPoint.y = HIWORD(lParam); if (PtInRect(&m_riRects[2].rtRect, ptPoint)) { ReleaseCapture(); PostMessage(m_hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0); } break; case WM_ENTERSIZEMOVE: SetCursor(LoadCursor(NULL, IDC_SIZEALL)); break; case WM_EXITSIZEMOVE: SetCursor(LoadCursor(NULL, IDC_ARROW)); break; case WM_LBUTTONUP: // 如果鼠标在超链接内 if (m_iLinkIndex != -1) { // 如果 HIWORD(ptzUrl) 为 0,表示命令,否则表示超链接 if (HIWORD(m_liLinks[m_iLinkIndex].ptzUrl)) { ShellExecute(NULL, NULL, m_liLinks[m_iLinkIndex].ptzUrl, NULL, NULL, SW_NORMAL); } else { PostMessage(m_hWnd, WM_COMMAND, (WPARAM) m_liLinks[m_iLinkIndex].ptzUrl, 0); } } else { // 关闭对话框 Close(); } break; case WM_COMMAND: // 处理命令消息 switch (LOWORD(wParam)) { case IDC_Help: // 查看帮助 MessageBox(hWnd, TEXT("晕!这么简单的东东也需要帮助?"), STR_AppName, MB_ICONINFORMATION); break; case IDOK: case IDCANCEL: // 关闭对话框 Close(); break; } break; case WM_TIMER: case WM_RBUTTONUP: // 关闭对话框 Close(); break; } return 0; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 绘制对话框 VOID CAboutDlg::OnPaint() { INT i; INT j; HDC hDC; HPEN hPen; HBRUSH hBrush; POINT ptPoint; PAINTSTRUCT psPaint; // 开始绘制 hDC = BeginPaint(m_hWnd, &psPaint); // 绘制水平线组 for (i = 0; i < _NumberOf(m_liLines); i++) { hPen = (HPEN) SelectObject(hDC, CreatePen(PS_SOLID, 0, m_liLines[i].crColor)); for(j = m_liLines[i].rtRect.top; j < m_liLines[i].rtRect.bottom; j += 2) { MoveToEx(hDC, m_liLines[i].rtRect.left, j, NULL); LineTo(hDC, m_liLines[i].rtRect.right, j); } DeleteObject(SelectObject(hDC, hPen)); } // 绘制矩形区域 for (i = 0; i < _NumberOf(m_riRects); i++) { hBrush = CreateSolidBrush(m_riRects[i].crColor); FillRect(hDC, &m_riRects[i].rtRect, hBrush); DeleteObject(hBrush); } // 绘制图标 DrawIcon(hDC, m_riRects[2].rtRect.left + (_RectWidth(m_riRects[2].rtRect) - 32) / 2, m_riRects[2].rtRect.top + (_RectHeight(m_riRects[2].rtRect) - 32) / 2, LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_Main))); // 绘制超链接 GetCursorPos(&ptPoint); MapWindowPoints(NULL, m_hWnd, &ptPoint, 1); m_iLinkIndex = GetLinkIndex(ptPoint); PaintLinks(hDC); // 使用对话框默认字体、透明背景绘制文本 SetBkMode(hDC, TRANSPARENT); SelectObject(hDC, (HFONT) GetStockObject(DEFAULT_GUI_FONT)); for (i = 0; i < _NumberOf(m_tiTexts); i++) { SetTextColor(hDC, m_tiTexts[i].crColor); TextOut(hDC, m_tiTexts[i].x, m_tiTexts[i].y, m_tiTexts[i].tzText, lstrlen(m_tiTexts[i].tzText)); } // 绘制指定字体的文本 for (i = 0; i < _NumberOf(m_ftiTexts); i++) { HFONT hFont = (HFONT) SelectObject(hDC, CreateFontIndirect(&m_ftiTexts[i].lfFont)); SetTextColor(hDC, m_ftiTexts[i].crColor); TextOut(hDC, m_ftiTexts[i].x, m_ftiTexts[i].y, m_ftiTexts[i].ptzText, lstrlen(m_ftiTexts[i].ptzText)); DeleteObject(SelectObject(hDC, hFont)); } // 结束绘制 EndPaint(m_hWnd, &psPaint); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 获取指定点的超链接 INT CAboutDlg::GetLinkIndex(POINT ptPoint) { for (INT i = 0; i < _NumberOf(m_liLinks); i++) { if (PtInRect(&m_liLinks[i].rtRect, ptPoint)) { return i; } } return -1; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 绘制超链接 VOID CAboutDlg::PaintLinks(HDC hDC) { HFONT hFont; LOGFONT lfFont; PTSTR ptzCursor; GetObject((HFONT) GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), &lfFont); for (INT i = 0; i < _NumberOf(m_liLinks); i++) { lfFont.lfUnderline = (i == m_iLinkIndex); hFont = (HFONT) SelectObject(hDC, CreateFontIndirect(&lfFont)); SetTextColor(hDC, lfFont.lfUnderline ? COLOR_AboutDlg_HotLink : COLOR_AboutDlg_Link); // 计算矩形框,绘制文本 m_liLinks[i].rtRect.bottom = m_liLinks[i].rtRect.top + DrawText(hDC, m_liLinks[i].tzTitle, -1, &m_liLinks[i].rtRect, DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER | DT_CALCRECT); DrawText(hDC, m_liLinks[i].tzTitle, -1, &m_liLinks[i].rtRect, DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER); DeleteObject(SelectObject(hDC, hFont)); } if ((m_iLinkIndex == -1)) { SetStatus(); ptzCursor = IDC_ARROW; } else { SetStatus(m_liLinks[m_iLinkIndex].tzTip); ptzCursor = IDC_HAND; } SetCursor(LoadCursor(NULL, ptzCursor)); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////