DlgService.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. // DlgService.cpp: 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "SATHelper.h"
  5. #include "DlgService.h"
  6. #include "afxdialogex.h"
  7. #include "SATClient.h"
  8. //#include "SATProtocol.h"
  9. #include "SVNProc.h"
  10. // CDlgService 对话框
  11. IMPLEMENT_DYNAMIC(CDlgService, CDialogEx)
  12. CDlgService::CDlgService(CWnd* pParent /*=nullptr*/)
  13. : CDialogEx(IDD_DLG_SERVICE, pParent)
  14. {
  15. m_bEnd = FALSE;
  16. }
  17. CDlgService::~CDlgService()
  18. {
  19. m_bEnd = TRUE;
  20. }
  21. void CDlgService::DoDataExchange(CDataExchange* pDX)
  22. {
  23. CDialogEx::DoDataExchange(pDX);
  24. DDX_Control(pDX, IDC_LIST_DEVICES, m_listDevices);
  25. DDX_Control(pDX, IDC_LIST_TASK, m_listTask);
  26. DDX_Control(pDX, BTN_MODIFY_RUNNER_NAME, m_btnModify);
  27. DDX_Control(pDX, BTN_ADD_ANDROID, m_btnAddAndroid);
  28. DDX_Control(pDX, BTN_MI_INIT, m_btnMIInit);
  29. DDX_Control(pDX, BTN_SCBC_INIT, m_btnSCBCInit);
  30. DDX_Control(pDX, BTN_SVN_UPDATE, m_btnSVNUpdate);
  31. DDX_Control(pDX, TX_TASKID, m_ctrlTaskId);
  32. DDX_Control(pDX, LABLE_TASK_STATUS, m_lbTaskStatus);
  33. }
  34. BEGIN_MESSAGE_MAP(CDlgService, CDialogEx)
  35. ON_WM_PAINT()
  36. ON_WM_CTLCOLOR()
  37. ON_BN_CLICKED(BTN_MODIFY_RUNNER_NAME, &CDlgService::OnBnClickedModifyRunnerName)
  38. ON_BN_CLICKED(BTN_ADD_ANDROID, &CDlgService::OnBnClickedAddAndroid)
  39. ON_WM_TIMER()
  40. ON_NOTIFY(NM_RCLICK, IDC_LIST_DEVICES, &CDlgService::OnNMRClickListDevices)
  41. ON_COMMAND(ID_DEVICES_DEL, &CDlgService::OnDevicesDel)
  42. ON_BN_CLICKED(BTN_MI_INIT, &CDlgService::OnBnClickedMiInit)
  43. ON_BN_CLICKED(BTN_SCBC_INIT, &CDlgService::OnBnClickedScbcInit)
  44. ON_WM_SIZE()
  45. ON_NOTIFY(NM_DBLCLK, IDC_LIST_TASK, &CDlgService::OnNMDblclkListTask)
  46. ON_BN_CLICKED(BTN_SVN_UPDATE, &CDlgService::OnBnClickedSvnUpdate)
  47. END_MESSAGE_MAP()
  48. // CDlgService 消息处理程序
  49. BOOL CDlgService::OnInitDialog()
  50. {
  51. CDialogEx::OnInitDialog();
  52. // TODO: 在此添加额外的初始化
  53. // 做为子窗口,这里设置透明度没有任何效果;
  54. // SetLayeredWindowAttributes(RGB(1, 2, 3), 0, LWA_COLORKEY/*|LWA_ALPHA*/);
  55. InitCtrl();
  56. FillData2Ctrl();
  57. #if 0
  58. // 5秒刷新一次;
  59. SetTimer(0, 5000, NULL);
  60. SetTimer(1, 10000, NULL);
  61. #else
  62. std::thread t([](CDlgService *p) {
  63. while (!p->m_bEnd)
  64. {
  65. std::this_thread::sleep_for(std::chrono::milliseconds(2500));
  66. {
  67. CSATClient::GetInstance()->TCPQueryDevices(FALSE);
  68. int nIndex = 0;
  69. TCHAR szValue[MAX_PATH] = { 0 };
  70. p->m_listDevices.DeleteAllItems();
  71. for (std::vector<SATPROTO::Device>::iterator it = SATData::devices.begin(); it != SATData::devices.end(); it++) {
  72. _itoa_s(nIndex, szValue, 10);
  73. p->m_listDevices.InsertItem(nIndex, szValue);
  74. if (it->nType == 0)
  75. p->m_listDevices.SetItemText(nIndex, 0, "虚拟");
  76. else if (it->nType == 1)
  77. p->m_listDevices.SetItemText(nIndex, 0, "USB");
  78. else if (it->nType == 2)
  79. p->m_listDevices.SetItemText(nIndex, 0, "网络");
  80. // 名称;
  81. p->m_listDevices.SetItemText(nIndex, 1, it->szName);
  82. if (it->nStatus == 0)
  83. p->m_listDevices.SetItemText(nIndex, 2, "在线");
  84. else if (it->nStatus == 1)
  85. p->m_listDevices.SetItemText(nIndex, 2, "离线");
  86. else if ( it->nStatus == 2 )
  87. p->m_listDevices.SetItemText(nIndex, 2, "掉线");
  88. else if (it->nStatus == 3)
  89. p->m_listDevices.SetItemText(nIndex, 2, "未认证");
  90. nIndex++;
  91. }
  92. }
  93. }
  94. OutputDebugString("退出刷新设备线程\n");
  95. },this);
  96. t.detach();
  97. std::thread t2([](CDlgService* p) {
  98. while (!p->m_bEnd)
  99. {
  100. std::this_thread::sleep_for(std::chrono::milliseconds(10000));
  101. {
  102. CSATClient::GetInstance()->TCPQueryTasks(FALSE);
  103. int nIndex = 0;
  104. p->m_listTask.DeleteAllItems();
  105. TCHAR szValue[MAX_PATH] = { 0 };
  106. for (int i = 0; i < SATData::task_resp.nSize; i++) {
  107. // 任务编号;
  108. p->m_ctrlTaskId.SetWindowText(_T(""));
  109. p->m_ctrlTaskId.SetWindowText(SATData::task_resp.ssTasks[i].szTaskNo);
  110. // 任务状态;
  111. p->m_lbTaskStatus.SetWindowText(_T(""));
  112. p->m_lbTaskStatus.SetWindowText(SATData::task_resp.ssTasks[i].szStatus);
  113. if (SATData::task_resp.ssTasks[i].nCaseSize) {
  114. // 遍历出所有用例;
  115. TCHAR szIndex[8] = { 0 };
  116. // 脚本数量;
  117. int nSize = SATData::task_resp.ssTasks[i].nCaseSize;
  118. if (nSize > SATPROTO::MAX_CASES)
  119. nSize = SATPROTO::MAX_CASES;
  120. for (int k = 0; k < nSize; k++) {
  121. _itoa_s(k, szIndex, 10);
  122. SATPROTO::CaseInfo& caseInfo = SATData::task_resp.ssTasks[i].ssCases[k];
  123. p->m_listTask.InsertItem(nIndex, szIndex);
  124. p->m_listTask.SetItemText(nIndex, 1, caseInfo.szCaseName);
  125. p->m_listTask.SetItemText(nIndex, 2, caseInfo.szExecStatus);
  126. p->m_listTask.SetItemText(nIndex, 3, caseInfo.szResultStatus);
  127. p->m_listTask.SetItemText(nIndex, 4, caseInfo.szCaseLogPath);
  128. }
  129. }
  130. nIndex++;
  131. }
  132. }
  133. }
  134. OutputDebugString("退出刷新任务线程\n");
  135. }, this);
  136. t2.detach();
  137. #endif
  138. return TRUE; // return TRUE unless you set the focus to a control
  139. // 异常: OCX 属性页应返回 FALSE
  140. }
  141. void CDlgService::OnPaint()
  142. {
  143. CPaintDC dc(this); // device context for painting
  144. // TODO: 在此处添加消息处理程序代码
  145. // 不为绘图消息调用 CDialogEx::OnPaint()
  146. CRect rc;
  147. GetClientRect(rc);
  148. CBrush brush;
  149. brush.CreateSolidBrush(0xFFEFD5);
  150. dc.FillRect(&rc, &brush);
  151. }
  152. void CDlgService::InitCtrl()
  153. {
  154. int nIndex = 0;
  155. // 初始化设备列表;
  156. m_listDevices.InsertColumn(nIndex, "类型");
  157. m_listDevices.SetColumnWidth(nIndex++, 38);
  158. m_listDevices.InsertColumn(nIndex, "TV名称");
  159. m_listDevices.SetColumnWidth(nIndex++, 115);
  160. m_listDevices.InsertColumn(nIndex, "状态");
  161. m_listDevices.SetColumnWidth(nIndex++, 38);
  162. m_listDevices.SetExtendedStyle(m_listDevices.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
  163. // 初始化任务列表;
  164. m_listTask.InsertColumn(0, "No");
  165. m_listTask.SetColumnWidth(0, 25);
  166. m_listTask.InsertColumn(1, "脚本名称");
  167. m_listTask.SetColumnWidth(1, 130);
  168. m_listTask.InsertColumn(2, "执行状态");
  169. m_listTask.SetColumnWidth(2, 60);
  170. m_listTask.InsertColumn(3, "结果状态");
  171. m_listTask.SetColumnWidth(3, 60);
  172. m_listTask.InsertColumn(4, "日志");
  173. m_listTask.SetColumnWidth(4, 55);
  174. m_listTask.SetExtendedStyle(m_listTask.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
  175. COLORREF color = RGB(0x87, 0xCE, 0xFA);
  176. // 修改按钮默认样式;
  177. m_btnModify.m_bTransparent = FALSE;
  178. m_btnModify.m_bDontUseWinXPTheme = TRUE;
  179. // 设置背景色;
  180. m_btnModify.SetFaceColor(color, TRUE);
  181. // 消除单击时黑色内圈;
  182. m_btnModify.m_bDrawFocus = FALSE;
  183. // 设置按钮扁平样式;
  184. m_btnModify.m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
  185. // 设置鼠标形状;
  186. m_btnModify.SetMouseCursorHand();
  187. m_btnAddAndroid.m_bTransparent = FALSE;
  188. m_btnAddAndroid.m_bDontUseWinXPTheme = TRUE;
  189. // 设置背景色;
  190. m_btnAddAndroid.SetFaceColor(color, TRUE);
  191. // 消除单击时黑色内圈;
  192. m_btnAddAndroid.m_bDrawFocus = FALSE;
  193. // 设置按钮扁平样式;
  194. m_btnAddAndroid.m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
  195. // 设置鼠标形状;
  196. m_btnAddAndroid.SetMouseCursorHand();
  197. //color = RGB(0x87, 0xCE, 0xFA);
  198. m_btnMIInit.m_bTransparent = FALSE;
  199. m_btnMIInit.m_bDontUseWinXPTheme = TRUE;
  200. // 设置背景色;
  201. m_btnMIInit.SetFaceColor(color, TRUE);
  202. // 消除单击时黑色内圈;
  203. m_btnMIInit.m_bDrawFocus = FALSE;
  204. // 设置按钮扁平样式;
  205. m_btnMIInit.m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
  206. // 设置鼠标形状;
  207. m_btnMIInit.SetMouseCursorHand();
  208. m_btnSCBCInit.m_bTransparent = FALSE;
  209. m_btnSCBCInit.m_bDontUseWinXPTheme = TRUE;
  210. // 设置背景色;
  211. m_btnSCBCInit.SetFaceColor(color, TRUE);
  212. // 消除单击时黑色内圈;
  213. m_btnSCBCInit.m_bDrawFocus = FALSE;
  214. // 设置按钮扁平样式;
  215. m_btnSCBCInit.m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
  216. // 设置鼠标形状;
  217. m_btnSCBCInit.SetMouseCursorHand();
  218. color = RGB(237, 28, 36);
  219. m_btnSVNUpdate.m_bTransparent = FALSE;
  220. m_btnSVNUpdate.m_bDontUseWinXPTheme = TRUE;
  221. // 设置背景色;
  222. m_btnSVNUpdate.SetFaceColor(color, TRUE);
  223. // 消除单击时黑色内圈;
  224. m_btnSVNUpdate.m_bDrawFocus = FALSE;
  225. // 设置按钮扁平样式;
  226. m_btnSVNUpdate.m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
  227. // 设置鼠标形状;
  228. m_btnSVNUpdate.SetMouseCursorHand();
  229. }
  230. void CDlgService::FillData2Ctrl()
  231. {
  232. SetDlgItemText(IDC_EDIT_RUNNER_NAME, Global::g_Config.strActuator.c_str());
  233. }
  234. void CDlgService::AdjustLayout()
  235. {
  236. // 窗口;
  237. CRect rcWnd;
  238. // 控件;
  239. CRect rcCtrl;
  240. // 获取窗口大小;
  241. GetClientRect(&rcWnd);
  242. CWnd* pLableIP = GetDlgItem(LABLE_IP);
  243. CWnd* pLableName = GetDlgItem(LABLE_NAME);
  244. CWnd* pCtrlName = GetDlgItem(IDC_EDIT_RUNNER_NAME);
  245. CWnd* pCtrlIP = GetDlgItem(IDC_IP_ANDROID);
  246. if (pLableIP == NULL)
  247. return;
  248. // 第一行;
  249. pLableName->GetWindowRect(rcCtrl);
  250. ScreenToClient(&rcCtrl);
  251. int nWidth = rcCtrl.Width();
  252. pCtrlName->SetWindowPos(nullptr, rcCtrl.right, rcCtrl.top, (rcWnd.Width() - nWidth - 15 ) * 5 / 7, 23, SWP_NOACTIVATE | SWP_NOZORDER);
  253. pCtrlName->GetWindowRect(rcCtrl);
  254. ScreenToClient(&rcCtrl);
  255. m_btnModify.SetWindowPos(nullptr, rcCtrl.right + 5, rcCtrl.top, (rcWnd.Width() - nWidth - 10) * 2 / 7, 23, SWP_NOACTIVATE | SWP_NOZORDER);
  256. // 第二行;
  257. pLableIP->GetWindowRect(rcCtrl);
  258. ScreenToClient(&rcCtrl);
  259. pCtrlIP->SetWindowPos(nullptr, rcCtrl.right, rcCtrl.top, (rcWnd.Width() - nWidth - 15) * 5 / 7, 23, SWP_NOACTIVATE | SWP_NOZORDER);
  260. pCtrlIP->GetWindowRect(rcCtrl);
  261. ScreenToClient(&rcCtrl);
  262. m_btnAddAndroid.SetWindowPos(nullptr, rcCtrl.right + 5, rcCtrl.top, (rcWnd.Width() - nWidth - 10) * 2 / 7, 23, SWP_NOACTIVATE | SWP_NOZORDER);
  263. //::MoveWindow(m_btnAddAndroid.m_hWnd, rcCtrl.right + 5, rcCtrl.top, (rcWnd.Width() - nWidth - 10) * 2 / 7, 23, TRUE);
  264. // 第三行;
  265. m_listDevices.GetWindowRect(rcCtrl);
  266. ScreenToClient(&rcCtrl);
  267. m_listDevices.SetWindowPos(nullptr, rcCtrl.left, rcCtrl.top, rcWnd.Width() - 10, rcCtrl.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
  268. // 第四行;
  269. nWidth = (rcWnd.Width() - 30) / 3;
  270. m_btnMIInit.GetWindowRect(rcCtrl);
  271. ScreenToClient(&rcCtrl);
  272. m_btnMIInit.SetWindowPos(nullptr, rcCtrl.left, rcCtrl.top, nWidth, rcCtrl.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
  273. m_btnMIInit.GetWindowRect(rcCtrl);
  274. ScreenToClient(&rcCtrl);
  275. m_btnSCBCInit.SetWindowPos(nullptr, rcCtrl.right + 10, rcCtrl.top, nWidth, rcCtrl.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
  276. m_btnSCBCInit.GetWindowRect(rcCtrl);
  277. ScreenToClient(&rcCtrl);
  278. m_btnSVNUpdate.SetWindowPos(nullptr, rcCtrl.right + 10, rcCtrl.top, nWidth, rcCtrl.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
  279. // 第五行;
  280. CWnd* pLableTask = GetDlgItem(LABLE_TASK);
  281. CWnd* pLableTaskStatus = GetDlgItem(LABLE_TASK_STATUS);
  282. CWnd* pCtrlTaskID = GetDlgItem(TX_TASKID);
  283. pLableTask->GetWindowRect(rcCtrl);
  284. ScreenToClient(&rcCtrl);
  285. nWidth = rcCtrl.Width();
  286. pCtrlTaskID->SetWindowPos(nullptr, rcCtrl.right, rcCtrl.top - 3, rcWnd.Width() - nWidth * 2 - 15, 23, SWP_NOACTIVATE | SWP_NOZORDER);
  287. pCtrlTaskID->GetWindowRect(rcCtrl);
  288. ScreenToClient(&rcCtrl);
  289. pLableTaskStatus->SetWindowPos(nullptr, rcCtrl.right + 5, rcCtrl.top, nWidth, 23, SWP_NOACTIVATE | SWP_NOZORDER);
  290. // 第六行;
  291. m_listTask.GetWindowRect(rcCtrl);
  292. ScreenToClient(&rcCtrl);
  293. m_listTask.SetWindowPos(nullptr, rcCtrl.left, rcCtrl.top, rcWnd.Width() - 10, rcWnd.Height() - rcCtrl.top - 10, SWP_NOACTIVATE | SWP_NOZORDER);
  294. }
  295. void CDlgService::OnBnClickedModifyRunnerName()
  296. {
  297. // TODO: 在此添加控件通知处理程序代码
  298. CString strActuator;
  299. GetDlgItemText(IDC_EDIT_RUNNER_NAME, strActuator);
  300. Global::g_Config.strActuator = strActuator.GetString();
  301. WritePrivateProfileString(_T("SATService"), _T("Actuator"), strActuator, Global::g_szConfig);
  302. CSATClient::GetInstance()->TCPLogin(Global::g_Config.strSATUserName, Global::g_Config.strSATPassword, Global::g_Config.strActuator);
  303. }
  304. void CDlgService::OnBnClickedAddAndroid()
  305. {
  306. // TODO: 在此添加控件通知处理程序代码
  307. CIPAddressCtrl* pIP = (CIPAddressCtrl*)GetDlgItem(IDC_IP_ANDROID);
  308. // 获取IP地址;
  309. BYTE nf1, nf2, nf3, nf4;
  310. pIP->GetAddress(nf1, nf2, nf3, nf4);
  311. CString str;
  312. str.Format("%d.%d.%d.%d", nf1, nf2, nf3, nf4);//这里的nf得到的值是IP值了
  313. if (str.IsEmpty())
  314. return;
  315. CSATClient::GetInstance()->TCPAddDevice(str.GetString());
  316. }
  317. void CDlgService::OnTimer(UINT_PTR nIDEvent)
  318. {
  319. // TODO: 在此添加消息处理程序代码和/或调用默认值
  320. CDialogEx::OnTimer(nIDEvent);
  321. }
  322. void CDlgService::OnOK()
  323. {
  324. // TODO: 在此添加专用代码和/或调用基类
  325. //CDialogEx::OnOK();
  326. }
  327. void CDlgService::OnCancel()
  328. {
  329. // TODO: 在此添加专用代码和/或调用基类
  330. //CDialogEx::OnCancel();
  331. }
  332. void CDlgService::OnNMRClickListDevices(NMHDR* pNMHDR, LRESULT* pResult)
  333. {
  334. LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
  335. // TODO: 在此添加控件通知处理程序代码
  336. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  337. if (pNMListView->iItem != -1)
  338. {
  339. CString strType = m_listDevices.GetItemText(pNMListView->iItem, 0);
  340. // 过滤掉虚拟设备;
  341. if (!strType.CompareNoCase(_T("虚拟")))
  342. return;
  343. DWORD dwPos = GetMessagePos();
  344. CPoint point(LOWORD(dwPos), HIWORD(dwPos));
  345. CMenu menu;
  346. //添加线程操作
  347. if (!menu.LoadMenu(IDR_POPUP_DEVICES)) //这里是我们在1中定义的MENU的文件名称
  348. return;
  349. CMenu* popup = menu.GetSubMenu(0);
  350. ASSERT(popup != NULL);
  351. popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
  352. }
  353. *pResult = 0;
  354. }
  355. void CDlgService::OnDevicesDel()
  356. {
  357. // TODO: 在此添加命令处理程序代码
  358. // 获取选中的设备;
  359. POSITION pos = m_listDevices.GetFirstSelectedItemPosition();
  360. if (pos != NULL)
  361. {
  362. int nSelCur = m_listDevices.GetNextSelectedItem(pos);
  363. if (nSelCur != -1)
  364. {
  365. CString strDeviceType = m_listDevices.GetItemText(nSelCur, 0);
  366. CString strDeviceName = m_listDevices.GetItemText(nSelCur, 1);
  367. if (!strDeviceName.IsEmpty() && strDeviceType.CompareNoCase(_T("虚拟")))
  368. {
  369. MessageBox(_T("即将删除设备:") + strDeviceName, _T("温馨提示!"), MB_ICONWARNING);
  370. CSATClient::GetInstance()->TCPDelDevice(strDeviceName.GetString());
  371. // 同时删除该项;
  372. m_listDevices.DeleteItem(nSelCur);
  373. }
  374. }
  375. }
  376. }
  377. void CDlgService::OnBnClickedMiInit()
  378. {
  379. // TODO: 在此添加控件通知处理程序代码
  380. if (Global::g_Config.strMIInitBat.size())
  381. {
  382. //WinExec(Global::g_Config.strMIInitBat.c_str(), SW_HIDE);
  383. ShellExecute(NULL, _T("open"), Global::g_Config.strMIInitBat.c_str(), NULL, NULL, SW_SHOW);
  384. }
  385. }
  386. void CDlgService::OnBnClickedScbcInit()
  387. {
  388. if (Global::g_Config.strSCBCInitBat.size())
  389. {
  390. // TODO: 在此添加控件通知处理程序代码
  391. //WinExec(Global::g_Config.strMIInitBat.c_str(), SW_HIDE);
  392. ShellExecute(NULL, _T("open"), Global::g_Config.strSCBCInitBat.c_str(), NULL, NULL, SW_SHOW);
  393. }
  394. }
  395. void CDlgService::OnSize(UINT nType, int cx, int cy)
  396. {
  397. CDialogEx::OnSize(nType, cx, cy);
  398. AdjustLayout();
  399. // TODO: 在此处添加消息处理程序代码
  400. }
  401. void CDlgService::OnNMDblclkListTask(NMHDR* pNMHDR, LRESULT* pResult)
  402. {
  403. LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
  404. // TODO: 在此添加控件通知处理程序代码
  405. *pResult = 0;
  406. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  407. if (pNMListView->iItem != -1)
  408. {
  409. CString strLogPath = m_listTask.GetItemText(pNMListView->iItem, 4);
  410. // 路径不存在,退出;
  411. if (!PathFileExists(strLogPath))
  412. return;
  413. ShellExecute(NULL, _T("open"), strLogPath.GetString(), NULL, NULL, SW_SHOW);
  414. }
  415. }
  416. void CDlgService::OnBnClickedSvnUpdate()
  417. {
  418. // TODO: 在此添加控件通知处理程序代码
  419. CSVNMgr::GetInstance()->Update();
  420. if (CSVNMgr::GetInstance()->HasNewVersion())
  421. {
  422. // 还要更新,则表示失败;
  423. MessageBox(_T("更新失败"), _T("更新结果:"), MB_OK|MB_ICONWARNING);
  424. }
  425. else
  426. {
  427. MessageBox(_T("更新成功,版本号为 ") + CSVNMgr::GetInstance()->GetVersion(), _T("更新结果:"), MB_OK);
  428. CString strVersionInfo;
  429. strVersionInfo.Format(_T("SATHelper 版本 %s, SAT 版本 %s"), Global::g_szVersion, CSVNMgr::GetInstance()->GetVersion());
  430. AfxGetMainWnd()->SetWindowText(strVersionInfo);
  431. CSVNMgr::GetInstance()->Store();
  432. }
  433. }