SNCSetupDlg.cpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. // SNCSetupDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "SNCSetup.h"
  5. #include "SNCSetupDlg.h"
  6. #include "fileinfo.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #endif
  10. // CSNCSetupDlg 对话框
  11. CSNCSetupDlg::CSNCSetupDlg(CWnd* pParent /*=NULL*/)
  12. : CDialog(CSNCSetupDlg::IDD, pParent)
  13. {
  14. m_hIcon = AfxGetApp()->LoadIcon(IDI_MAINFRAME);
  15. }
  16. void CSNCSetupDlg::DoDataExchange(CDataExchange* pDX)
  17. {
  18. CDialog::DoDataExchange(pDX);
  19. DDX_Control(pDX, IDC_PROGRESS, m_progress);
  20. DDX_Control(pDX, IDC_STATIC_MAESSAGE, m_currentinfo);
  21. DDX_Control(pDX, IDC_BUTTON_CLOSE, m_buttonclose);
  22. }
  23. BEGIN_MESSAGE_MAP(CSNCSetupDlg, CDialog)
  24. ON_WM_PAINT()
  25. ON_WM_CLOSE()
  26. ON_WM_QUERYDRAGICON()
  27. ON_MESSAGE(WM_USERMSG_UPGRADE_STATE, &CSNCSetupDlg::onUserMsgUpgradeSate)
  28. ON_MESSAGE(WM_USERMSG_UPGRADE_RANGE, &CSNCSetupDlg::onUserMsgUpgradeRange)
  29. ON_MESSAGE(WM_USERMSG_UPGRADE_PROGRESS, &CSNCSetupDlg::onUserMsgUpgradeProgress)
  30. ON_MESSAGE(WM_USERMSG_UPGRADE_CHILD_PROGRESS, &CSNCSetupDlg::onUserMsgUpgradeChilidProgress)
  31. //}}AFX_MSG_MAP
  32. ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CSNCSetupDlg::OnBnClickedButtonClose)
  33. END_MESSAGE_MAP()
  34. // CSNCSetupDlg 消息处理程序
  35. LRESULT CSNCSetupDlg::onUserMsgUpgradeSate(WPARAM wParam, LPARAM lParam)
  36. {
  37. if(wParam>=100)
  38. {
  39. SetSystemError(wParam);
  40. }
  41. switch(wParam)
  42. {
  43. case USER_PARAM_NETWORK_NOT_AVAIABLE:
  44. SetNetworkNotAvailable();
  45. break;
  46. case USER_PARAM_NETWORK_AVAIABLE:
  47. SetNetworkAvailable();
  48. break;
  49. case USER_PARAM_FILE_DOWNLOAD_ERROR:
  50. SetDownloadError();
  51. break;
  52. case USER_PARAM_FILE_DOWNLOAD_ABORT:
  53. SetUserAbort();
  54. break;
  55. case USER_PARAM_SETUP_FINISH:
  56. SetSetupFinished();
  57. break;
  58. case USER_PARAM_VERSION_UPDATED:
  59. SetVersionUpdated();
  60. break;
  61. case USER_PARAM_NOT_NEED_UPDATE:
  62. SetVersionNotNeedUpdate();
  63. break;
  64. case USER_PARAM_SETUP_EXIT:
  65. OnOK();
  66. break;
  67. }
  68. return 0;
  69. }
  70. LRESULT CSNCSetupDlg::onUserMsgUpgradeProgress (WPARAM wParam, LPARAM lParam)
  71. {
  72. m_progress.SetPos(wParam*MAX_PROGRESSBAR/m_filecount);
  73. m_step = wParam;
  74. if(wParam==m_filecount){
  75. m_progress.SetPos(MAX_PROGRESSBAR);
  76. UpdateProgress();
  77. SetSetupAvailable();
  78. return 0;
  79. }
  80. UpdateProgress();
  81. return 0;
  82. }
  83. LRESULT CSNCSetupDlg::onUserMsgUpgradeChilidProgress (WPARAM wParam, LPARAM lParam)
  84. {
  85. m_progress.SetPos(m_step*MAX_PROGRESSBAR/m_filecount+MAX_PROGRESSBAR*wParam/100/m_filecount);
  86. UpdateProgress();
  87. return 0;
  88. }
  89. void CSNCSetupDlg::UpdateProgress()
  90. {
  91. dlElapsed = COleDateTime::GetCurrentTime() - dlStart;
  92. double totalseconds = dlElapsed.GetTotalSeconds();
  93. int curpos = m_progress.GetPos();
  94. double speed = curpos/totalseconds;
  95. int left = MAX_PROGRESSBAR - curpos;
  96. int remainingtime = (int)(left/speed);
  97. int mins = remainingtime / 60;
  98. int secs = remainingtime % 60;
  99. CString str;
  100. if(remainingtime>0)
  101. {
  102. if(mins>0)
  103. str.Format(_T("正在下载安装包,预计剩余时间%d分%d秒"),mins,secs);
  104. else
  105. str.Format(_T("正在下载安装包,预计剩余时间%d秒"),secs);
  106. }
  107. m_currentinfo.SetWindowTextW(str);
  108. }
  109. LRESULT CSNCSetupDlg::onUserMsgUpgradeRange (WPARAM wParam, LPARAM lParam)
  110. {
  111. SetProgressNoMarquee();
  112. m_progress.SetRange(1,MAX_PROGRESSBAR);
  113. m_step = 0;
  114. dlStart = COleDateTime::GetCurrentTime();
  115. m_filecount = wParam;
  116. m_progress.SetPos(0);
  117. return 0;
  118. }
  119. BOOL CSNCSetupDlg::OnInitDialog()
  120. {
  121. CDialog::OnInitDialog();
  122. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  123. // 执行此操作
  124. SetIcon(m_hIcon, TRUE); // 设置大图标
  125. SetIcon(m_hIcon, FALSE); // 设置小图标
  126. this->confirm = true;
  127. ShowWindow(SW_NORMAL);
  128. // TODO: 在此添加额外的初始化代码
  129. StartUpdate();
  130. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  131. }
  132. // 如果向对话框添加最小化按钮,则需要下面的代码
  133. // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  134. // 这将由框架自动完成。
  135. void CSNCSetupDlg::OnPaint()
  136. {
  137. if (IsIconic())
  138. {
  139. CPaintDC dc(this); // 用于绘制的设备上下文
  140. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  141. // 使图标在工作区矩形中居中
  142. int cxIcon = GetSystemMetrics(SM_CXICON);
  143. int cyIcon = GetSystemMetrics(SM_CYICON);
  144. CRect rect;
  145. GetClientRect(&rect);
  146. int x = (rect.Width() - cxIcon + 1) / 2;
  147. int y = (rect.Height() - cyIcon + 1) / 2;
  148. // 绘制图标
  149. dc.DrawIcon(x, y, m_hIcon);
  150. }
  151. else
  152. {
  153. CDialog::OnPaint();
  154. }
  155. }
  156. //当用户拖动最小化窗口时系统调用此函数取得光标
  157. //显示。
  158. HCURSOR CSNCSetupDlg::OnQueryDragIcon()
  159. {
  160. return static_cast<HCURSOR>(m_hIcon);
  161. }
  162. void CSNCSetupDlg::OnClose()
  163. {
  164. if(confirm)
  165. {
  166. if(MessageBox( _T("极速号码魔方安装程序尚未完成。确定要退出吗? "), _T("提示"),MB_ICONQUESTION | MB_YESNO) != IDYES)
  167. {
  168. return;
  169. }
  170. }
  171. SetUserAbort();
  172. this->m_threadParam.stop = true;
  173. CDialog::OnClose() ;
  174. }
  175. void CSNCSetupDlg::StartUpdate()
  176. {
  177. SetProgressToMarquee(IDC_PROGRESS);
  178. m_currentinfo.SetWindowTextW(_T("正在连接网络..."));
  179. m_threadParam.hwnd = GetSafeHwnd();
  180. m_threadParam.stop = false;
  181. m_threadParam.isproduct = isproduct;
  182. m_update.StartUpdate(&m_threadParam);
  183. }
  184. void CSNCSetupDlg::DownloadFiles()
  185. {
  186. }
  187. void CSNCSetupDlg::SetSystemError(int errCode)
  188. {
  189. CString display ;
  190. display.Format(_T("安装程序发生内部错误,错误代码%d,请与软件提供商联系。"),errCode);
  191. m_currentinfo.SetWindowTextW(display);
  192. m_progress.ShowWindow(SW_HIDE);
  193. m_buttonclose.ShowWindow(SW_SHOW);
  194. confirm = false;
  195. }
  196. void CSNCSetupDlg::SetNetworkNotAvailable()
  197. {
  198. m_currentinfo.SetWindowTextW(_T("安装程序无法连接到互联网。请确定您的计算机已经连接到互联网,然后重试。"));
  199. m_progress.ShowWindow(SW_HIDE);
  200. m_buttonclose.ShowWindow(SW_SHOW);
  201. confirm = false;
  202. }
  203. void CSNCSetupDlg::SetNetworkAvailable()
  204. {
  205. m_currentinfo.SetWindowTextW(_T("网络已经连接,正在进行安装准备..."));
  206. }
  207. void CSNCSetupDlg::SetUserAbort()
  208. {
  209. m_currentinfo.SetWindowTextW(_T("用户取消..."));
  210. //m_progress.ShowWindow(SW_HIDE);
  211. //m_buttonclose.ShowWindow(SW_SHOW);
  212. confirm = false;
  213. OnOK();
  214. }
  215. void CSNCSetupDlg::SetSetupAvailable()
  216. {
  217. m_currentinfo.SetWindowTextW(_T("正在安装程序..."));
  218. SetProgressToMarquee(IDC_PROGRESS);
  219. }
  220. void CSNCSetupDlg::SetDownloadError()
  221. {
  222. m_currentinfo.SetWindowTextW(_T("安装程序在下载过程中发生错误。这通常是网络连接出现中断导致的。请确定您的计算机已经连接到互联网,然后重试。"));
  223. m_buttonclose.ShowWindow(SW_SHOW);
  224. m_progress.ShowWindow(SW_HIDE);
  225. confirm = false;
  226. }
  227. void CSNCSetupDlg::SetVersionNotNeedUpdate()
  228. {
  229. m_currentinfo.SetWindowTextW(_T("软件已经是最新版本,无需升级。"));
  230. SetProgressToMarquee(IDC_PROGRESS);
  231. }
  232. void CSNCSetupDlg::SetVersionUpdated()
  233. {
  234. m_currentinfo.SetWindowTextW(_T("正在更新数据库信息..."));
  235. SetProgressToMarquee(IDC_PROGRESS);
  236. }
  237. void CSNCSetupDlg::SetSetupFinished()
  238. {
  239. m_currentinfo.SetWindowTextW(_T("正在启动程序..."));
  240. }
  241. void CSNCSetupDlg::SetProgressToMarquee(int nID)
  242. {
  243. HWND hwndProgress = GetDlgItem(nID)->m_hWnd;
  244. DWORD dwStyle = ::GetWindowLong(hwndProgress, GWL_STYLE);
  245. ::SetWindowLong(hwndProgress, GWL_STYLE, dwStyle|PBS_MARQUEE);
  246. ::SendMessage(hwndProgress,(UINT) PBM_SETMARQUEE,(WPARAM) TRUE,(LPARAM)30);/**/
  247. m_progress.SetMarquee(true,20);
  248. }
  249. void CSNCSetupDlg::SetProgressNoMarquee()
  250. {
  251. HWND hwndProgress = GetDlgItem(IDC_PROGRESS)->m_hWnd;
  252. DWORD dwStyle = ::GetWindowLong(hwndProgress, GWL_STYLE);
  253. ::SetWindowLong(hwndProgress, GWL_STYLE, dwStyle&~PBS_MARQUEE);
  254. ::SendMessage(hwndProgress,(UINT) PBM_SETMARQUEE,(WPARAM) FALSE,(LPARAM)30);
  255. m_progress.SetMarquee(false,20);
  256. }
  257. void CSNCSetupDlg::OnBnClickedButtonClose()
  258. {
  259. // TODO: 在此添加控件通知处理程序代码
  260. OnOK();
  261. }