IRControlWnd.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717
  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 "VideoCapture.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. /////////////////////////////////////////////////////////////////////////////
  24. // CResourceViewBar
  25. unsigned char TwoHexChar2Char(char ch1, char ch2)
  26. {
  27. char Numb1;
  28. char Numb2;
  29. if (ch1 >= 'A')
  30. Numb1 = (toupper(ch1) - '0' - 7) * 16;
  31. else
  32. Numb1 = (ch1 - '0') * 16;
  33. if (ch2 >= 'A')
  34. Numb2 = (toupper(ch2) - '0' - 7);
  35. else
  36. Numb2 = (ch2 - '0');
  37. return (Numb1 + Numb2);
  38. }
  39. COLORREF HexColor2RGB(std::string strHexColor)
  40. {
  41. DWORD r = TwoHexChar2Char(strHexColor[0], strHexColor[1]);
  42. DWORD g = TwoHexChar2Char(strHexColor[2], strHexColor[3]);
  43. DWORD b = TwoHexChar2Char(strHexColor[4], strHexColor[5]);
  44. return RGB(r, g, b);
  45. }
  46. CIRControlWnd::CIRControlWnd() noexcept
  47. {
  48. m_nComboHeight = 0;
  49. }
  50. CIRControlWnd::~CIRControlWnd()
  51. {
  52. FreeLogLibarary();
  53. for (std::vector<BtnInfo>::iterator it = m_vtBtnInfo.begin(); it != m_vtBtnInfo.end(); it++)
  54. {
  55. if (it->pBTN)
  56. it->pBTN->DestroyWindow();
  57. it->pBTN = NULL;
  58. }
  59. m_vtBtnInfo.clear();
  60. }
  61. // 重启进程按钮id;
  62. #define ID_BUTTON_RESTART_PROC 1
  63. // 复制框控件id;
  64. #define ID_CHECKBOX_SIGNAL_TYPE 2
  65. // 下拉框控件id;
  66. #define ID_COMBOBOX_SIGNAL_FILE 3
  67. BEGIN_MESSAGE_MAP(CIRControlWnd, CDockablePane)
  68. ON_WM_CREATE()
  69. ON_WM_SIZE()
  70. ON_COMMAND(ID_EXPAND_ALL, OnExpandAllProperties)
  71. ON_UPDATE_COMMAND_UI(ID_EXPAND_ALL, OnUpdateExpandAllProperties)
  72. ON_COMMAND(ID_SORTPROPERTIES, OnSortProperties)
  73. ON_UPDATE_COMMAND_UI(ID_SORTPROPERTIES, OnUpdateSortProperties)
  74. ON_COMMAND(ID_PROPERTIES1, OnProperties1)
  75. ON_UPDATE_COMMAND_UI(ID_PROPERTIES1, OnUpdateProperties1)
  76. ON_COMMAND(ID_PROPERTIES2, OnProperties2)
  77. ON_UPDATE_COMMAND_UI(ID_PROPERTIES2, OnUpdateProperties2)
  78. ON_WM_SETFOCUS()
  79. ON_WM_SETTINGCHANGE()
  80. ON_WM_PAINT()
  81. // 信号按钮;
  82. ON_COMMAND_RANGE(BTNID, BTNID + 100, OnSignalBtnClick)
  83. ON_UPDATE_COMMAND_UI_RANGE(BTNID, BTNID + 100, OnUpdateSignalBtn)
  84. // checkbox
  85. ON_UPDATE_COMMAND_UI(ID_CHECKBOX_SIGNAL_TYPE, OnUpdateCheckBox)
  86. ON_COMMAND(ID_CHECKBOX_SIGNAL_TYPE, OnCheckBoxClicked)
  87. //
  88. ON_CBN_SELCHANGE(ID_COMBOBOX_SIGNAL_FILE, &CIRControlWnd::OnCbnSelchangeSignal)
  89. ON_UPDATE_COMMAND_UI(ID_BUTTON_RESTART_PROC, OnUpdateBtnRestartProc)
  90. ON_COMMAND(ID_BUTTON_RESTART_PROC, OnBtnRestartProcClicked)
  91. END_MESSAGE_MAP()
  92. /////////////////////////////////////////////////////////////////////////////
  93. // CResourceViewBar 消息处理程序
  94. void CIRControlWnd::AdjustLayout()
  95. {
  96. if (GetSafeHwnd() == nullptr || (AfxGetMainWnd() != nullptr && AfxGetMainWnd()->IsIconic()))
  97. {
  98. return;
  99. }
  100. CRect rectClient;
  101. GetClientRect(rectClient);
  102. m_btnRestart.SetWindowPos(nullptr, rectClient.left + 5, rectClient.top + 5, 180, m_nComboHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  103. m_wndSignalCheck.SetWindowPos(nullptr, rectClient.left + 190, rectClient.top + 5, 150, m_nComboHeight, SWP_NOACTIVATE | SWP_NOZORDER);
  104. m_wndSignalCombo.SetWindowPos(nullptr, rectClient.left + 5, rectClient.top + m_nComboHeight + 10, rectClient.Width() - 10, m_nComboHeight + 210, SWP_NOACTIVATE | SWP_NOZORDER);
  105. #if __PANE_DLG__
  106. m_dlgIRControl.SetWindowPos(nullptr, rectClient.left, rectClient.top + m_nComboHeight, rectClient.Width(), rectClient.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
  107. #endif
  108. }
  109. int CIRControlWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
  110. {
  111. if (CDockablePane::OnCreate(lpCreateStruct) == -1)
  112. return -1;
  113. CRect rectDummy;
  114. rectDummy.SetRectEmpty();
  115. // 创建组合:
  116. const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_BORDER | CBS_SORT | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
  117. if (!m_btnRestart.Create(_T("重启遥控器服务端进程"), WS_CHILD | WS_VISIBLE, rectDummy, this, ID_BUTTON_RESTART_PROC))
  118. {
  119. TRACE0("未能创建遥控器组合 \n");
  120. return -1; // 未能创建
  121. }
  122. if (!m_wndSignalCheck.Create(_T("通用遥控器选择"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, rectDummy, this, ID_CHECKBOX_SIGNAL_TYPE))
  123. {
  124. TRACE0("未能创建信号集下拉框 \n");
  125. return -1; // 未能创建
  126. }
  127. m_wndSignalCheck.SetCheck(Global::g_Config.bGenerics ? BST_CHECKED : BST_UNCHECKED);
  128. m_wndSignalCheck.m_bHighlightChecked = TRUE;
  129. // CMFCButton只能用图标来显示check;
  130. m_wndSignalCheck.SetImage(IDB_UNCHECKED);
  131. m_wndSignalCheck.SetCheckedImage(IDB_CHECKED);
  132. m_wndSignalCheck.m_bTransparent = FALSE;
  133. m_wndSignalCheck.m_bDrawFocus = FALSE;
  134. m_wndSignalCheck.m_nFlatStyle = CMFCButton::BUTTONSTYLE_FLAT;
  135. m_wndSignalCheck.SizeToContent();
  136. if (!m_wndSignalCombo.Create(dwViewStyle| WS_VSCROLL, rectDummy, this, ID_COMBOBOX_SIGNAL_FILE))
  137. {
  138. TRACE0("未能创建信号集下拉框 \n");
  139. return -1; // 未能创建
  140. }
  141. LoadSignals();
  142. CRect rectCombo;
  143. m_wndSignalCombo.GetClientRect(&rectCombo);
  144. m_nComboHeight = rectCombo.Height();
  145. #if __PANE_DLG__
  146. if (!m_dlgIRControl.Create(IDD_DLG_IRCONTROL, this))
  147. {
  148. TRACE0("未能创建遥控器主窗口 \n");
  149. return -1; // 未能创建
  150. }
  151. m_dlgIRControl.ShowWindow(SW_SHOW);
  152. #else
  153. Loadlayout(m_vtBtnInfo);
  154. #endif
  155. // 设置最小窗体;
  156. SetMinSize((350, 420));
  157. // 校正布局;
  158. AdjustLayout();
  159. //////////////////////////////////////////////////////////////////////////
  160. // 启动红老鼠;
  161. if (!LoadLogLibarary())
  162. {
  163. AfxMessageBox("加载遥控dll失败,请检测dll是否正常!");
  164. }
  165. #if 1
  166. ReStartIRDevice();
  167. #else
  168. // 启动服务;
  169. if (g_IsAppRunning(Global::g_Config.redratpath.c_str()))
  170. {
  171. TRACE("启动红老鼠进程已运行\r");
  172. }
  173. else
  174. {
  175. TRACE("启动红老鼠进程未运行\r");
  176. if (g_StartIRApp(Global::g_Config.redratpath.c_str(), ".\\default.xml", 40000))
  177. {
  178. TRACE("启动红老鼠进程启动成功\r");
  179. }
  180. else
  181. {
  182. TRACE("启动红老鼠进程启动失败\r");
  183. AfxMessageBox("启动红老鼠进程启动失败!");
  184. }
  185. }
  186. Sleep(3500); // 等待进程启动完全;
  187. // 连接服务器;
  188. if (!g_Connect(_T("127.0.0.1"), 40000))
  189. AfxMessageBox("连接红老鼠服务端失败,请重启设备!");
  190. UpdateSignalBtnStatus();
  191. // 获取设备列表,以逗号分隔;
  192. std::string devices = g_getDeviceNames();
  193. if (devices.size() == 0)
  194. {
  195. AfxMessageBox("当前无红老鼠设备连接!");
  196. }
  197. std::string signale = Global::g_Config.bGenerics ? Global::g_Config.signaldir + "\\general\\" : Global::g_Config.signaldir + "\\product\\";
  198. signale.append(Global::g_Config.use_signal + ".xml");
  199. // 加载指定目录的xml信号集文件;
  200. if (!g_loadSignalDataSet(signale.c_str()))
  201. {
  202. TRACE("加载信号集文件失败\r");
  203. AfxMessageBox("加载信号集文件失败!");
  204. }
  205. else
  206. {
  207. TRACE("加载信号集文件成功\r");
  208. }
  209. #endif
  210. return 0;
  211. }
  212. void CIRControlWnd::OnSize(UINT nType, int cx, int cy)
  213. {
  214. CDockablePane::OnSize(nType, cx, cy);
  215. TRACE2("坐标:%d,%d\n", cx, cy);
  216. AdjustLayout();
  217. }
  218. void CIRControlWnd::OnExpandAllProperties()
  219. {
  220. //m_wndPropList.ExpandAll();
  221. }
  222. void CIRControlWnd::OnUpdateExpandAllProperties(CCmdUI* /* pCmdUI */)
  223. {
  224. }
  225. void CIRControlWnd::OnSortProperties()
  226. {
  227. //m_wndPropList.SetAlphabeticMode(!m_wndPropList.IsAlphabeticMode());
  228. }
  229. void CIRControlWnd::OnUpdateSortProperties(CCmdUI* pCmdUI)
  230. {
  231. //pCmdUI->SetCheck(m_wndPropList.IsAlphabeticMode());
  232. }
  233. void CIRControlWnd::OnProperties1()
  234. {
  235. // TODO: 在此处添加命令处理程序代码
  236. }
  237. void CIRControlWnd::OnUpdateProperties1(CCmdUI* /*pCmdUI*/)
  238. {
  239. // TODO: 在此处添加命令更新 UI 处理程序代码
  240. }
  241. void CIRControlWnd::OnProperties2()
  242. {
  243. // TODO: 在此处添加命令处理程序代码
  244. }
  245. void CIRControlWnd::OnUpdateProperties2(CCmdUI* /*pCmdUI*/)
  246. {
  247. // TODO: 在此处添加命令更新 UI 处理程序代码
  248. }
  249. void CIRControlWnd::OnSetFocus(CWnd* pOldWnd)
  250. {
  251. CDockablePane::OnSetFocus(pOldWnd);
  252. }
  253. void CIRControlWnd::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
  254. {
  255. CDockablePane::OnSettingChange(uFlags, lpszSection);
  256. //SetPropListFont();
  257. }
  258. void CIRControlWnd::OnCbnSelchangeSignal()
  259. {
  260. CString strSignal;
  261. int nCurSel = m_wndSignalCombo.GetCurSel();
  262. if ( nCurSel != CB_ERR )
  263. {
  264. std::string signalpath;
  265. m_wndSignalCombo.GetLBText(nCurSel, strSignal);
  266. // 保存到配置文件中;
  267. Global::g_Config.use_signal = strSignal.GetString();
  268. WritePrivateProfileString("ir-device", "use-signal", strSignal.GetString(), Global::g_szConfig);
  269. }
  270. DisableSignalBtn();
  271. ReLoadSignalXml();
  272. }
  273. void CIRControlWnd::SetPropListFont()
  274. {
  275. ::DeleteObject(m_fntPropList.Detach());
  276. LOGFONT lf;
  277. afxGlobalData.fontRegular.GetLogFont(&lf);
  278. NONCLIENTMETRICS info;
  279. info.cbSize = sizeof(info);
  280. afxGlobalData.GetNonClientMetrics(info);
  281. lf.lfHeight = info.lfMenuFont.lfHeight;
  282. lf.lfWeight = info.lfMenuFont.lfWeight;
  283. lf.lfItalic = info.lfMenuFont.lfItalic;
  284. m_fntPropList.CreateFontIndirect(&lf);
  285. //m_wndObjectCombo.SetFont(&m_fntPropList);
  286. }
  287. void CIRControlWnd::ReStartIRDevice(std::string signalName)
  288. {
  289. std::thread t([&](std::string signal_name) {
  290. // 结束进程;
  291. if (g_CloseApp)
  292. g_CloseApp();
  293. // 默认加载配置的信号集文件;
  294. std::string signale = Global::g_Config.bGenerics ? Global::g_Config.signaldir + "\\general\\" : Global::g_Config.signaldir + "\\product\\";
  295. signale.append(Global::g_Config.use_signal + ".xml");
  296. if ( !PathFileExists(signale.c_str()) )
  297. {
  298. m_wndSignalCombo.SetCurSel(-1);
  299. signale = ".\\default.xml";
  300. }
  301. else
  302. {
  303. m_wndSignalCombo.SelectString(0, Global::g_Config.use_signal.c_str());
  304. }
  305. if (g_StartIRApp(Global::g_Config.redratpath.c_str(), signale.c_str(), 40000))
  306. {
  307. TRACE("启动红老鼠进程启动成功\r");
  308. }
  309. else
  310. {
  311. TRACE("启动红老鼠进程启动失败\r");
  312. AfxMessageBox("启动红老鼠进程启动失败!");
  313. }
  314. BOOL bRet = FALSE;
  315. // 连接服务器;
  316. for (int i = 0; i < 5; i++)
  317. {
  318. if ((bRet = g_Connect(_T("127.0.0.1"), 40000)))
  319. break;
  320. Sleep(1000);
  321. }
  322. if (!bRet)
  323. AfxMessageBox("连接红老鼠服务端失败,请重启设备!");
  324. // 更新按钮状态;
  325. UpdateSignalBtnStatus();
  326. // 获取设备列表,以逗号分隔;
  327. std::string devices = g_getDeviceNames();
  328. if (devices.size() == 0)
  329. {
  330. AfxMessageBox("当前无红老鼠设备连接!");
  331. }
  332. }, signalName);
  333. t.detach();
  334. }
  335. void CIRControlWnd::ReLoadSignalXml()
  336. {
  337. std::string signaldir,signalpath;
  338. if (Global::g_Config.bGenerics)
  339. {
  340. signaldir = Global::g_Config.signaldir + "\\general\\";
  341. }
  342. else
  343. {
  344. signaldir = Global::g_Config.signaldir + "\\product\\";
  345. }
  346. signalpath = signaldir;
  347. signalpath.append(Global::g_Config.use_signal + ".xml");
  348. if (!PathFileExists(signalpath.c_str()))
  349. {
  350. AfxMessageBox(_T("该信号文件不存在!"));
  351. // 设置默认的;
  352. CString strSignal;
  353. m_wndSignalCombo.SetCurSel(0);
  354. m_wndSignalCombo.GetLBText(0, strSignal);
  355. signalpath = signaldir;
  356. signalpath.append(strSignal.GetString());
  357. signalpath.append(".xml");
  358. // 保存到配置文件中;
  359. Global::g_Config.use_signal = strSignal.GetString();
  360. WritePrivateProfileString("ir-device", "use-signal", strSignal.GetString(), Global::g_szConfig);
  361. }
  362. else // 切换通用类型时用到;
  363. {
  364. m_wndSignalCombo.SelectString(0, Global::g_Config.use_signal.c_str());
  365. }
  366. // 加载指定目录的xml信号集文件;
  367. if (!g_loadSignalDataSet(signalpath.c_str()))
  368. {
  369. TRACE("加载信号集文件失败\r");
  370. }
  371. else
  372. {
  373. TRACE("加载信号集文件成功\r");
  374. UpdateSignalBtnStatus();
  375. }
  376. }
  377. void CIRControlWnd::LoadSignals()
  378. {
  379. filehelper fh;
  380. fh.getfolderfiles((Global::g_Config.signaldir + "\\general\\").c_str(), NULL, &m_vtsignal_gen);
  381. fh.getfolderfiles((Global::g_Config.signaldir + "\\product\\").c_str(), NULL, &m_vtsignal_pro);
  382. // 添加到combobox中;
  383. if (Global::g_Config.bGenerics )
  384. {
  385. m_wndSignalCombo.ResetContent();
  386. for ( auto it : m_vtsignal_gen)
  387. {
  388. m_wndSignalCombo.AddString(fh.getfilename(it).c_str());
  389. }
  390. }
  391. else
  392. {
  393. m_wndSignalCombo.ResetContent();
  394. for (auto it : m_vtsignal_pro)
  395. {
  396. m_wndSignalCombo.AddString(fh.getfilename(it).c_str());
  397. }
  398. }
  399. }
  400. void CIRControlWnd::Loadlayout(std::vector<BtnInfo>& vt)
  401. {
  402. // 解析xml;
  403. std::string path;
  404. path.append(Global::g_szCurModuleDir);
  405. path.append("layout.xml");
  406. tinyxml2::XMLDocument doc;
  407. if (tinyxml2::XML_SUCCESS != doc.LoadFile(path.c_str()))
  408. {
  409. return;
  410. }
  411. vt.clear();
  412. std::string data;
  413. tinyxml2::XMLElement* pXmlRoot = NULL;
  414. if ((pXmlRoot = doc.RootElement()) != NULL)
  415. {
  416. if (_tcsicmp(pXmlRoot->Value(), "ButtonList") == 0)
  417. {
  418. // 子项;
  419. tinyxml2::XMLElement* pXmlElent = pXmlRoot->FirstChildElement();
  420. while (pXmlElent)
  421. {
  422. BtnInfo btninfo;
  423. if (_tcsicmp(pXmlElent->Value(), _T("ITEM")) == 0)
  424. {
  425. tinyxml2::XMLElement* pItem = pXmlElent->FirstChildElement();
  426. while (pItem)
  427. {
  428. if (_tcsicmp(pItem->Value(), _T("NAME")) == 0)
  429. {
  430. btninfo.name = pItem->GetText();
  431. }
  432. else if (_tcsicmp(pItem->Value(), _T("WIDTH")) == 0)
  433. {
  434. data = pItem->GetText();
  435. btninfo.width = _ttol(data.c_str());
  436. }
  437. else if (_tcsicmp(pItem->Value(), _T("HEIGHT")) == 0)
  438. {
  439. data = pItem->GetText();
  440. btninfo.height = _ttol(data.c_str());
  441. }
  442. else if (_tcsicmp(pItem->Value(), _T("COLOR")) == 0)
  443. {
  444. data = pItem->GetText();
  445. btninfo.color = HexColor2RGB(data);
  446. }
  447. btninfo.pBTN = new CMFCButton();
  448. pItem = pItem->NextSiblingElement();
  449. }
  450. }
  451. vt.push_back(btninfo);
  452. pXmlElent = pXmlElent->NextSiblingElement();
  453. }
  454. }
  455. }
  456. int sx = 0, sy = 80;
  457. int i = 0, id = 10000;
  458. DWORD dwStyle = WS_CHILD | WS_VISIBLE;
  459. for (std::vector<BtnInfo>::iterator it = vt.begin(); it != vt.end(); it++)
  460. {
  461. if (i != 0 && i % 4 == 0)
  462. {//换行;
  463. sy += it->height + 5;
  464. }
  465. sx = (i % 4) * it->width + (i % 4 + 1) * 5;
  466. it->pBTN->Create(it->name.c_str(), dwStyle, CRect(sx, sy, sx + it->width, sy + it->height), this, BTNID + i);
  467. // 设置透明false以显示背景色
  468. it->pBTN->m_bTransparent = FALSE;
  469. it->pBTN->m_bDontUseWinXPTheme = TRUE;
  470. // 设置背景色;
  471. it->pBTN->SetFaceColor(it->color, TRUE);
  472. // 消除单击时黑色内圈;
  473. it->pBTN->m_bDrawFocus = FALSE;
  474. // 设置按钮扁平样式;
  475. it->pBTN->m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
  476. // 设置鼠标形状;
  477. it->pBTN->SetMouseCursorHand();
  478. // 存入map中;
  479. m_map_btn.insert(std::pair<UINT, BtnInfo&>(BTNID+i, *it));
  480. i++;
  481. }
  482. }
  483. // 如果CDockablePane无控件,改变大小时背景会刷新失败;
  484. // 所以要重载onpaint;
  485. void CIRControlWnd::OnPaint()
  486. {
  487. CPaintDC dc(this); // device context for painting
  488. // TODO: 在此处添加消息处理程序代码
  489. // 不为绘图消息调用 CDockablePane::OnPaint();
  490. #if !__PANE_DLG__
  491. CRect rc;
  492. GetClientRect(rc);
  493. CBrush brush;
  494. brush.CreateSolidBrush(0xFFEFD5);
  495. dc.FillRect(&rc, &brush);
  496. #endif
  497. }
  498. void CIRControlWnd::OnSignalBtnClick(UINT uId) // 发送遥控信号;
  499. {
  500. CWnd* pWnd = GetFocus();
  501. int id = pWnd->GetDlgCtrlID();
  502. if (id >= BTNID && id <= BTNID + 100)
  503. {
  504. CString text;
  505. pWnd->GetWindowText(text);
  506. // 发送单信号;
  507. if (g_sendSignal(text.GetString(), 1, 20))
  508. {
  509. TRACE("发送单信号成功\n");
  510. }
  511. else
  512. {
  513. TRACE("发送单信号失败\n");
  514. }
  515. }
  516. }
  517. void CIRControlWnd::OnUpdateSignalBtn(CCmdUI* pCmdUI)
  518. {
  519. pCmdUI->Enable(m_map_btn.find(pCmdUI->m_nID)->second.bEnable);
  520. }
  521. void CIRControlWnd::OnUpdateCheckBox(CCmdUI* pCmdUI)
  522. {
  523. pCmdUI->Enable();
  524. }
  525. void CIRControlWnd::OnCheckBoxClicked()
  526. {
  527. Global::g_Config.bGenerics = m_wndSignalCheck.IsChecked();
  528. // 保存到配置文件中;
  529. WritePrivateProfileString("ir-device", "generics", Global::g_Config.bGenerics ? "1" : "0", Global::g_szConfig);
  530. // 添加到combobox中;
  531. if (Global::g_Config.bGenerics)
  532. {
  533. m_wndSignalCombo.ResetContent();
  534. for (auto it : m_vtsignal_gen)
  535. {
  536. m_wndSignalCombo.AddString(filehelper::getfilename(it).c_str());
  537. }
  538. }
  539. else
  540. {
  541. m_wndSignalCombo.ResetContent();
  542. for (auto it : m_vtsignal_pro)
  543. {
  544. m_wndSignalCombo.AddString(filehelper::getfilename(it).c_str());
  545. }
  546. }
  547. DisableSignalBtn();
  548. ReLoadSignalXml();
  549. }
  550. void CIRControlWnd::OnUpdateBtnRestartProc(CCmdUI* pCmdUI)
  551. {
  552. pCmdUI->Enable(TRUE);
  553. }
  554. void CIRControlWnd::OnBtnRestartProcClicked() // 重启红老鼠;
  555. {
  556. #if 1
  557. DisableSignalBtn();
  558. ReStartIRDevice();
  559. #else
  560. // 关闭旧类型进程;
  561. if (g_CloseApp)
  562. g_CloseApp();
  563. // 新启动类型进程;
  564. if (g_StartIRApp)
  565. {
  566. if (g_StartIRApp(Global::g_Config.redratpath.c_str(), ".\\default.xml", 40000))
  567. {
  568. TRACE("启动红老鼠进程启动成功\r");
  569. }
  570. else
  571. {
  572. TRACE("启动红老鼠进程启动失败\r");
  573. AfxMessageBox("启动红老鼠进程启动失败!");
  574. }
  575. }
  576. Sleep(5500); // 等待进程启动完全;
  577. // 连接服务器;
  578. if (!g_Connect(_T("127.0.0.1"), 40000))
  579. AfxMessageBox("连接红老鼠服务端失败,请重启设备!");
  580. // 获取设备列表,以逗号分隔;
  581. std::string devices = g_getDeviceNames();
  582. if (devices.size() == 0)
  583. {
  584. AfxMessageBox("当前无红老鼠设备连接!");
  585. }
  586. std::string signale = Global::g_Config.bGenerics ? Global::g_Config.signaldir + "\\general\\" : Global::g_Config.signaldir + "\\product\\";
  587. signale.append(Global::g_Config.use_signal + ".xml");
  588. // 加载指定目录的xml信号集文件;
  589. if (!g_loadSignalDataSet(signale.c_str()))
  590. {
  591. TRACE("加载信号集文件失败\r");
  592. AfxMessageBox("加载信号集文件失败!");
  593. }
  594. else
  595. {
  596. TRACE("加载信号集文件成功\r");
  597. UpdateSignalBtnStatus();
  598. }
  599. #endif
  600. }
  601. void CIRControlWnd::UpdateSignalBtnStatus()
  602. {
  603. // 获取信号集;
  604. if (g_getSignalsName )
  605. {
  606. // 获取信号数据集,以\n分隔;
  607. std::string data = g_getSignalsName();
  608. CString signals = data.append(1, '\n').c_str();
  609. signals.MakeUpper();
  610. for ( std::vector<BtnInfo>::iterator it = m_vtBtnInfo.begin(); it != m_vtBtnInfo.end(); it++)
  611. {
  612. if ( signals.Find((it->name+'\n').c_str()) == -1 )
  613. {
  614. it->bEnable = false;
  615. }
  616. else
  617. {
  618. it->bEnable = true;
  619. }
  620. }
  621. }
  622. }