IRControlWnd.cpp 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402
  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 "IRControlWnd.h"
  14. #include "Resource.h"
  15. #include "MainFrm.h"
  16. #include "SATHelper.h"
  17. #include <filehelper.h>
  18. #ifdef _DEBUG
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #define new DEBUG_NEW
  22. #endif
  23. // 重启进程按钮id;
  24. #define ID_BUTTON_RESTART_PROC 1
  25. // 复制框控件id;
  26. #define ID_CHECKBOX_SIGNAL_TYPE 2
  27. // 切换遥控器;
  28. #define ID_BUTTON_SWITCH_REMOTE 3
  29. // 查找红外;
  30. #define ID_BUTTON_FIND_INFRARED 4
  31. // 查找蓝牙;
  32. #define ID_BUTTON_FIND_BLUETOOTH 5
  33. // 下拉框控件id;
  34. #define ID_COMBOBOX_SIGNAL_FILE 6
  35. extern CMainFrame* g_pMainFrame;
  36. #define RGB_TW RGB(0,162,232)
  37. #define RGB_RR RGB(255,255,128)
  38. /////////////////////////////////////////////////////////////////////////////
  39. // CResourceViewBar
  40. unsigned char TwoHexChar2Char(char ch1, char ch2)
  41. {
  42. char Numb1;
  43. char Numb2;
  44. if (ch1 >= 'A')
  45. Numb1 = (toupper(ch1) - '0' - 7) * 16;
  46. else
  47. Numb1 = (ch1 - '0') * 16;
  48. if (ch2 >= 'A')
  49. Numb2 = (toupper(ch2) - '0' - 7);
  50. else
  51. Numb2 = (ch2 - '0');
  52. return (Numb1 + Numb2);
  53. }
  54. COLORREF HexColor2RGB(std::string strHexColor)
  55. {
  56. DWORD r = TwoHexChar2Char(strHexColor[0], strHexColor[1]);
  57. DWORD g = TwoHexChar2Char(strHexColor[2], strHexColor[3]);
  58. DWORD b = TwoHexChar2Char(strHexColor[4], strHexColor[5]);
  59. return RGB(r, g, b);
  60. }
  61. CIRControlWnd::CIRControlWnd() noexcept
  62. {
  63. m_nComboHeight = 0;
  64. m_bSendKey = FALSE;
  65. }
  66. int CIRControlWnd::CreateCtrl()
  67. {
  68. CRect rectDummy;
  69. rectDummy.SetRectEmpty();
  70. // 创建组合:
  71. const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_BORDER | CBS_SORT | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
  72. #if 0
  73. if (!m_btnRestart.Create(GlobalString::g_strRestartRemoteDevice, WS_CHILD | WS_VISIBLE, rectDummy, this, ID_BUTTON_RESTART_PROC))
  74. {
  75. TRACE0("未能创建遥控器组合 \n");
  76. return -1; // 未能创建
  77. }
  78. if (!m_wndSignalCheck.Create(GlobalString::g_strRemoteSelect, WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, rectDummy, this, ID_CHECKBOX_SIGNAL_TYPE))
  79. {
  80. TRACE0("未能创建信号集下拉框 \n");
  81. return -1; // 未能创建
  82. }
  83. m_wndSignalCheck.SetCheck(Global::g_Config.bGenerics ? BST_CHECKED : BST_UNCHECKED);
  84. m_wndSignalCheck.m_bHighlightChecked = TRUE;
  85. // CMFCButton只能用图标来显示check;
  86. m_wndSignalCheck.SetImage(IDB_UNCHECKED);
  87. m_wndSignalCheck.SetCheckedImage(IDB_CHECKED);
  88. m_wndSignalCheck.m_bTransparent = FALSE;
  89. m_wndSignalCheck.m_bDrawFocus = FALSE;
  90. m_wndSignalCheck.m_nFlatStyle = CMFCButton::BUTTONSTYLE_FLAT;
  91. m_wndSignalCheck.SizeToContent();
  92. #endif
  93. if (!m_btnSwitchRemote.Create(GlobalString::g_strSwitchRemote, WS_CHILD | WS_VISIBLE, rectDummy, this, ID_BUTTON_SWITCH_REMOTE))
  94. {
  95. TRACE0("未能创建遥控器组合 \n");
  96. return -1; // 未能创建
  97. }
  98. if (Global::g_Config.useTW)
  99. {
  100. m_btnSwitchRemote.SetWindowText(Global::g_Config.nLanguage ? _T("SwitchToRedRat") : _T("切换到红老鼠"));
  101. }
  102. else
  103. {
  104. m_btnSwitchRemote.SetWindowText(GlobalString::g_strSwitchRemote);
  105. }
  106. m_btnSwitchRemote.SetFaceColor(Global::g_Config.useTW ? RGB_TW : RGB_RR, TRUE);
  107. if (!m_btnFindinfraRed.Create(GlobalString::g_strFindIR, WS_CHILD | WS_VISIBLE, rectDummy, this, ID_BUTTON_FIND_INFRARED))
  108. {
  109. TRACE0("未能创建遥控器组合 \n");
  110. return -1; // 未能创建
  111. }
  112. if (!m_btnFindBluetooth.Create(GlobalString::g_strFindBL, WS_CHILD | WS_VISIBLE, rectDummy, this, ID_BUTTON_FIND_BLUETOOTH))
  113. {
  114. TRACE0("未能创建遥控器组合 \n");
  115. return -1; // 未能创建
  116. }
  117. if (!m_wndSignalCombo.Create(dwViewStyle | WS_VSCROLL | WS_HSCROLL, CRect(0, 0, 100, 20), this, ID_COMBOBOX_SIGNAL_FILE))
  118. {
  119. TRACE0("未能创建信号集下拉框 \n");
  120. return -1; // 未能创建
  121. }
  122. if (!m_cbTree1.Create(dwViewStyle | WS_VSCROLL | WS_HSCROLL, rectDummy, this, ID_COMBOBOX_SIGNAL_FILE + 1))
  123. {
  124. TRACE0("未能创建信号集下拉框 \n");
  125. return -1; // 未能创建
  126. }
  127. if (!m_cbTree2.Create(dwViewStyle | WS_VSCROLL | WS_HSCROLL, rectDummy, this, ID_COMBOBOX_SIGNAL_FILE + 2))
  128. {
  129. TRACE0("未能创建信号集下拉框 \n");
  130. return -1; // 未能创建
  131. }
  132. if (!m_cbTree3.Create(dwViewStyle | WS_VSCROLL | WS_HSCROLL, rectDummy, this, ID_COMBOBOX_SIGNAL_FILE + 3))
  133. {
  134. TRACE0("未能创建信号集下拉框 \n");
  135. return -1; // 未能创建
  136. }
  137. // 设置透明false以显示背景色
  138. m_btnSwitchRemote.m_bTransparent = FALSE;
  139. m_btnSwitchRemote.m_bDontUseWinXPTheme = TRUE;
  140. // 设置背景色;
  141. m_btnSwitchRemote.SetFaceColor(Global::g_Config.useTW ? RGB_TW :RGB_RR , TRUE);
  142. // 消除单击时黑色内圈;
  143. m_btnSwitchRemote.m_bDrawFocus = FALSE;
  144. // 设置按钮扁平样式;
  145. m_btnSwitchRemote.m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
  146. // 设置鼠标形状;
  147. m_btnSwitchRemote.SetMouseCursorHand();
  148. return 0;
  149. }
  150. CIRControlWnd::~CIRControlWnd()
  151. {
  152. RedRat::UnloadLibrary();
  153. for (std::vector<BtnInfo>::iterator it = m_vtBtnInfo.begin(); it != m_vtBtnInfo.end(); it++)
  154. {
  155. if (it->pBTN)
  156. //it->pBTN->DestroyWindow();
  157. delete it->pBTN;
  158. it->pBTN = NULL;
  159. }
  160. m_vtBtnInfo.clear();
  161. }
  162. BEGIN_MESSAGE_MAP(CIRControlWnd, CDockablePane)
  163. ON_WM_CREATE()
  164. ON_WM_SIZE()
  165. ON_COMMAND(ID_EXPAND_ALL, OnExpandAllProperties)
  166. ON_UPDATE_COMMAND_UI(ID_EXPAND_ALL, OnUpdateExpandAllProperties)
  167. ON_COMMAND(ID_SORTPROPERTIES, OnSortProperties)
  168. ON_UPDATE_COMMAND_UI(ID_SORTPROPERTIES, OnUpdateSortProperties)
  169. ON_COMMAND(ID_PROPERTIES1, OnProperties1)
  170. ON_UPDATE_COMMAND_UI(ID_PROPERTIES1, OnUpdateProperties1)
  171. ON_COMMAND(ID_PROPERTIES2, OnProperties2)
  172. ON_UPDATE_COMMAND_UI(ID_PROPERTIES2, OnUpdateProperties2)
  173. ON_WM_SETFOCUS()
  174. ON_WM_SETTINGCHANGE()
  175. ON_WM_PAINT()
  176. ON_MESSAGE(WM_IR_SHOT_IMG, OnIRShotImg)
  177. ON_CBN_SELCHANGE(ID_COMBOBOX_SIGNAL_FILE, &CIRControlWnd::OnCbnSelchangeSignal)
  178. ON_CBN_SELCHANGE(ID_COMBOBOX_SIGNAL_FILE + 1, &CIRControlWnd::OnCbnSelchangeTree1)
  179. ON_CBN_SELCHANGE(ID_COMBOBOX_SIGNAL_FILE + 2, &CIRControlWnd::OnCbnSelchangeTree2)
  180. ON_CBN_SELCHANGE(ID_COMBOBOX_SIGNAL_FILE + 3, &CIRControlWnd::OnCbnSelchangeTree3)
  181. // 信号按钮;
  182. ON_COMMAND_RANGE(BTNID, BTNID + 100, OnSignalBtnClick)
  183. ON_UPDATE_COMMAND_UI_RANGE(BTNID, BTNID + 100, OnUpdateSignalBtn)
  184. // checkbox
  185. ON_UPDATE_COMMAND_UI(ID_CHECKBOX_SIGNAL_TYPE, OnUpdateCheckBox)
  186. ON_COMMAND(ID_CHECKBOX_SIGNAL_TYPE, OnCheckBoxClicked)
  187. // 重启按钮;
  188. ON_UPDATE_COMMAND_UI(ID_BUTTON_RESTART_PROC, OnUpdateBtnRestartProc)
  189. ON_COMMAND(ID_BUTTON_RESTART_PROC, OnBtnRestartProcClicked)
  190. // 切换遥控器;
  191. ON_UPDATE_COMMAND_UI(ID_BUTTON_SWITCH_REMOTE, OnUpdateSwitchRemote)
  192. ON_COMMAND(ID_BUTTON_SWITCH_REMOTE, OnSwitchRemoteClicked)
  193. // 查找红外;
  194. ON_UPDATE_COMMAND_UI(ID_BUTTON_FIND_INFRARED, OnUpdateFindFindinfraRed)
  195. ON_COMMAND(ID_BUTTON_FIND_INFRARED, OnFindFindinfraRedClicked)
  196. // 查找蓝牙;
  197. ON_UPDATE_COMMAND_UI(ID_BUTTON_FIND_BLUETOOTH, OnUpdateFindBluetooth)
  198. ON_COMMAND(ID_BUTTON_FIND_BLUETOOTH, OnFindBluetoothClicked)
  199. //ON_UPDATE_COMMAND_UI(ID_BUTTON_RESTART_PROC, OnUpdateReStartBtn)
  200. END_MESSAGE_MAP()
  201. /////////////////////////////////////////////////////////////////////////////
  202. // CResourceViewBar 消息处理程序
  203. void CIRControlWnd::AdjustLayout()
  204. {
  205. if (GetSafeHwnd() == nullptr ||
  206. (AfxGetMainWnd() != nullptr && AfxGetMainWnd()->IsIconic()))
  207. {
  208. return;
  209. }
  210. const int dr = 3; // 行间距
  211. const int dc = 5; // 列间距;
  212. CRect rcCtrl;
  213. CRect rectClient;
  214. GetClientRect(rectClient);
  215. TRACE2(_T("更新后的大小:%d,%d"), rectClient.Width(), rectClient.Height());
  216. #if 0
  217. m_btnRestart.SetWindowPos(nullptr, rectClient.left + dr, rectClient.top + dr, (rectClient.Width() - dr * 3) / 2, m_nComboHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  218. m_btnRestart.GetWindowRect(rcCtrl);
  219. ScreenToClient(rcCtrl);
  220. m_wndSignalCheck.SetWindowPos(nullptr, rcCtrl.right + dr, rectClient.top + dr, rcCtrl.Width(), m_nComboHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  221. m_wndSignalCheck.GetWindowRect(rcCtrl);
  222. ScreenToClient(rcCtrl);
  223. #else
  224. int nBtnWidth = (rectClient.Width() - dr * 4) / 3;
  225. m_btnSwitchRemote.SetWindowPos(nullptr, rectClient.left + dr, rectClient.top + dr, nBtnWidth, m_nComboHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  226. m_btnFindinfraRed.SetWindowPos(nullptr, rectClient.left + dr*2 + nBtnWidth, rectClient.top + dr, nBtnWidth, m_nComboHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  227. m_btnFindBluetooth.SetWindowPos(nullptr, rectClient.left + dr*3 + nBtnWidth *2, rectClient.top + dr, nBtnWidth, m_nComboHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  228. m_btnFindBluetooth.GetWindowRect(rcCtrl);
  229. ScreenToClient(rcCtrl);
  230. #endif
  231. // 注意:此combobox高度并是包含了下拉项的高度;
  232. m_wndSignalCombo.SetWindowPos(nullptr, rectClient.left + dr, rcCtrl.bottom + dr, rectClient.Width() - dc * 2, m_nComboHeight + 233, SWP_NOACTIVATE | SWP_NOZORDER);
  233. //::MoveWindow(m_wndSignalCombo.m_hWnd, rectClient.left + 5, rcCtrl.bottom + 5, rectClient.Width() - 10, m_nComboHeight + 233, TRUE);
  234. //m_wndSignalCombo.SendMessage(CB_SETITEMHEIGHT, (WPARAM)-1, (LPARAM)19); //改变控件本身的高度
  235. m_wndSignalCombo.GetWindowRect(rcCtrl);
  236. ScreenToClient(rcCtrl);
  237. // 注意:此combobox高度并是包含了下拉项的高度;
  238. m_cbTree1.SetWindowPos(nullptr, rectClient.left + dr, rcCtrl.bottom + dr, (rectClient.Width() - dr*4) / 3, m_nComboHeight + 233, SWP_NOACTIVATE | SWP_NOZORDER);
  239. m_cbTree1.GetWindowRect(rcCtrl);
  240. ScreenToClient(rcCtrl);
  241. // 注意:此combobox高度并是包含了下拉项的高度;
  242. m_cbTree2.SetWindowPos(nullptr, rcCtrl.right + 2, rcCtrl.top, rcCtrl.Width(), m_nComboHeight + 233, SWP_NOACTIVATE | SWP_NOZORDER);
  243. m_cbTree2.GetWindowRect(rcCtrl);
  244. ScreenToClient(rcCtrl);
  245. // 注意:此combobox高度并是包含了下拉项的高度;
  246. m_cbTree3.SetWindowPos(nullptr, rcCtrl.right + 2, rcCtrl.top, rcCtrl.Width(), m_nComboHeight + 233, SWP_NOACTIVATE | SWP_NOZORDER);
  247. #if __PANE_DLG__
  248. m_dlgIRControl.SetWindowPos(nullptr, rectClient.left, rectClient.top + m_nComboHeight + 50, rectClient.Width(), rectClient.Height(), SWP_NOACTIVATE);
  249. #endif
  250. m_cbTree3.GetWindowRect(rcCtrl);
  251. ScreenToClient(rcCtrl);
  252. int sx = 0, sy = rcCtrl.bottom + dr;
  253. int i = 0, id = 10000;
  254. int nWidth = (rectClient.Width() - 25) / 4;
  255. DWORD dwStyle = WS_CHILD | WS_VISIBLE;
  256. for (std::vector<BtnInfo>::iterator it = m_vtBtnInfo.begin(); it != m_vtBtnInfo.end(); it++)
  257. {
  258. if (it->pBTN == nullptr)
  259. continue;
  260. if (i != 0 && i % 4 == 0)
  261. {//换行;
  262. sy += it->height + 5;
  263. }
  264. sx = (i % 4) * nWidth + (i % 4 + 1) * 5;
  265. it->pBTN->SetWindowPos(nullptr, sx, sy, nWidth, it->height, SWP_NOACTIVATE | SWP_NOZORDER);
  266. i++;
  267. }
  268. }
  269. int CIRControlWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
  270. {
  271. if (CDockablePane::OnCreate(lpCreateStruct) == -1)
  272. return -1;
  273. if (CreateCtrl() != 0)
  274. return -1;
  275. LoadSignals();
  276. SetPropListFont();
  277. LoadMenuTreePath();
  278. ReadResourceRunCfg();
  279. InitMenuTreeCombobox();
  280. CRect rectCombo;
  281. m_wndSignalCombo.GetClientRect(&rectCombo);
  282. m_nComboHeight = rectCombo.Height();
  283. #if __PANE_DLG__
  284. if (!m_dlgIRControl.Create(IDD_DLG_IRCONTROL, this))
  285. {
  286. TRACE0("未能创建遥控器主窗口 \n");
  287. return -1; // 未能创建
  288. }
  289. m_dlgIRControl.ShowWindow(SW_SHOW);
  290. #else
  291. Loadlayout(m_vtBtnInfo);
  292. #endif
  293. // 设置最小窗体;
  294. SetMinSize((530, 260));
  295. // 校正布局;
  296. AdjustLayout();
  297. //////////////////////////////////////////////////////////////////////////
  298. // 启动红老鼠;
  299. if (!RedRat::LoadLibrary())
  300. {
  301. AfxMessageBox(Global::g_Config.nLanguage ? "Load dll Fail, pelease check dll is ok!" : "加载遥控dll失败,请检测dll是否正常!");
  302. }
  303. StartIRDevice(FALSE);
  304. if (Global::g_Config.useTW) {
  305. std::string signaldir = Global::g_Config.twSignaldir;
  306. std::string signalpath = signaldir + "\\";
  307. signalpath.append(Global::g_Config.twUseSignal + ".xml");
  308. TW::LoadXml(signalpath.c_str());
  309. }
  310. std::thread t([](CIRControlWnd* pWnd) {
  311. //while (true)
  312. while (IsWindow(pWnd->m_hWnd))
  313. {
  314. if (g_pMainFrame->m_bShotIR && pWnd->m_bSendKey)
  315. {
  316. pWnd->m_bSendKey = FALSE;
  317. Sleep(200);
  318. CUB530View* pView = (CUB530View*)g_pMainFrame->m_pUB530View->GetActiveView();
  319. if (pView)
  320. {
  321. pView->OnCutJpg();
  322. }
  323. }
  324. Sleep(20);
  325. }
  326. }, this);
  327. t.detach();
  328. return 0;
  329. }
  330. void CIRControlWnd::OnSize(UINT nType, int cx, int cy)
  331. {
  332. CDockablePane::OnSize(nType, cx, cy);
  333. TRACE2("坐标:%d,%d\n", cx, cy);
  334. AdjustLayout();
  335. }
  336. void CIRControlWnd::OnExpandAllProperties()
  337. {
  338. //m_wndPropList.ExpandAll();
  339. }
  340. void CIRControlWnd::OnUpdateExpandAllProperties(CCmdUI* /* pCmdUI */)
  341. {
  342. }
  343. void CIRControlWnd::OnSortProperties()
  344. {
  345. //m_wndPropList.SetAlphabeticMode(!m_wndPropList.IsAlphabeticMode());
  346. }
  347. void CIRControlWnd::OnUpdateSortProperties(CCmdUI* pCmdUI)
  348. {
  349. //pCmdUI->SetCheck(m_wndPropList.IsAlphabeticMode());
  350. }
  351. void CIRControlWnd::OnProperties1()
  352. {
  353. // TODO: 在此处添加命令处理程序代码
  354. }
  355. void CIRControlWnd::OnUpdateProperties1(CCmdUI* /*pCmdUI*/)
  356. {
  357. // TODO: 在此处添加命令更新 UI 处理程序代码
  358. }
  359. void CIRControlWnd::OnProperties2()
  360. {
  361. // TODO: 在此处添加命令处理程序代码
  362. }
  363. void CIRControlWnd::OnUpdateProperties2(CCmdUI* /*pCmdUI*/)
  364. {
  365. // TODO: 在此处添加命令更新 UI 处理程序代码
  366. }
  367. void CIRControlWnd::OnSetFocus(CWnd* pOldWnd)
  368. {
  369. CDockablePane::OnSetFocus(pOldWnd);
  370. }
  371. void CIRControlWnd::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
  372. {
  373. CDockablePane::OnSettingChange(uFlags, lpszSection);
  374. SetPropListFont();
  375. }
  376. void CIRControlWnd::OnCbnSelchangeSignal()
  377. {
  378. CString strSignal;
  379. int nCurSel = m_wndSignalCombo.GetCurSel();
  380. if (nCurSel != CB_ERR)
  381. {
  382. std::string signalpath;
  383. m_wndSignalCombo.GetLBText(nCurSel, strSignal);
  384. // 保存到配置文件中;
  385. if (Global::g_Config.useTW)
  386. {
  387. Global::g_Config.twUseSignal = strSignal.GetString();
  388. WritePrivateProfileString("TestWizard", "useSignal", strSignal.GetString(), Global::g_szConfig);
  389. }
  390. else {
  391. Global::g_Config.use_signal = strSignal.GetString();
  392. WritePrivateProfileString("ir-device", "use-signal", strSignal.GetString(), Global::g_szConfig);
  393. }
  394. }
  395. DisableSignalBtn();
  396. ReLoadSignalXml();
  397. }
  398. void CIRControlWnd::OnCbnSelchangeTree1()
  399. {
  400. // UI下拉框;
  401. CString strTree1;
  402. int nCurSel = m_cbTree1.GetCurSel();
  403. if (nCurSel != CB_ERR)
  404. {
  405. m_cbTree1.GetLBText(nCurSel, strTree1);
  406. }
  407. m_cbTree2.ResetContent();
  408. for (auto it : m_map_tree.find(strTree1.GetString())->second)
  409. {
  410. m_cbTree2.AddString(it.ui.c_str());
  411. }
  412. m_cbTree2.SetCurSel(0);
  413. // SUBUI下拉框;
  414. CString strTree2 = _T("");
  415. nCurSel = m_cbTree2.GetCurSel();
  416. if (nCurSel != CB_ERR)
  417. {
  418. m_cbTree2.GetLBText(nCurSel, strTree2);
  419. }
  420. m_cbTree3.ResetContent();
  421. std::vector<UITree>& ui = m_map_tree.find(strTree1.GetString())->second;
  422. for (std::vector<UITree>::iterator it = ui.begin(); it != ui.end(); it++)
  423. {
  424. if (_tcsicmp(strTree2.GetString(), it->ui.c_str()) == 0)
  425. {
  426. if (it->vtSubUI.size() == 0)
  427. break;
  428. for (auto SubUI : it->vtSubUI)
  429. {
  430. m_cbTree3.AddString(SubUI.c_str());
  431. }
  432. m_cbTree3.SetCurSel(0);
  433. }
  434. }
  435. // 保存结果;
  436. WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedchip"), strTree1, Global::g_szResuorceCfg);
  437. WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedstyle"), strTree2, Global::g_szResuorceCfg);
  438. CString strTree3 = _T("");
  439. nCurSel = m_cbTree3.GetCurSel();
  440. if (nCurSel != CB_ERR)
  441. {
  442. m_cbTree3.GetLBText(nCurSel, strTree3);
  443. }
  444. WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedchannel"), strTree3, Global::g_szResuorceCfg);
  445. _stprintf_s(g_pMainFrame->m_szCurMenuTreeDir, _T("%s%s%s\\%s\\"), m_rscfg.sat_home.c_str(), _T("resource\\MenuTree\\"), strTree1.GetString(), strTree2.GetString());
  446. }
  447. void CIRControlWnd::OnCbnSelchangeTree2()
  448. {
  449. CString strTree1;
  450. int nCurSel = m_cbTree1.GetCurSel();
  451. if (nCurSel == CB_ERR)
  452. return;
  453. m_cbTree1.GetLBText(nCurSel, strTree1);
  454. // SUBUI下拉框;
  455. CString strTree2 = _T("");
  456. nCurSel = m_cbTree2.GetCurSel();
  457. if (nCurSel == CB_ERR)
  458. return;
  459. m_cbTree2.GetLBText(nCurSel, strTree2);
  460. // 清空tree3;
  461. m_cbTree3.ResetContent();
  462. std::vector<UITree>& ui = m_map_tree.find(strTree1.GetString())->second;
  463. for (std::vector<UITree>::iterator it = ui.begin(); it != ui.end(); it++)
  464. {
  465. if (_tcsicmp(strTree2.GetString(), it->ui.c_str()) == 0)
  466. {
  467. if (it->vtSubUI.size() == 0)
  468. break;
  469. for (auto SubUI : it->vtSubUI)
  470. {
  471. m_cbTree3.AddString(SubUI.c_str());
  472. }
  473. m_cbTree3.SetCurSel(0);
  474. }
  475. }
  476. // 保存结果;
  477. WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedstyle"), strTree2, Global::g_szResuorceCfg);
  478. CString strTree3 = _T("");
  479. nCurSel = m_cbTree3.GetCurSel();
  480. if (nCurSel != CB_ERR)
  481. {
  482. m_cbTree3.GetLBText(nCurSel, strTree3);
  483. }
  484. WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedchannel"), strTree3, Global::g_szResuorceCfg);
  485. _stprintf_s(g_pMainFrame->m_szCurMenuTreeDir, _T("%s%s%s\\%s\\"), m_rscfg.sat_home.c_str(), _T("resource\\MenuTree\\"), strTree1.GetString(), strTree2.GetString());
  486. }
  487. void CIRControlWnd::OnCbnSelchangeTree3()
  488. {
  489. // UI下拉框;
  490. CString strTree3 = _T("");
  491. int nCurSel = m_cbTree3.GetCurSel();
  492. if (nCurSel != CB_ERR)
  493. {
  494. m_cbTree3.GetLBText(nCurSel, strTree3);
  495. WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedchannel"), strTree3, Global::g_szResuorceCfg);
  496. }
  497. }
  498. void CIRControlWnd::SetPropListFont()
  499. {
  500. ::DeleteObject(m_fntPropList.Detach());
  501. LOGFONT lf;
  502. afxGlobalData.fontRegular.GetLogFont(&lf);
  503. NONCLIENTMETRICS info;
  504. info.cbSize = sizeof(info);
  505. afxGlobalData.GetNonClientMetrics(info);
  506. lf.lfHeight = info.lfMenuFont.lfHeight;
  507. lf.lfWeight = info.lfMenuFont.lfWeight;
  508. lf.lfItalic = info.lfMenuFont.lfItalic;
  509. m_fntPropList.CreateFontIndirect(&lf);
  510. m_wndSignalCombo.SetFont(&m_fntPropList);
  511. m_cbTree1.SetFont(&m_fntPropList);
  512. m_cbTree2.SetFont(&m_fntPropList);
  513. m_cbTree3.SetFont(&m_fntPropList);
  514. }
  515. void CIRControlWnd::StartIRDevice(BOOL bReStart)
  516. {
  517. std::thread t([&](BOOL _bReStart_) {
  518. // 结束进程;
  519. if (_bReStart_ && RedRat::g_CloseApp)
  520. RedRat::g_CloseApp();
  521. // 默认加载配置的信号集文件;
  522. std::string signale = Global::g_Config.bGenerics ? Global::g_Config.signaldir + "\\general\\" : Global::g_Config.signaldir + "\\product\\";
  523. signale.append(Global::g_Config.use_signal + ".xml");
  524. if (!PathFileExists(signale.c_str()))
  525. {
  526. m_wndSignalCombo.SetCurSel(-1);
  527. signale = ".\\default.xml";
  528. }
  529. else
  530. {
  531. m_wndSignalCombo.SelectString(0, Global::g_Config.use_signal.c_str());
  532. }
  533. if (!RedRat::g_IsAppRunning(Global::g_Config.redratpath.c_str()))
  534. {
  535. if (RedRat::g_StartIRApp(Global::g_Config.redratpath.c_str(), signale.c_str(), 40000))
  536. {
  537. TRACE("启动红老鼠进程启动成功\r");
  538. }
  539. else
  540. {
  541. TRACE("启动红老鼠进程启动失败\r");
  542. AfxMessageBox(Global::g_Config.nLanguage ? "Failed to start red mouse process" : "启动红老鼠进程失败!");
  543. return 0;
  544. }
  545. }
  546. BOOL bRet = FALSE;
  547. // 连接服务器;
  548. for (int i = 0; i < 5; i++)
  549. {
  550. if ((bRet = RedRat::g_Connect(_T("127.0.0.1"), 40000)))
  551. break;
  552. Sleep(1000);
  553. }
  554. if (!bRet)
  555. AfxMessageBox(Global::g_Config.nLanguage ? "Failed to connect to red mouse server. Please restart the device!" : "连接红老鼠服务端失败,请重启设备!");
  556. // 更新按钮状态;
  557. UpdateSignalBtnStatus();
  558. // 获取设备列表,以逗号分隔;
  559. std::string devices = RedRat::g_getDeviceNames();
  560. if (devices.size() == 0)
  561. {
  562. AfxMessageBox(Global::g_Config.nLanguage ? "There is currently no red mouse device connection" :"当前无红老鼠设备连接!");
  563. }
  564. return 1;
  565. }, bReStart);
  566. t.detach();
  567. }
  568. void CIRControlWnd::ReLoadSignalXml()
  569. {
  570. if (Global::g_Config.useTW)
  571. {
  572. std::string signaldir = Global::g_Config.twSignaldir;
  573. std::string signalpath = signaldir + "\\";
  574. signalpath.append(Global::g_Config.twUseSignal + ".xml");
  575. if (!PathFileExists(signalpath.c_str()))
  576. {
  577. AfxMessageBox(Global::g_Config.nLanguage ? "The signal file does not exist" :_T("该信号文件不存在!"));
  578. // 设置默认的;
  579. CString strSignal;
  580. m_wndSignalCombo.SetCurSel(0);
  581. m_wndSignalCombo.GetLBText(0, strSignal);
  582. signalpath = signaldir;
  583. signalpath.append(strSignal.GetString());
  584. signalpath.append(".xml");
  585. // 保存到配置文件中;
  586. Global::g_Config.twUseSignal = strSignal.GetString();
  587. WritePrivateProfileString("TestWizard", "useSignal", strSignal.GetString(), Global::g_szConfig);
  588. }
  589. else // 切换通用类型时用到;
  590. {
  591. m_wndSignalCombo.SelectString(0, Global::g_Config.twUseSignal.c_str());
  592. }
  593. // 加载指定目录的xml信号集文件;
  594. if (0 != TW::LoadXml(signalpath.c_str()))
  595. {
  596. TRACE("加载信号集文件失败\r");
  597. }
  598. else
  599. {
  600. TRACE("加载信号集文件成功\r");
  601. UpdateSignalBtnStatus();
  602. }
  603. }
  604. else {
  605. std::string signaldir, signalpath;
  606. if (Global::g_Config.bGenerics)
  607. {
  608. signaldir = Global::g_Config.signaldir + "\\general\\";
  609. }
  610. else
  611. {
  612. signaldir = Global::g_Config.signaldir + "\\product\\";
  613. }
  614. signalpath = signaldir;
  615. signalpath.append(Global::g_Config.use_signal + ".xml");
  616. if (!PathFileExists(signalpath.c_str()))
  617. {
  618. AfxMessageBox(Global::g_Config.nLanguage ? "The signal file does not exist" : _T("该信号文件不存在!"));
  619. // 设置默认的;
  620. CString strSignal;
  621. m_wndSignalCombo.SetCurSel(0);
  622. m_wndSignalCombo.GetLBText(0, strSignal);
  623. signalpath = signaldir;
  624. signalpath.append(strSignal.GetString());
  625. signalpath.append(".xml");
  626. // 保存到配置文件中;
  627. Global::g_Config.use_signal = strSignal.GetString();
  628. WritePrivateProfileString("ir-device", "use-signal", strSignal.GetString(), Global::g_szConfig);
  629. }
  630. else // 切换通用类型时用到;
  631. {
  632. m_wndSignalCombo.SelectString(0, Global::g_Config.use_signal.c_str());
  633. }
  634. // 加载指定目录的xml信号集文件;
  635. if (!RedRat::g_loadSignalDataSet(signalpath.c_str()))
  636. {
  637. TRACE("加载信号集文件失败\r");
  638. }
  639. else
  640. {
  641. TRACE("加载信号集文件成功\r");
  642. UpdateSignalBtnStatus();
  643. }
  644. }
  645. }
  646. void CIRControlWnd::LoadSignals()
  647. {
  648. //AfxMessageBox("LoadSignals\r");
  649. m_wndSignalCombo.ResetContent();
  650. if (Global::g_Config.useTW)
  651. {
  652. filehelper fh;
  653. m_vtsignal_tw.clear();
  654. fh.getfiles_findout_subfolder(Global::g_Config.twSignaldir.c_str(), NULL, &m_vtsignal_tw);
  655. m_wndSignalCombo.ResetContent();
  656. for (auto it : m_vtsignal_tw)
  657. {
  658. m_wndSignalCombo.AddString(fh.getfilename(it).c_str());
  659. }
  660. }
  661. else
  662. {
  663. filehelper fh;
  664. m_vtsignal_gen.clear();
  665. m_vtsignal_pro.clear();
  666. fh.getfiles_findout_subfolder((Global::g_Config.signaldir + "\\general\\").c_str(), NULL, &m_vtsignal_gen);
  667. fh.getfiles_findout_subfolder((Global::g_Config.signaldir + "\\product\\").c_str(), NULL, &m_vtsignal_pro);
  668. // 添加到combobox中;
  669. if (Global::g_Config.bGenerics)
  670. {
  671. m_wndSignalCombo.ResetContent();
  672. for (auto it : m_vtsignal_gen)
  673. {
  674. m_wndSignalCombo.AddString(fh.getfilename(it).c_str());
  675. }
  676. }
  677. else
  678. {
  679. m_wndSignalCombo.ResetContent();
  680. for (auto it : m_vtsignal_pro)
  681. {
  682. m_wndSignalCombo.AddString(fh.getfilename(it).c_str());
  683. }
  684. }
  685. }
  686. AutoSetDroppedWidth(&m_wndSignalCombo);
  687. }
  688. void CIRControlWnd::Loadlayout(std::vector<BtnInfo>& vt)
  689. {
  690. // 解析xml;
  691. std::string path;
  692. path.append(Global::g_szCurModuleDir);
  693. path.append("layout.xml");
  694. tinyxml2::XMLDocument doc;
  695. if (tinyxml2::XML_SUCCESS != doc.LoadFile(path.c_str()))
  696. {
  697. return;
  698. }
  699. vt.clear();
  700. std::string data;
  701. tinyxml2::XMLElement* pXmlRoot = NULL;
  702. if ((pXmlRoot = doc.RootElement()) != NULL)
  703. {
  704. if (_tcsicmp(pXmlRoot->Value(), "ButtonList") == 0)
  705. {
  706. // 子项;
  707. tinyxml2::XMLElement* pXmlElent = pXmlRoot->FirstChildElement();
  708. while (pXmlElent)
  709. {
  710. BtnInfo btninfo;
  711. if (_tcsicmp(pXmlElent->Value(), _T("ITEM")) == 0)
  712. {
  713. tinyxml2::XMLElement* pItem = pXmlElent->FirstChildElement();
  714. while (pItem)
  715. {
  716. if (_tcsicmp(pItem->Value(), _T("NAME")) == 0)
  717. {
  718. btninfo.name = pItem->GetText();
  719. }
  720. else if (_tcsicmp(pItem->Value(), _T("WIDTH")) == 0)
  721. {
  722. data = pItem->GetText();
  723. btninfo.width = _ttol(data.c_str());
  724. }
  725. else if (_tcsicmp(pItem->Value(), _T("HEIGHT")) == 0)
  726. {
  727. data = pItem->GetText();
  728. btninfo.height = _ttol(data.c_str());
  729. }
  730. else if (_tcsicmp(pItem->Value(), _T("COLOR")) == 0)
  731. {
  732. data = pItem->GetText();
  733. btninfo.color = HexColor2RGB(data);
  734. }
  735. btninfo.pBTN = new CMFCButton();
  736. pItem = pItem->NextSiblingElement();
  737. }
  738. }
  739. vt.push_back(btninfo);
  740. pXmlElent = pXmlElent->NextSiblingElement();
  741. }
  742. }
  743. }
  744. int sx = 0, sy = m_nComboHeight * 2 + 15;
  745. int i = 0, id = 10000;
  746. DWORD dwStyle = WS_CHILD | WS_VISIBLE;
  747. for (std::vector<BtnInfo>::iterator it = vt.begin(); it != vt.end(); it++)
  748. {
  749. if (i != 0 && i % 4 == 0)
  750. {//换行;
  751. sy += it->height + 5;
  752. }
  753. sx = (i % 4) * it->width + (i % 4 + 1) * 5;
  754. it->pBTN->Create(it->name.c_str(), dwStyle, CRect(sx, sy, sx + it->width, sy + it->height), this, BTNID + i);
  755. // 设置透明false以显示背景色
  756. it->pBTN->m_bTransparent = FALSE;
  757. it->pBTN->m_bDontUseWinXPTheme = TRUE;
  758. // 设置背景色;
  759. it->pBTN->SetFaceColor(it->color, TRUE);
  760. // 消除单击时黑色内圈;
  761. it->pBTN->m_bDrawFocus = FALSE;
  762. // 设置按钮扁平样式;
  763. it->pBTN->m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
  764. // 设置鼠标形状;
  765. it->pBTN->SetMouseCursorHand();
  766. // 存入map中;
  767. m_map_btn.insert(std::pair<UINT, BtnInfo&>(BTNID + i, *it));
  768. i++;
  769. }
  770. }
  771. // 如果CDockablePane无控件,改变大小时背景会刷新失败;
  772. // 所以要重载onpaint;
  773. void CIRControlWnd::OnPaint()
  774. {
  775. CPaintDC dc(this); // device context for painting
  776. // TODO: 在此处添加消息处理程序代码
  777. // 不为绘图消息调用 CDockablePane::OnPaint();
  778. CRect rc;
  779. GetClientRect(rc);
  780. CBrush brush;
  781. brush.CreateSolidBrush(0xFFEFD5);
  782. dc.FillRect(&rc, &brush);
  783. }
  784. void CIRControlWnd::OnSignalBtnClick(UINT uId) // 发送遥控信号;
  785. {
  786. CWnd* pWnd = GetFocus();
  787. int id = pWnd->GetDlgCtrlID();
  788. if (id >= BTNID && id <= BTNID + 100)
  789. {
  790. CString text;
  791. pWnd->GetWindowText(text);
  792. if (Global::g_Config.useTW)
  793. {
  794. TW::SendKey(text.GetString());
  795. }
  796. else {
  797. // 发送单信号;
  798. if (RedRat::g_sendSignal(text.GetString(), 1, 20))
  799. {
  800. m_bSendKey = TRUE;
  801. TRACE("发送单信号成功\n");
  802. }
  803. else
  804. {
  805. TRACE("发送单信号失败\n");
  806. }
  807. }
  808. }
  809. }
  810. void CIRControlWnd::OnUpdateSignalBtn(CCmdUI* pCmdUI)
  811. {
  812. pCmdUI->Enable(m_map_btn.find(pCmdUI->m_nID)->second.bEnable);
  813. }
  814. void CIRControlWnd::OnUpdateCheckBox(CCmdUI* pCmdUI)
  815. {
  816. pCmdUI->Enable(!Global::g_Config.useTW);
  817. }
  818. void CIRControlWnd::OnCheckBoxClicked()
  819. {
  820. if (Global::g_Config.useTW)
  821. {
  822. }
  823. else {
  824. Global::g_Config.bGenerics = m_wndSignalCheck.IsChecked();
  825. // 保存到配置文件中;
  826. WritePrivateProfileString("ir-device", "generics", Global::g_Config.bGenerics ? "1" : "0", Global::g_szConfig);
  827. // 添加到combobox中;
  828. if (Global::g_Config.bGenerics)
  829. {
  830. m_wndSignalCombo.ResetContent();
  831. for (auto it : m_vtsignal_gen)
  832. {
  833. m_wndSignalCombo.AddString(filehelper::getfilename(it).c_str());
  834. }
  835. }
  836. else
  837. {
  838. m_wndSignalCombo.ResetContent();
  839. for (auto it : m_vtsignal_pro)
  840. {
  841. m_wndSignalCombo.AddString(filehelper::getfilename(it).c_str());
  842. }
  843. }
  844. AutoSetDroppedWidth(&m_wndSignalCombo);
  845. DisableSignalBtn();
  846. ReLoadSignalXml();
  847. }
  848. }
  849. void CIRControlWnd::OnUpdateBtnRestartProc(CCmdUI* pCmdUI)
  850. {
  851. pCmdUI->Enable(!Global::g_Config.useTW);
  852. }
  853. void CIRControlWnd::OnBtnRestartProcClicked() // 重启红老鼠;
  854. {
  855. DisableSignalBtn();
  856. StartIRDevice();
  857. }
  858. void CIRControlWnd::OnUpdateSwitchRemote(CCmdUI* pCmdUI)
  859. {
  860. }
  861. void CIRControlWnd::OnSwitchRemoteClicked()
  862. {
  863. Global::g_Config.useTW = !Global::g_Config.useTW;
  864. if (Global::g_Config.useTW)
  865. {
  866. OutputDebugString(_T("Global::g_Config.useTW=True;\n"));
  867. m_btnSwitchRemote.SetWindowText(Global::g_Config.nLanguage ? _T("SwitchToRedRat") : _T("切换到红老鼠"));
  868. }
  869. else
  870. {
  871. OutputDebugString(_T("Global::g_Config.useTW=False;\n"));
  872. m_btnSwitchRemote.SetWindowText(GlobalString::g_strSwitchRemote);
  873. }
  874. m_btnSwitchRemote.SetFaceColor(Global::g_Config.useTW ? RGB_TW : RGB_RR, TRUE);
  875. WritePrivateProfileString(_T("SATHelper"), _T("useTW"), Global::g_Config.useTW ? _T("1") : _T("0"), Global::g_szConfig);
  876. // 同时写入resource_run.cfg中:[devices].[rcudevice_selected]
  877. WritePrivateProfileString(_T("devices"), _T("rcudevice_selected"), Global::g_Config.useTW ? _T("tw") : _T("redrat4"), g_pMainFrame->m_szRsCfgPath);
  878. LoadSignals();
  879. ReLoadSignalXml();
  880. }
  881. void CIRControlWnd::OnUpdateFindFindinfraRed(CCmdUI* pCmdUI)
  882. {
  883. }
  884. void CIRControlWnd::OnFindFindinfraRedClicked()
  885. {
  886. std::thread t([](CIRControlWnd* p) {
  887. p->m_btnFindinfraRed.EnableWindow(FALSE);
  888. CCallPython pycall;
  889. TCHAR szPath[MAX_PATH] = { 0 };
  890. _stprintf_s(szPath, _T("%sscripts\\FindRC.py"), Global::g_szCurModuleDir);
  891. PyObject* pRet = pycall.CallPython(szPath, _T("API_FindIRRC"), 1, _variant_t(Global::g_Config.useTW ? Global::g_Config.twSignaldir.c_str() : Global::g_Config.signaldir.c_str()) );
  892. if (pRet == NULL)
  893. {
  894. if (Global::g_Config.nLanguage)
  895. AfxMessageBox("Running error, please check the script!");
  896. else
  897. AfxMessageBox("运行出错,请检查脚本!");
  898. }
  899. else
  900. {
  901. filehelper fh;
  902. std::string file = pycall.GetUTF8String(pRet);
  903. if (PathFileExists(file.c_str())) {
  904. if (Global::g_Config.useTW) {
  905. TW::LoadXml(file.c_str());
  906. Global::g_Config.twUseSignal = file;
  907. p->m_wndSignalCombo.SelectString(0, fh.getfilename(file).c_str());
  908. WritePrivateProfileString("TestWizard", "useSignal", file.c_str(), Global::g_szConfig);
  909. }
  910. else
  911. {
  912. Global::g_Config.use_signal = file;
  913. WritePrivateProfileString("ir-device", "use-signal", file.c_str(), Global::g_szConfig);
  914. // 切换通用类型时用到;
  915. p->m_wndSignalCombo.SelectString(0, Global::g_Config.use_signal.c_str());
  916. // 加载指定目录的xml信号集文件;
  917. RedRat::g_loadSignalDataSet(file.c_str());
  918. }
  919. }
  920. else {
  921. if (Global::g_Config.nLanguage)
  922. AfxMessageBox("file does not exist!");
  923. else
  924. AfxMessageBox("文件不存在!");
  925. }
  926. if (pRet)
  927. Py_DECREF(pRet);
  928. }
  929. p->m_btnFindinfraRed.EnableWindow();
  930. }, this);
  931. t.detach();
  932. }
  933. void CIRControlWnd::OnUpdateFindBluetooth(CCmdUI* pCmdUI)
  934. {
  935. }
  936. void CIRControlWnd::OnFindBluetoothClicked()
  937. {
  938. std::thread t([](CIRControlWnd* p) {
  939. p->m_btnFindBluetooth.EnableWindow(FALSE);
  940. CCallPython pycall;
  941. TCHAR szPath[MAX_PATH] = { 0 };
  942. _stprintf_s(szPath, _T("%sscripts\\FindRC.py"), Global::g_szCurModuleDir);
  943. PyObject* pRet = pycall.CallPython(szPath, _T("API_FindBLRC"), 1, _variant_t(Global::g_Config.useTW ? Global::g_Config.twSignaldir.c_str() : Global::g_Config.signaldir.c_str()));
  944. if (pRet == NULL)
  945. {
  946. if (Global::g_Config.nLanguage)
  947. AfxMessageBox("Running error, please check the script!");
  948. else
  949. AfxMessageBox("运行出错,请检查脚本!");
  950. }
  951. else
  952. {
  953. filehelper fh;
  954. std::string file = pycall.GetUTF8String(pRet);
  955. if (PathFileExists(file.c_str())) {
  956. if (Global::g_Config.useTW) {
  957. TW::LoadXml(file.c_str());
  958. Global::g_Config.twUseSignal = file;
  959. p->m_wndSignalCombo.SelectString(0, fh.getfilename(file).c_str());
  960. WritePrivateProfileString("TestWizard", "useSignal", file.c_str(), Global::g_szConfig);
  961. }
  962. else
  963. {
  964. Global::g_Config.use_signal = file;
  965. WritePrivateProfileString("ir-device", "use-signal", file.c_str(), Global::g_szConfig);
  966. // 切换通用类型时用到;
  967. p->m_wndSignalCombo.SelectString(0, Global::g_Config.use_signal.c_str());
  968. // 加载指定目录的xml信号集文件;
  969. RedRat::g_loadSignalDataSet(file.c_str());
  970. }
  971. }
  972. else {
  973. if (Global::g_Config.nLanguage)
  974. AfxMessageBox("file does not exist!");
  975. else
  976. AfxMessageBox("文件不存在!");
  977. }
  978. if (pRet)
  979. Py_DECREF(pRet);
  980. }
  981. p->m_btnFindBluetooth.EnableWindow();
  982. }, this);
  983. t.detach();
  984. }
  985. void CIRControlWnd::UpdateSignalBtnStatus()
  986. {
  987. std::string data;
  988. if (Global::g_Config.useTW)
  989. {
  990. if (TW::GetSignalsName)
  991. data = TW::GetSignalsName();
  992. }
  993. else {
  994. // 获取信号集;
  995. if (RedRat::g_getSignalsName) {
  996. // 获取信号数据集,以\n分隔;
  997. data = RedRat::g_getSignalsName();
  998. }
  999. }
  1000. CString signals = data.append(1, '\n').c_str();
  1001. signals.MakeUpper();
  1002. for (std::vector<BtnInfo>::iterator it = m_vtBtnInfo.begin(); it != m_vtBtnInfo.end(); it++)
  1003. {
  1004. if (signals.Find((it->name + '\n').c_str()) == -1)
  1005. {
  1006. it->bEnable = false;
  1007. }
  1008. else
  1009. {
  1010. it->bEnable = true;
  1011. }
  1012. }
  1013. }
  1014. void CIRControlWnd::AutoSetDroppedWidth(CComboBox *pCombobox)
  1015. {
  1016. return AddHScroll(pCombobox);
  1017. // Set the height of every item so the item
  1018. // is completely visible.
  1019. CString str;
  1020. CSize sz;
  1021. int dx = 0;
  1022. CDC* pDC = m_wndSignalCombo.GetDC();
  1023. for (int i = 0; i < m_wndSignalCombo.GetCount(); i++)
  1024. {
  1025. m_wndSignalCombo.GetLBText(i, str);
  1026. sz = pDC->GetTextExtent(str);
  1027. // Only want to set the item height if the current height
  1028. // is not big enough.
  1029. if (m_wndSignalCombo.GetItemHeight(i) < sz.cy)
  1030. m_wndSignalCombo.SetItemHeight(i, sz.cy);
  1031. // Only want to set the item width if the current width
  1032. // is not big enough.
  1033. if (m_wndSignalCombo.GetDroppedWidth() < sz.cx)
  1034. {
  1035. m_wndSignalCombo.SetDroppedWidth(sz.cx + 50);
  1036. }
  1037. }
  1038. m_wndSignalCombo.ReleaseDC(pDC);
  1039. }
  1040. void CIRControlWnd::AddHScroll(CComboBox* pCombobox)
  1041. {
  1042. if (!pCombobox)
  1043. return;
  1044. // Find the longest string in the combo box.
  1045. CString str;
  1046. CSize sz;
  1047. int dx = 0;
  1048. TEXTMETRIC tm = { 0 };
  1049. CDC* pDC = pCombobox->GetDC();
  1050. CFont* pFont = pCombobox->GetFont();
  1051. // Select the listbox font, save the old font
  1052. CFont* pOldFont = pDC->SelectObject(pFont);
  1053. // Get the text metrics for avg char width
  1054. pDC->GetTextMetrics(&tm);
  1055. for (int i = 0; i < pCombobox->GetCount(); i++)
  1056. {
  1057. pCombobox->GetLBText(i, str);
  1058. sz = pDC->GetTextExtent(str);
  1059. // Add the avg width to prevent clipping
  1060. sz.cx += tm.tmAveCharWidth;
  1061. if (sz.cx > dx)
  1062. dx = sz.cx;
  1063. }
  1064. // Select the old font back into the DC
  1065. pDC->SelectObject(pOldFont);
  1066. pCombobox->ReleaseDC(pDC);
  1067. // Set the horizontal extent so every character of all strings can
  1068. // be scrolled to.
  1069. pCombobox->SetHorizontalExtent(dx);
  1070. }
  1071. void CIRControlWnd::ReadResourceRunCfg()
  1072. {
  1073. TCHAR szValue[MAX_PATH] = { 0 };
  1074. GetPrivateProfileString(_T("COMM"), _T("issendkeytakepicture_tester"), NULL, szValue, MAX_PATH, Global::g_szResuorceCfg);
  1075. m_rscfg.full_cut = szValue;
  1076. GetPrivateProfileString(_T("COMM"), _T("tg39_port"), NULL, szValue, MAX_PATH, Global::g_szResuorceCfg);
  1077. m_rscfg.tg39_port = szValue;
  1078. GetPrivateProfileString(_T("COMM"), _T("serial_communicator_port"), NULL, szValue, MAX_PATH, Global::g_szResuorceCfg);
  1079. m_rscfg.tv_port = szValue;
  1080. GetPrivateProfileString(_T("COMM"), _T("sat_home"), NULL, szValue, MAX_PATH, Global::g_szResuorceCfg);
  1081. m_rscfg.sat_home = szValue;
  1082. GetPrivateProfileString(_T("COMM"), _T("sat_result_dir"), NULL, szValue, MAX_PATH, Global::g_szResuorceCfg);
  1083. m_rscfg.sat_result_dir = szValue;
  1084. GetPrivateProfileString(_T("COMM"), _T("chroma22293"), NULL, szValue, MAX_PATH, Global::g_szResuorceCfg);
  1085. m_rscfg.chroma22293 = szValue;
  1086. //...
  1087. GetPrivateProfileString(_T("MenuTree"), _T("menutreeselectedchip"), NULL, szValue, MAX_PATH, Global::g_szResuorceCfg);
  1088. m_rscfg.menutree_chip = szValue;
  1089. GetPrivateProfileString(_T("MenuTree"), _T("menutreeselectedstyle"), NULL, szValue, MAX_PATH, Global::g_szResuorceCfg);
  1090. m_rscfg.menutree_style = szValue;
  1091. GetPrivateProfileString(_T("MenuTree"), _T("menutreeselectedchannel"), NULL, szValue, MAX_PATH, Global::g_szResuorceCfg);
  1092. m_rscfg.menutree_channel = szValue;
  1093. }
  1094. void CIRControlWnd::LoadMenuTreePath()
  1095. {
  1096. TCHAR szValue[MAX_PATH] = {0};
  1097. TCHAR szRootDir[MAX_PATH] = { 0 };
  1098. GetPrivateProfileString(_T("COMM"), _T("sat_home"), NULL, szValue, MAX_PATH, Global::g_szResuorceCfg);
  1099. _stprintf_s(szRootDir, _T("%s%s"), szValue, _T("resource\\MenuTree\\"));
  1100. auto _get_dir = [](std::string dir) {
  1101. int nIndex = dir.find_last_of('\\');
  1102. if (nIndex != std::string::npos)
  1103. {
  1104. return dir.substr(nIndex + 1);
  1105. }
  1106. return dir;
  1107. };
  1108. auto _get_name = [](std::string dir) {
  1109. int pos1 = dir.find_last_of('\\');
  1110. if (pos1 != std::string::npos)
  1111. {
  1112. dir = dir.substr(pos1 + 1);
  1113. int pos2 = dir.find_last_of('.');
  1114. if (pos2 != std::string::npos)
  1115. {
  1116. dir = dir.substr(0, pos2);
  1117. int pos3 = dir.find("MenuTree_");
  1118. if (pos3 != std::string::npos)
  1119. {
  1120. return dir.substr(strlen("MenuTree_"));
  1121. }
  1122. }
  1123. }
  1124. return std::string();
  1125. };
  1126. // 查找根目录下的目录;
  1127. filehelper fh;
  1128. STR_VEC vt_dir;
  1129. fh.getsubfolder(szRootDir, &vt_dir);
  1130. for (auto it : vt_dir)
  1131. {
  1132. STR_VEC vt_subdir;
  1133. std::vector<UITree> vtTree;
  1134. fh.getsubfolder(it.c_str(), &vt_subdir);
  1135. for (auto ui : vt_subdir)
  1136. {
  1137. // 查找xls文件;
  1138. UITree uitree;
  1139. uitree.ui = ui;
  1140. fh.getfiles_findout_subfolder(ui.c_str(), _T("*.xls"), &uitree.vtSubUI);
  1141. vtTree.push_back(uitree);
  1142. }
  1143. m_map_tree.insert(std::pair<std::string, std::vector<UITree>>(_get_dir(it), vtTree));
  1144. }
  1145. // 去除目录级;
  1146. for (std::map<std::string, std::vector<UITree>>::iterator it = m_map_tree.begin(); it != m_map_tree.end(); it++)
  1147. {
  1148. for (std::vector<UITree>::iterator ui = it->second.begin(); ui != it->second.end(); ui++)
  1149. {
  1150. ui->ui = _get_dir(ui->ui);
  1151. for (std::vector<std::string>::iterator xls = ui->vtSubUI.begin(); xls != ui->vtSubUI.end();)
  1152. {
  1153. *xls = _get_name(xls->c_str());
  1154. if (xls->size() == 0)
  1155. {
  1156. xls = ui->vtSubUI.erase(xls);
  1157. }
  1158. else
  1159. {
  1160. xls++;
  1161. }
  1162. }
  1163. }
  1164. }
  1165. }
  1166. void CIRControlWnd::InitMenuTreeCombobox()
  1167. {
  1168. if ( m_map_tree.size())
  1169. {
  1170. for (auto it : m_map_tree)
  1171. {
  1172. m_cbTree1.AddString(it.first.c_str());
  1173. }
  1174. // 选择默认项;
  1175. m_cbTree1.SelectString(0, m_rscfg.menutree_chip.c_str());
  1176. // UI下拉框;
  1177. int nIndex = 0;
  1178. CString curText;
  1179. if ((nIndex = m_cbTree1.GetCurSel()) != CB_ERR)
  1180. {
  1181. m_cbTree1.GetLBText(nIndex, curText);
  1182. std::map<std::string, std::vector<UITree>>::iterator itTree = m_map_tree.find(curText.GetString());
  1183. if (itTree != m_map_tree.end())
  1184. {
  1185. for (auto it : itTree->second)
  1186. {
  1187. m_cbTree2.AddString(it.ui.c_str());
  1188. }
  1189. }
  1190. }
  1191. CString strCurChip = _T("");
  1192. CString strCurStyle = _T("");
  1193. m_cbTree2.SelectString(0, m_rscfg.menutree_style.c_str());
  1194. if ((nIndex = m_cbTree2.GetCurSel() ) != CB_ERR)
  1195. {
  1196. m_cbTree2.GetLBText(nIndex, strCurChip);
  1197. }
  1198. if ((nIndex = m_cbTree3.GetCurSel()) != CB_ERR)
  1199. {
  1200. m_cbTree3.GetLBText(nIndex, strCurStyle);
  1201. }
  1202. _stprintf_s(m_szCurMenuTreeDir, _T("%s%s%s\\%s\\"), m_rscfg.sat_home.c_str(), _T("resource\\MenuTree\\"), strCurChip.GetString(), strCurStyle.GetString());
  1203. }
  1204. AutoSetDroppedWidth(&m_cbTree1);
  1205. AutoSetDroppedWidth(&m_cbTree2);
  1206. AutoSetDroppedWidth(&m_cbTree3);
  1207. }
  1208. LRESULT CIRControlWnd::OnIRShotImg(WPARAM wparam, LPARAM lparam)
  1209. {
  1210. return LRESULT();
  1211. }