DevicesWnd.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  1. // 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
  2. // (“Fluent UI”)。该示例仅供参考,
  3. // 用以补充《Microsoft 基础类参考》和
  4. // MFC C++ 库软件随附的相关电子文档。
  5. // 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
  6. // 若要了解有关 Fluent UI 许可计划的详细信息,请访问
  7. // https://go.microsoft.com/fwlink/?LinkId=238214.
  8. //
  9. // 版权所有(C) Microsoft Corporation
  10. // 保留所有权利。
  11. #include "stdafx.h"
  12. #include "framework.h"
  13. #include "DevicesWnd.h"
  14. #include "Resource.h"
  15. #include "MainFrm.h"
  16. #include "SATHelper.h"
  17. #include <filehelper.h>
  18. #include "SATClient.h"
  19. #include "SVNProc.h"
  20. #ifdef _DEBUG
  21. #undef THIS_FILE
  22. static char THIS_FILE[] = __FILE__;
  23. #define new DEBUG_NEW
  24. #endif
  25. extern CMainFrame* g_pMainFrame;
  26. // 重启进程按钮id;
  27. #define ID_BUTTON_RESTART_PROC 4
  28. // 复制框控件id;
  29. #define ID_CHECKBOX_SIGNAL_TYPE 5
  30. // 下拉框控件id;
  31. #define ID_COMBOBOX_SIGNAL_FILE 6
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CResourceViewBar
  34. CDevicesWnd::CDevicesWnd() noexcept
  35. {
  36. m_bEnd = FALSE;
  37. }
  38. int CDevicesWnd::InitCtrl()
  39. {
  40. CRect rectDummy(0, 0, 50, 23);
  41. m_lb_Actuator.Create(GlobalString::g_strActuator, SS_CENTER | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE, rectDummy, this, IDC_STATIC);
  42. m_lb_IP.Create(GlobalString::g_strActuatorTVIP, SS_CENTER | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE, rectDummy, this, IDC_STATIC);
  43. m_lb_TaskId.Create(GlobalString::g_strActuatorTaskID, SS_CENTER | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE, rectDummy, this, IDC_STATIC);
  44. m_lb_TaskStatus.Create(GlobalString::g_strActuatorTaskStatus, SS_CENTER | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE, rectDummy, this, IDC_STATIC);
  45. if (!m_edit_TaskId.Create(WS_BORDER | WS_CHILD | WS_VISIBLE | ES_READONLY | WS_TABSTOP, rectDummy, this, TX_TASKID))
  46. {
  47. return -1;
  48. }
  49. if (!m_edit_Actuator.Create(WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, rectDummy, this, IDC_EDIT_RUNNER_NAME))
  50. {
  51. return -1;
  52. }
  53. if (!m_edit_TVIP.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP, CRect(0,0,135,23), this, LABLE_IP))
  54. {
  55. return -1;
  56. }
  57. if (!m_btnModify.Create(GlobalString::g_strActuatorModify, WS_CHILD | WS_VISIBLE | WS_TABSTOP, rectDummy, this, BTN_MODIFY_RUNNER_NAME))
  58. {
  59. return -1;
  60. }
  61. if (!m_btnAddAndroid.Create(GlobalString::g_strActuatorAddIP, WS_CHILD | WS_VISIBLE | WS_TABSTOP, rectDummy, this, BTN_ADD_ANDROID))
  62. {
  63. return -1;
  64. }
  65. if (!m_btnMIInit.Create(_T("mi Init"), WS_CHILD | WS_VISIBLE | WS_TABSTOP, rectDummy, this, BTN_MI_INIT))
  66. {
  67. return -1;
  68. }
  69. if (!m_btnSCBCInit.Create(_T("scbc Init"), WS_CHILD | WS_VISIBLE | WS_TABSTOP, rectDummy, this, BTN_SCBC_INIT))
  70. {
  71. return -1;
  72. }
  73. if (!m_btnSVNUpdate.Create(_T("SAT Update"), WS_CHILD | WS_VISIBLE | WS_TABSTOP, rectDummy, this, BTN_SVN_UPDATE))
  74. {
  75. return -1;
  76. }
  77. if (!m_listDevices.Create(WS_CHILD | WS_VISIBLE| LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP, rectDummy, this, IDC_LIST_DEVICES))
  78. {
  79. return -1;
  80. }
  81. if (!m_listTask.Create(WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP, rectDummy, this, IDC_LIST_TASK))
  82. {
  83. return -1;
  84. }
  85. SetDlgItemText(IDC_EDIT_RUNNER_NAME, Global::g_Config.strActuator.c_str());
  86. int nIndex = 0;
  87. // 初始化设备列表;
  88. m_listDevices.InsertColumn(nIndex, GlobalString::g_strListDeviceType);
  89. m_listDevices.SetColumnWidth(nIndex++, 39);
  90. m_listDevices.InsertColumn(nIndex, GlobalString::g_strListDeviceName);
  91. m_listDevices.SetColumnWidth(nIndex++, 115);
  92. m_listDevices.InsertColumn(nIndex, GlobalString::g_strListDeviceStatus);
  93. m_listDevices.SetColumnWidth(nIndex++, 50);
  94. m_listDevices.SetExtendedStyle(m_listDevices.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
  95. // 初始化任务列表;
  96. m_listTask.InsertColumn(0, GlobalString::g_strListTaskNo);
  97. m_listTask.SetColumnWidth(0, 30);
  98. m_listTask.InsertColumn(1, GlobalString::g_strListTaskScript);
  99. m_listTask.SetColumnWidth(1, 130);
  100. m_listTask.InsertColumn(2, GlobalString::g_strListTaskRunStatus);
  101. m_listTask.SetColumnWidth(2, 65);
  102. m_listTask.InsertColumn(3, GlobalString::g_strListTaskResult);
  103. m_listTask.SetColumnWidth(3, 60);
  104. m_listTask.InsertColumn(4, GlobalString::g_strListTaskLog);
  105. m_listTask.SetColumnWidth(4, 55);
  106. m_listTask.SetExtendedStyle(m_listTask.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
  107. COLORREF color = RGB(0x87, 0xCE, 0xFA);
  108. // 修改按钮默认样式;
  109. m_btnModify.m_bTransparent = FALSE;
  110. m_btnModify.m_bDontUseWinXPTheme = TRUE;
  111. // 设置背景色;
  112. m_btnModify.SetFaceColor(color, TRUE);
  113. // 消除单击时黑色内圈;
  114. m_btnModify.m_bDrawFocus = FALSE;
  115. // 设置按钮扁平样式;
  116. m_btnModify.m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
  117. // 设置鼠标形状;
  118. m_btnModify.SetMouseCursorHand();
  119. m_btnAddAndroid.m_bTransparent = FALSE;
  120. m_btnAddAndroid.m_bDontUseWinXPTheme = TRUE;
  121. // 设置背景色;
  122. m_btnAddAndroid.SetFaceColor(color, TRUE);
  123. // 消除单击时黑色内圈;
  124. m_btnAddAndroid.m_bDrawFocus = FALSE;
  125. // 设置按钮扁平样式;
  126. m_btnAddAndroid.m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
  127. // 设置鼠标形状;
  128. m_btnAddAndroid.SetMouseCursorHand();
  129. //color = RGB(0x87, 0xCE, 0xFA);
  130. m_btnMIInit.m_bTransparent = FALSE;
  131. m_btnMIInit.m_bDontUseWinXPTheme = TRUE;
  132. // 设置背景色;
  133. m_btnMIInit.SetFaceColor(color, TRUE);
  134. // 消除单击时黑色内圈;
  135. m_btnMIInit.m_bDrawFocus = FALSE;
  136. // 设置按钮扁平样式;
  137. m_btnMIInit.m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
  138. // 设置鼠标形状;
  139. m_btnMIInit.SetMouseCursorHand();
  140. m_btnSCBCInit.m_bTransparent = FALSE;
  141. m_btnSCBCInit.m_bDontUseWinXPTheme = TRUE;
  142. // 设置背景色;
  143. m_btnSCBCInit.SetFaceColor(color, TRUE);
  144. // 消除单击时黑色内圈;
  145. m_btnSCBCInit.m_bDrawFocus = FALSE;
  146. // 设置按钮扁平样式;
  147. m_btnSCBCInit.m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
  148. // 设置鼠标形状;
  149. m_btnSCBCInit.SetMouseCursorHand();
  150. color = RGB(237, 28, 36);
  151. m_btnSVNUpdate.m_bTransparent = FALSE;
  152. m_btnSVNUpdate.m_bDontUseWinXPTheme = TRUE;
  153. // 设置背景色;
  154. m_btnSVNUpdate.SetFaceColor(color, TRUE);
  155. // 消除单击时黑色内圈;
  156. m_btnSVNUpdate.m_bDrawFocus = FALSE;
  157. // 设置按钮扁平样式;
  158. m_btnSVNUpdate.m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
  159. // 设置鼠标形状;
  160. m_btnSVNUpdate.SetMouseCursorHand();
  161. return 0;
  162. }
  163. CDevicesWnd::~CDevicesWnd()
  164. {
  165. RedRat::UnloadLibrary();
  166. }
  167. BEGIN_MESSAGE_MAP(CDevicesWnd, CDockablePane)
  168. ON_WM_CREATE()
  169. ON_WM_SIZE()
  170. // 按钮;
  171. ON_COMMAND(BTN_MODIFY_RUNNER_NAME, OnBtnActuatorClick)
  172. ON_UPDATE_COMMAND_UI(BTN_MODIFY_RUNNER_NAME, OnUpdateBtnActuator)
  173. ON_COMMAND(BTN_ADD_ANDROID, OnBtnAddTVIPClick)
  174. ON_UPDATE_COMMAND_UI(BTN_ADD_ANDROID, OnUpdateBtnAddTVIP)
  175. ON_COMMAND(BTN_MI_INIT, OnBtnMiInitClick)
  176. ON_UPDATE_COMMAND_UI(BTN_MI_INIT, OnUpdateBtnMiInit)
  177. ON_COMMAND(BTN_SCBC_INIT, OnBtnScbcInitClick)
  178. ON_UPDATE_COMMAND_UI(BTN_SCBC_INIT, OnUpdateBtnScbcInit)
  179. ON_COMMAND(BTN_SVN_UPDATE, OnBtnSATUpdateClick)
  180. ON_UPDATE_COMMAND_UI(BTN_SVN_UPDATE, OnUpdateBtnSATUpdate)
  181. // end
  182. ON_COMMAND(ID_EXPAND_ALL, OnExpandAllProperties)
  183. ON_UPDATE_COMMAND_UI(ID_EXPAND_ALL, OnUpdateExpandAllProperties)
  184. ON_COMMAND(ID_SORTPROPERTIES, OnSortProperties)
  185. ON_UPDATE_COMMAND_UI(ID_SORTPROPERTIES, OnUpdateSortProperties)
  186. ON_COMMAND(ID_PROPERTIES1, OnProperties1)
  187. ON_UPDATE_COMMAND_UI(ID_PROPERTIES1, OnUpdateProperties1)
  188. ON_COMMAND(ID_PROPERTIES2, OnProperties2)
  189. ON_UPDATE_COMMAND_UI(ID_PROPERTIES2, OnUpdateProperties2)
  190. ON_WM_SETFOCUS()
  191. ON_WM_SETTINGCHANGE()
  192. ON_WM_PAINT()
  193. ON_WM_CTLCOLOR()
  194. ON_WM_CONTEXTMENU()
  195. ON_COMMAND(ID_DEVICES_DEL, &CDevicesWnd::OnDevicesDel)
  196. ON_NOTIFY(NM_DBLCLK, IDC_LIST_TASK, &CDevicesWnd::OnNMDblclkListTask)
  197. ON_NOTIFY(NM_RCLICK, IDC_LIST_DEVICES, &CDlgService::OnNMRClickListDevices)
  198. END_MESSAGE_MAP()
  199. /////////////////////////////////////////////////////////////////////////////
  200. // CResourceViewBar 消息处理程序
  201. void CDevicesWnd::AdjustLayout()
  202. {
  203. if (GetSafeHwnd() == nullptr || (AfxGetMainWnd() != nullptr && AfxGetMainWnd()->IsIconic()))
  204. {
  205. return;
  206. }
  207. #if 0
  208. CRect rectClient;
  209. GetClientRect(rectClient);
  210. m_dlgService.SetWindowPos(nullptr, rectClient.left, rectClient.top, rectClient.Width() - 5, rectClient.Height(), SWP_NOACTIVATE);
  211. #else
  212. CRect rcCtrl;
  213. // 获取窗口大小;
  214. CRect rectClient;
  215. // 控件;
  216. GetClientRect(&rectClient);
  217. int nWidth = 0;
  218. const int dr = 3; // 行间距
  219. const int dc = 5; // 列间距;
  220. const int top = 10; // 离顶部距离;
  221. const int margin = 6;
  222. int nHeight = top;
  223. // 第一行;
  224. m_lb_Actuator.GetWindowRect(rcCtrl);
  225. ScreenToClient(&rcCtrl);
  226. m_lb_Actuator.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + top, rcCtrl.Width(), m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  227. nWidth = rcCtrl.Width() + margin + dc;
  228. m_edit_Actuator.SetWindowPos(nullptr, nWidth, rectClient.top + top, (rectClient.Width() - nWidth - dc - margin) * 5 / 7, m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  229. m_edit_Actuator.GetWindowRect(rcCtrl);
  230. nWidth += rcCtrl.Width() + dc;
  231. m_btnModify.GetWindowRect(rcCtrl);
  232. ScreenToClient(&rcCtrl);
  233. m_btnModify.SetWindowPos(nullptr, nWidth, rectClient.top + top, rectClient.Width() - nWidth - margin, m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  234. nHeight += m_nNormalHeight + dr;
  235. // 第二行;
  236. m_lb_IP.GetWindowRect(rcCtrl);
  237. ScreenToClient(&rcCtrl);
  238. m_lb_IP.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + nHeight, rcCtrl.Width(), m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  239. nWidth = rcCtrl.Width() + margin + dc;
  240. m_edit_TVIP.SetWindowPos(nullptr, nWidth, rectClient.top + nHeight, (rectClient.Width() - nWidth - dc - margin) * 5 / 7, m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  241. m_edit_TVIP.GetWindowRect(rcCtrl);
  242. nWidth += rcCtrl.Width() + dc;
  243. m_btnAddAndroid.GetWindowRect(rcCtrl);
  244. ScreenToClient(&rcCtrl);
  245. m_btnAddAndroid.SetWindowPos(nullptr, nWidth, rectClient.top + nHeight, rectClient.Width() - nWidth - margin, m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  246. nHeight += m_nNormalHeight + dr;
  247. // 第三行;
  248. m_listDevices.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + nHeight, rectClient.Width() - margin*2, 120, SWP_NOACTIVATE | SWP_NOZORDER);
  249. m_listDevices.GetWindowRect(rcCtrl);
  250. nHeight += 120 + dr;
  251. // 第四行;
  252. nWidth = (rectClient.Width() - margin * 2 - dc * 2) / 3;
  253. m_btnMIInit.GetWindowRect(rcCtrl);
  254. ScreenToClient(&rcCtrl);
  255. m_btnMIInit.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + nHeight, nWidth, rcCtrl.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
  256. m_btnMIInit.GetWindowRect(rcCtrl);
  257. ScreenToClient(&rcCtrl);
  258. m_btnSCBCInit.SetWindowPos(nullptr, rectClient.left + margin + nWidth + dc, rectClient.top + nHeight, nWidth, rcCtrl.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
  259. m_btnSCBCInit.GetWindowRect(rcCtrl);
  260. ScreenToClient(&rcCtrl);
  261. m_btnSVNUpdate.SetWindowPos(nullptr, rectClient.left + margin + nWidth * 2 + dc * 2, rectClient.top + nHeight, nWidth, rcCtrl.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
  262. nHeight += rcCtrl.Height() + 30;
  263. // 第五行;
  264. m_lb_TaskId.GetWindowRect(rcCtrl);
  265. ScreenToClient(&rcCtrl);
  266. nWidth = rcCtrl.Width();
  267. m_lb_TaskId.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + nHeight, rcCtrl.Width(), m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  268. m_edit_TaskId.SetWindowPos(nullptr, rcCtrl.right + dc, rectClient.top + nHeight, rectClient.Width() - 2 * nWidth - margin * 2 - dc * 2, m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  269. m_edit_TaskId.GetWindowRect(rcCtrl);
  270. ScreenToClient(&rcCtrl);
  271. m_lb_TaskStatus.SetWindowPos(nullptr, rcCtrl.right + dc, rectClient.top + nHeight, nWidth, m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  272. nHeight += rcCtrl.Height() + dr;
  273. // 第六行;
  274. m_listTask.GetWindowRect(rcCtrl);
  275. ScreenToClient(&rcCtrl);
  276. m_listTask.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + nHeight, rectClient.Width() - margin*2, rectClient.Height() - nHeight - 10, SWP_NOACTIVATE | SWP_NOZORDER);
  277. #endif
  278. }
  279. int CDevicesWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
  280. {
  281. if (CDockablePane::OnCreate(lpCreateStruct) == -1)
  282. return -1;
  283. CRect rectDummy;
  284. rectDummy.SetRectEmpty();
  285. // 创建组合:
  286. const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_BORDER | CBS_SORT | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
  287. #if 0
  288. if (!m_dlgService.Create(IDD_DLG_SERVICE, this))
  289. {
  290. TRACE0("未能创建遥控器主窗口 \n");
  291. return -1; // 未能创建
  292. }
  293. m_dlgService.ShowWindow(SW_SHOW);
  294. #endif
  295. InitCtrl();
  296. // 设置最小窗体;
  297. SetMinSize((530, 260));
  298. // 校正布局;
  299. AdjustLayout();
  300. SetCtrlFont();
  301. std::thread t([](CDevicesWnd* p) {
  302. while (!p->m_bEnd)
  303. {
  304. std::this_thread::sleep_for(std::chrono::milliseconds(2500));
  305. {
  306. CSATClient::GetInstance()->TCPQueryDevices(FALSE);
  307. int nIndex = 0;
  308. TCHAR szValue[MAX_PATH] = { 0 };
  309. p->m_listDevices.DeleteAllItems();
  310. for (std::vector<SATPROTO::Device>::iterator it = SATData::devices.begin(); it != SATData::devices.end(); it++) {
  311. _itoa_s(nIndex, szValue, 10);
  312. p->m_listDevices.InsertItem(nIndex, szValue);
  313. if (it->nType == 0)
  314. p->m_listDevices.SetItemText(nIndex, 0, "虚拟");
  315. else if (it->nType == 1)
  316. p->m_listDevices.SetItemText(nIndex, 0, "USB");
  317. else if (it->nType == 2)
  318. p->m_listDevices.SetItemText(nIndex, 0, "网络");
  319. // 名称;
  320. p->m_listDevices.SetItemText(nIndex, 1, it->szName);
  321. if (it->nStatus == 0)
  322. p->m_listDevices.SetItemText(nIndex, 2, "在线");
  323. else if (it->nStatus == 1)
  324. p->m_listDevices.SetItemText(nIndex, 2, "离线");
  325. else if (it->nStatus == 2)
  326. p->m_listDevices.SetItemText(nIndex, 2, "掉线");
  327. else if (it->nStatus == 3)
  328. p->m_listDevices.SetItemText(nIndex, 2, "未认证");
  329. nIndex++;
  330. }
  331. }
  332. }
  333. OutputDebugString("退出刷新设备线程\n");
  334. }, this);
  335. t.detach();
  336. std::thread t2([](CDevicesWnd* p) {
  337. while (!p->m_bEnd)
  338. {
  339. std::this_thread::sleep_for(std::chrono::milliseconds(10000));
  340. {
  341. CSATClient::GetInstance()->TCPQueryTasks(FALSE);
  342. int nIndex = 0;
  343. p->m_listTask.DeleteAllItems();
  344. TCHAR szValue[MAX_PATH] = { 0 };
  345. for (int i = 0; i < SATData::task_resp.nSize; i++) {
  346. // 任务编号;
  347. p->m_edit_TaskId.SetWindowText(_T(""));
  348. p->m_edit_TaskId.SetWindowText(SATData::task_resp.ssTasks[i].szTaskNo);
  349. // 任务状态;
  350. p->m_lb_TaskStatus.SetWindowText(_T(""));
  351. p->m_lb_TaskStatus.SetWindowText(SATData::task_resp.ssTasks[i].szStatus);
  352. if (SATData::task_resp.ssTasks[i].nCaseSize) {
  353. // 遍历出所有用例;
  354. TCHAR szIndex[8] = { 0 };
  355. // 脚本数量;
  356. int nSize = SATData::task_resp.ssTasks[i].nCaseSize;
  357. if (nSize > SATPROTO::MAX_CASES)
  358. nSize = SATPROTO::MAX_CASES;
  359. for (int k = 0; k < nSize; k++) {
  360. _itoa_s(k, szIndex, 10);
  361. SATPROTO::CaseInfo& caseInfo = SATData::task_resp.ssTasks[i].ssCases[k];
  362. p->m_listTask.InsertItem(nIndex, szIndex);
  363. p->m_listTask.SetItemText(nIndex, 1, caseInfo.szCaseName);
  364. p->m_listTask.SetItemText(nIndex, 2, caseInfo.szExecStatus);
  365. p->m_listTask.SetItemText(nIndex, 3, caseInfo.szResultStatus);
  366. p->m_listTask.SetItemText(nIndex, 4, caseInfo.szCaseLogPath);
  367. }
  368. }
  369. nIndex++;
  370. }
  371. }
  372. }
  373. OutputDebugString("退出刷新任务线程\n");
  374. }, this);
  375. t2.detach();
  376. return 0;
  377. }
  378. void CDevicesWnd::OnSize(UINT nType, int cx, int cy)
  379. {
  380. CDockablePane::OnSize(nType, cx, cy);
  381. TRACE2("坐标:%d,%d\n", cx, cy);
  382. AdjustLayout();
  383. }
  384. void CDevicesWnd::OnExpandAllProperties()
  385. {
  386. //m_wndPropList.ExpandAll();
  387. }
  388. void CDevicesWnd::OnUpdateExpandAllProperties(CCmdUI* /* pCmdUI */)
  389. {
  390. }
  391. void CDevicesWnd::OnSortProperties()
  392. {
  393. //m_wndPropList.SetAlphabeticMode(!m_wndPropList.IsAlphabeticMode());
  394. }
  395. void CDevicesWnd::OnUpdateSortProperties(CCmdUI* pCmdUI)
  396. {
  397. //pCmdUI->SetCheck(m_wndPropList.IsAlphabeticMode());
  398. }
  399. void CDevicesWnd::OnProperties1()
  400. {
  401. // TODO: 在此处添加命令处理程序代码
  402. }
  403. void CDevicesWnd::OnUpdateProperties1(CCmdUI* /*pCmdUI*/)
  404. {
  405. // TODO: 在此处添加命令更新 UI 处理程序代码
  406. }
  407. void CDevicesWnd::OnProperties2()
  408. {
  409. // TODO: 在此处添加命令处理程序代码
  410. }
  411. void CDevicesWnd::OnUpdateProperties2(CCmdUI* /*pCmdUI*/)
  412. {
  413. // TODO: 在此处添加命令更新 UI 处理程序代码
  414. }
  415. void CDevicesWnd::OnSetFocus(CWnd* pOldWnd)
  416. {
  417. CDockablePane::OnSetFocus(pOldWnd);
  418. }
  419. void CDevicesWnd::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
  420. {
  421. CDockablePane::OnSettingChange(uFlags, lpszSection);
  422. //SetPropListFont();
  423. }
  424. void CDevicesWnd::SetCtrlFont()
  425. {
  426. ::DeleteObject(m_fntPropList.Detach());
  427. LOGFONT lf;
  428. afxGlobalData.fontRegular.GetLogFont(&lf);
  429. NONCLIENTMETRICS info;
  430. info.cbSize = sizeof(info);
  431. afxGlobalData.GetNonClientMetrics(info);
  432. lf.lfHeight = info.lfMenuFont.lfHeight;
  433. lf.lfWeight = info.lfMenuFont.lfWeight;
  434. lf.lfItalic = info.lfMenuFont.lfItalic;
  435. m_fntPropList.CreateFontIndirect(&lf);
  436. //m_wndObjectCombo.SetFont(&m_fntPropList);
  437. m_lb_Actuator.SetFont(&m_fntPropList);
  438. m_lb_IP.SetFont(&m_fntPropList);
  439. m_edit_Actuator.SetFont(&m_fntPropList);
  440. m_edit_TVIP.SetFont(&m_fntPropList);
  441. m_btnModify.SetFont(&m_fntPropList);
  442. m_btnAddAndroid.SetFont(&m_fntPropList);
  443. m_listDevices.SetFont(&m_fntPropList);
  444. m_btnMIInit.SetFont(&m_fntPropList);
  445. m_btnSCBCInit.SetFont(&m_fntPropList);
  446. m_btnSVNUpdate.SetFont(&m_fntPropList);
  447. m_listTask.SetFont(&m_fntPropList);
  448. m_lb_TaskId.SetFont(&m_fntPropList);
  449. m_edit_TaskId.SetFont(&m_fntPropList);
  450. m_lb_TaskStatus.SetFont(&m_fntPropList);
  451. }
  452. // 如果CDockablePane无控件,改变大小时背景会刷新失败;
  453. // 所以要重载onpaint;
  454. void CDevicesWnd::OnPaint()
  455. {
  456. CPaintDC dc(this); // device context for painting
  457. // TODO: 在此处添加消息处理程序代码
  458. // 不为绘图消息调用 CDockablePane::OnPaint();
  459. CRect rc;
  460. GetClientRect(rc);
  461. CBrush brush;
  462. brush.CreateSolidBrush(0xFFEFD5);
  463. dc.FillRect(&rc, &brush);
  464. }
  465. void CDevicesWnd::OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/)
  466. {
  467. // TODO: 在此处添加消息处理程序代码
  468. }
  469. HBRUSH CDevicesWnd::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  470. {
  471. HBRUSH hbr = CDockablePane::OnCtlColor(pDC, pWnd, nCtlColor);
  472. // TODO: 在此更改 DC 的任何特性
  473. if (nCtlColor == CTLCOLOR_STATIC || pWnd->GetDlgCtrlID() == IDC_STATIC) //静态文本颜色,并且指定控件ID号    && pWnd->GetDlgCtrlID() == IDC_STATIC   
  474. {
  475. pDC->SetTextColor(RGB(255, 0, 0));
  476. //pDC->SetBkColor(RGB(191,219,255));     //静态控件的背景颜色设置,红字蓝底。          
  477. pDC->SetBkMode(TRANSPARENT); //静态文本框背景设置为透明
  478. HBRUSH brush;
  479. brush = CreateSolidBrush(0xFFEFD5);//对话框的RGB值
  480. hbr = (HBRUSH)brush;
  481. }
  482. // TODO: 如果默认的不是所需画笔,则返回另一个画笔
  483. return hbr;
  484. }
  485. void CDevicesWnd::OnBtnActuatorClick()
  486. {
  487. CString strActuator;
  488. GetDlgItemText(IDC_EDIT_RUNNER_NAME, strActuator);
  489. Global::g_Config.strActuator = strActuator.GetString();
  490. WritePrivateProfileString(_T("SATService"), _T("Actuator"), strActuator, Global::g_szConfig);
  491. CSATClient::GetInstance()->TCPLogin(Global::g_Config.strSATUserName, Global::g_Config.strSATPassword, Global::g_Config.strActuator);
  492. }
  493. void CDevicesWnd::OnUpdateBtnActuator(CCmdUI* pCmdUI)
  494. {
  495. }
  496. void CDevicesWnd::OnBtnAddTVIPClick()
  497. {
  498. // 获取IP地址;
  499. BYTE nf1, nf2, nf3, nf4;
  500. m_edit_TVIP.GetAddress(nf1, nf2, nf3, nf4);
  501. CString str;
  502. str.Format("%d.%d.%d.%d", nf1, nf2, nf3, nf4);//这里的nf得到的值是IP值了
  503. if (str.IsEmpty())
  504. return;
  505. CSATClient::GetInstance()->TCPAddDevice(str.GetString());
  506. }
  507. void CDevicesWnd::OnUpdateBtnAddTVIP(CCmdUI* pCmdUI)
  508. {
  509. }
  510. void CDevicesWnd::OnBtnMiInitClick()
  511. {
  512. if (Global::g_Config.strMIInitBat.size())
  513. {
  514. //WinExec(Global::g_Config.strMIInitBat.c_str(), SW_HIDE);
  515. ShellExecute(NULL, _T("open"), Global::g_Config.strMIInitBat.c_str(), NULL, NULL, SW_SHOW);
  516. }
  517. }
  518. void CDevicesWnd::OnUpdateBtnMiInit(CCmdUI* pCmdUI)
  519. {
  520. }
  521. void CDevicesWnd::OnBtnScbcInitClick()
  522. {
  523. if (Global::g_Config.strSCBCInitBat.size())
  524. {
  525. // TODO: 在此添加控件通知处理程序代码
  526. //WinExec(Global::g_Config.strMIInitBat.c_str(), SW_HIDE);
  527. ShellExecute(NULL, _T("open"), Global::g_Config.strSCBCInitBat.c_str(), NULL, NULL, SW_SHOW);
  528. }
  529. }
  530. void CDevicesWnd::OnUpdateBtnScbcInit(CCmdUI* pCmdUI)
  531. {
  532. }
  533. void CDevicesWnd::OnBtnSATUpdateClick()
  534. {
  535. CSVNMgr::GetInstance()->Update();
  536. if (CSVNMgr::GetInstance()->HasNewVersion())
  537. {
  538. // 还要更新,则表示失败;
  539. MessageBox(_T("更新失败"), _T("更新结果:"), MB_OK | MB_ICONWARNING);
  540. }
  541. else
  542. {
  543. MessageBox(_T("更新成功,版本号为 ") + CSVNMgr::GetInstance()->GetVersion(), _T("更新结果:"), MB_OK);
  544. CString strVersionInfo;
  545. strVersionInfo.Format(_T("SATHelper 版本 %s, SAT 版本 %s"), Global::g_szVersion, CSVNMgr::GetInstance()->GetVersion());
  546. AfxGetMainWnd()->SetWindowText(strVersionInfo);
  547. CSVNMgr::GetInstance()->Store();
  548. }
  549. }
  550. void CDevicesWnd::OnUpdateBtnSATUpdate(CCmdUI* pCmdUI)
  551. {
  552. }
  553. void CDevicesWnd::OnNMRClickListDevices(NMHDR* pNMHDR, LRESULT* pResult)
  554. {
  555. LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
  556. // TODO: 在此添加控件通知处理程序代码
  557. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  558. if (pNMListView->iItem != -1)
  559. {
  560. CString strType = m_listDevices.GetItemText(pNMListView->iItem, 0);
  561. // 过滤掉虚拟设备;
  562. if (!strType.CompareNoCase(_T("虚拟")))
  563. return;
  564. DWORD dwPos = GetMessagePos();
  565. CPoint point(LOWORD(dwPos), HIWORD(dwPos));
  566. CMenu menu;
  567. //添加线程操作
  568. if (!menu.LoadMenu(IDR_POPUP_DEVICES)) //这里是我们在1中定义的MENU的文件名称
  569. return;
  570. CMenu* popup = menu.GetSubMenu(0);
  571. ASSERT(popup != NULL);
  572. popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
  573. }
  574. *pResult = 0;
  575. }
  576. void CDevicesWnd::OnNMDblclkListTask(NMHDR* pNMHDR, LRESULT* pResult)
  577. {
  578. LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
  579. // TODO: 在此添加控件通知处理程序代码
  580. *pResult = 0;
  581. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  582. if (pNMListView->iItem != -1)
  583. {
  584. CString strLogPath = m_listTask.GetItemText(pNMListView->iItem, 4);
  585. // 路径不存在,退出;
  586. if (!PathFileExists(strLogPath))
  587. return;
  588. ShellExecute(NULL, _T("open"), strLogPath.GetString(), NULL, NULL, SW_SHOW);
  589. }
  590. }
  591. void CDevicesWnd::OnDevicesDel()
  592. {
  593. // TODO: 在此添加命令处理程序代码
  594. // 获取选中的设备;
  595. POSITION pos = m_listDevices.GetFirstSelectedItemPosition();
  596. if (pos != NULL)
  597. {
  598. int nSelCur = m_listDevices.GetNextSelectedItem(pos);
  599. if (nSelCur != -1)
  600. {
  601. CString strDeviceType = m_listDevices.GetItemText(nSelCur, 0);
  602. CString strDeviceName = m_listDevices.GetItemText(nSelCur, 1);
  603. if (!strDeviceName.IsEmpty() && strDeviceType.CompareNoCase(_T("虚拟")))
  604. {
  605. MessageBox(_T("即将删除设备:") + strDeviceName, _T("温馨提示!"), MB_ICONWARNING);
  606. CSATClient::GetInstance()->TCPDelDevice(strDeviceName.GetString());
  607. // 同时删除该项;
  608. m_listDevices.DeleteItem(nSelCur);
  609. }
  610. }
  611. }
  612. }