TestWizardToolDlg.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688
  1. // TestWizardToolDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "TestWizardTool.h"
  5. #include "TestWizardToolDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #endif
  9. #define MINIMUM_WINDOWS_X 395
  10. #define MINIMUM_WINDOWS_Y 535
  11. unsigned char TwoHexChar2Char(char ch1, char ch2)
  12. {
  13. char Numb1;
  14. char Numb2;
  15. if (ch1 >= 'A')
  16. Numb1 = (toupper(ch1) - '0' - 7) * 16;
  17. else
  18. Numb1 = (ch1 - '0') * 16;
  19. if (ch2 >= 'A')
  20. Numb2 = (toupper(ch2) - '0' - 7);
  21. else
  22. Numb2 = (ch2 - '0');
  23. return (Numb1 + Numb2);
  24. }
  25. COLORREF HexColor2RGB(std::string strHexColor)
  26. {
  27. DWORD r = TwoHexChar2Char(strHexColor[0], strHexColor[1]);
  28. DWORD g = TwoHexChar2Char(strHexColor[2], strHexColor[3]);
  29. DWORD b = TwoHexChar2Char(strHexColor[4], strHexColor[5]);
  30. return RGB(r, g, b);
  31. }
  32. BOOL GetSysSerialPort(std::vector<std::string>& vtports)
  33. {
  34. HKEY hKey;
  35. LSTATUS lReg = 0;
  36. DWORD dwMaxValLen = 0;
  37. DWORD dwValNum = 0;
  38. lReg = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_QUERY_VALUE, &hKey);
  39. if (lReg != ERROR_SUCCESS)
  40. {
  41. return FALSE;
  42. }
  43. lReg = RegQueryInfoKeyA(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwValNum, &dwMaxValLen, NULL, NULL, NULL);
  44. if (lReg != ERROR_SUCCESS)
  45. {
  46. return FALSE;
  47. }
  48. if (vtports.size())
  49. {
  50. vtports.clear();
  51. }
  52. LPSTR lpValName, lpComNum;
  53. DWORD dwValName, dwValSize = 6;
  54. for (DWORD i = 0; i < dwValNum; i++)
  55. {
  56. dwValName = dwMaxValLen + 1;
  57. dwValSize = 6;
  58. lpValName = (LPSTR)VirtualAlloc(NULL, dwValName, MEM_COMMIT, PAGE_READWRITE);
  59. lReg = RegEnumValueA(hKey, i, lpValName, &dwValName, NULL, NULL, NULL, NULL);
  60. if ((lReg != ERROR_SUCCESS) && (lReg != ERROR_NO_MORE_ITEMS))
  61. {
  62. continue;
  63. }
  64. lpComNum = (LPSTR)VirtualAlloc(NULL, 6, MEM_COMMIT, PAGE_READWRITE);
  65. lReg = RegQueryValueExA(hKey, lpValName, NULL, NULL, (LPBYTE)lpComNum, &dwValSize);
  66. if (lReg != ERROR_SUCCESS)
  67. {
  68. continue;
  69. }
  70. vtports.push_back(lpComNum);
  71. VirtualFree(lpValName, 0, MEM_RELEASE);
  72. VirtualFree(lpComNum, 0, MEM_RELEASE);
  73. }
  74. return TRUE;
  75. }
  76. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  77. class CAboutDlg : public CDialog
  78. {
  79. public:
  80. CAboutDlg();
  81. // 对话框数据
  82. enum { IDD = IDD_ABOUTBOX };
  83. protected:
  84. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  85. // 实现
  86. protected:
  87. DECLARE_MESSAGE_MAP()
  88. };
  89. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  90. {
  91. }
  92. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  93. {
  94. CDialog::DoDataExchange(pDX);
  95. }
  96. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  97. END_MESSAGE_MAP()
  98. // CTestWizardToolDlg 对话框
  99. CTestWizardToolDlg::CTestWizardToolDlg(CWnd* pParent /*=NULL*/)
  100. : CDialog(CTestWizardToolDlg::IDD, pParent)
  101. {
  102. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  103. m_nCols = 3;
  104. m_nTopMargin = 8;
  105. m_nLeftMargin = 8;
  106. m_nComboHeight = 20;
  107. m_nDefaultWidth = 360;
  108. m_nDefaultHeight = 600;
  109. }
  110. void CTestWizardToolDlg::DoDataExchange(CDataExchange* pDX)
  111. {
  112. CDialog::DoDataExchange(pDX);
  113. DDX_Control(pDX, COMBO_COM, m_cbCOM);
  114. DDX_Control(pDX, COMBO_SINGALS, m_cbSignals);
  115. }
  116. BEGIN_MESSAGE_MAP(CTestWizardToolDlg, CDialog)
  117. ON_WM_SYSCOMMAND()
  118. ON_WM_PAINT()
  119. ON_WM_QUERYDRAGICON()
  120. ON_WM_QUERYDRAGICON()
  121. //}}AFX_MSG_MAP
  122. ON_WM_SIZE()
  123. ON_WM_SIZING()
  124. ON_WM_GETMINMAXINFO()
  125. // 信号按钮;
  126. ON_COMMAND_RANGE(BTNID, BTNID + 100, OnSignalBtnClick)
  127. ON_BN_CLICKED(BTN_OPEN_COM, &CTestWizardToolDlg::OnBnClickedOpenCom)
  128. ON_CBN_SELCHANGE(COMBO_SINGALS, &CTestWizardToolDlg::OnCbnSelchangeSingals)
  129. ON_BN_CLICKED(BTN_RELOAD_SIGNAL, &CTestWizardToolDlg::OnBnClickedReloadSignal)
  130. ON_WM_DESTROY()
  131. END_MESSAGE_MAP()
  132. // CTestWizardToolDlg 消息处理程序
  133. BOOL CTestWizardToolDlg::OnInitDialog()
  134. {
  135. CDialog::OnInitDialog();
  136. // 将“关于...”菜单项添加到系统菜单中。
  137. // IDM_ABOUTBOX 必须在系统命令范围内。
  138. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  139. ASSERT(IDM_ABOUTBOX < 0xF000);
  140. CMenu* pSysMenu = GetSystemMenu(FALSE);
  141. if (pSysMenu != NULL)
  142. {
  143. BOOL bNameValid;
  144. CString strAboutMenu;
  145. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  146. ASSERT(bNameValid);
  147. if (!strAboutMenu.IsEmpty())
  148. {
  149. pSysMenu->AppendMenu(MF_SEPARATOR);
  150. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  151. }
  152. }
  153. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  154. // 执行此操作
  155. SetIcon(m_hIcon, TRUE); // 设置大图标
  156. SetIcon(m_hIcon, FALSE); // 设置小图标
  157. // TODO: 在此添加额外的初始化代码
  158. GetSysSerialPort(m_vtPorts);
  159. InitSerialCombobox();
  160. m_cbCOM.SelectString(0, Global::g_Config.twPort.c_str());
  161. LoadSignals();
  162. m_cbSignals.SelectString(0, Global::g_Config.twUseSignal.c_str());
  163. LoadKeyInfo(m_vtKeyInfo, Global::g_Config.twSignaldir + _T("\\") + Global::g_Config.twUseSignal + _T(".xml"));
  164. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  165. }
  166. void CTestWizardToolDlg::OnSysCommand(UINT nID, LPARAM lParam)
  167. {
  168. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  169. {
  170. CAboutDlg dlgAbout;
  171. dlgAbout.DoModal();
  172. }
  173. else
  174. {
  175. CDialog::OnSysCommand(nID, lParam);
  176. }
  177. }
  178. // 如果向对话框添加最小化按钮,则需要下面的代码
  179. // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  180. // 这将由框架自动完成。
  181. void CTestWizardToolDlg::OnPaint()
  182. {
  183. if (IsIconic())
  184. {
  185. CPaintDC dc(this); // 用于绘制的设备上下文
  186. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  187. // 使图标在工作区矩形中居中
  188. int cxIcon = GetSystemMetrics(SM_CXICON);
  189. int cyIcon = GetSystemMetrics(SM_CYICON);
  190. CRect rect;
  191. GetClientRect(&rect);
  192. int x = (rect.Width() - cxIcon + 1) / 2;
  193. int y = (rect.Height() - cyIcon + 1) / 2;
  194. // 绘制图标
  195. dc.DrawIcon(x, y, m_hIcon);
  196. }
  197. else
  198. {
  199. CDialog::OnPaint();
  200. }
  201. }
  202. //当用户拖动最小化窗口时系统调用此函数取得光标
  203. //显示。
  204. HCURSOR CTestWizardToolDlg::OnQueryDragIcon()
  205. {
  206. return static_cast<HCURSOR>(m_hIcon);
  207. }
  208. BOOL CTestWizardToolDlg::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)
  209. {
  210. switch (nEventType)
  211. {
  212. // 串口拨掉;
  213. case DBT_DEVICEREMOVECOMPLETE:
  214. break;
  215. // 串口插入;
  216. case DBT_DEVICEARRIVAL:
  217. {
  218. GetSysSerialPort(m_vtPorts);
  219. InitSerialCombobox();
  220. break;
  221. }
  222. default:
  223. break;
  224. }
  225. return TRUE;
  226. }
  227. void CTestWizardToolDlg::InitSerialCombobox()
  228. {
  229. m_cbCOM.ResetContent();
  230. for (std::vector<std::string>::iterator it = m_vtPorts.begin(); it != m_vtPorts.end(); it++)
  231. {
  232. m_cbCOM.AddString(it->c_str());
  233. }
  234. }
  235. void CTestWizardToolDlg::AdjustLayout()
  236. {
  237. if (GetSafeHwnd() == NULL || (AfxGetMainWnd() != NULL && AfxGetMainWnd()->IsIconic()) || !m_vtKeyInfo.size())
  238. {
  239. return;
  240. }
  241. CRect rcCtrl;
  242. CRect rectClient;
  243. GetClientRect(rectClient);
  244. TRACE2(_T("更新后的大小:%d,%d"), rectClient.Width(), rectClient.Height());
  245. m_cbCOM.GetWindowRect(rcCtrl);
  246. ScreenToClient(rcCtrl);
  247. int sx = 0, sy = rcCtrl.bottom + m_nTopMargin;
  248. int i = 0, id = 10000;
  249. int nWidth = (rectClient.Width() - 25) / m_nCols;
  250. DWORD dwStyle = WS_CHILD | WS_VISIBLE;
  251. for (std::vector<KeyInfo>::iterator it = m_vtKeyInfo.begin(); it != m_vtKeyInfo.end(); it++)
  252. {
  253. if (it->pbtnInfo->pBTN == NULL)
  254. continue;
  255. if (i != 0 && i % m_nCols == 0)
  256. {//换行;
  257. sy += it->height + m_nRowSpacing;
  258. }
  259. sx = m_nLeftMargin + (i % m_nCols) * nWidth + (i % m_nCols + 1) * m_nColSpacing;
  260. it->pbtnInfo->pBTN->SetWindowPos(NULL, sx, sy, nWidth, it->height, SWP_NOACTIVATE | SWP_NOZORDER);
  261. i++;
  262. }
  263. }
  264. void CTestWizardToolDlg::LoadSignals()
  265. {
  266. filehelper fh;
  267. m_vtTWSignal.clear();
  268. fh.getfiles_findout_subfolder(Global::g_Config.twSignaldir.c_str(), _T("*.xml"), &m_vtTWSignal);
  269. m_cbSignals.ResetContent();
  270. for (std::vector<std::string>::iterator it = m_vtTWSignal.begin(); it != m_vtTWSignal.end(); it++ )
  271. {
  272. m_cbSignals.AddString(fh.getfilename(it->c_str()).c_str());
  273. }
  274. }
  275. void CTestWizardToolDlg::LoadKeyInfo(std::vector<KeyInfo> &vtKeyInfo, std::string path)
  276. {
  277. // 解析xml;
  278. tinyxml2::XMLDocument doc;
  279. if (tinyxml2::XML_SUCCESS != doc.LoadFile(path.c_str()))
  280. {
  281. return;
  282. }
  283. vtKeyInfo.clear();
  284. std::string data;
  285. tinyxml2::XMLElement* pXmlRoot = NULL;
  286. if ((pXmlRoot = doc.RootElement()) != NULL)
  287. {
  288. if (_tcsicmp(pXmlRoot->Value(), "KeyList") == 0)
  289. {
  290. //////////////////////////////////////////////////////////////////////////
  291. // 获取属性;
  292. m_nCols = _tstoi(pXmlRoot->Attribute("cols") ? pXmlRoot->Attribute("cols") : "3");
  293. m_nRowSpacing = _tstoi(pXmlRoot->Attribute("rowSpacing") ? pXmlRoot->Attribute("rowSpacing") : "5");
  294. m_nColSpacing = _tstoi(pXmlRoot->Attribute("colSpacing") ? pXmlRoot->Attribute("colSpacing") : "5");
  295. m_nTopMargin = _tstoi(pXmlRoot->Attribute("topMargin") ? pXmlRoot->Attribute("topMargin") : "8");
  296. m_nLeftMargin = _tstoi(pXmlRoot->Attribute("leftMargin") ? pXmlRoot->Attribute("leftMargin") : "8");
  297. int nWidth = _tstoi(pXmlRoot->Attribute("with") ? pXmlRoot->Attribute("with") : "58");
  298. int nHeight = _tstoi(pXmlRoot->Attribute("height") ? pXmlRoot->Attribute("height") : "25");
  299. //////////////////////////////////////////////////////////////////////////
  300. // 子项;
  301. tinyxml2::XMLElement* pXmlElent = pXmlRoot->FirstChildElement();
  302. while (pXmlElent)
  303. {
  304. if (_tcsicmp(pXmlElent->Value(), _T("ITEM")) == 0)
  305. {
  306. KeyInfo keyInfo;
  307. // 获取属性值;
  308. keyInfo.width = pXmlElent->Attribute("with") ? _ttol(pXmlElent->Attribute("with")) : nWidth;
  309. keyInfo.height = pXmlElent->Attribute("height") ? _ttol(pXmlElent->Attribute("height")) : nHeight;
  310. keyInfo.color = HexColor2RGB(pXmlElent->Attribute("color") ? pXmlElent->Attribute("color") : "87CEFA");
  311. tinyxml2::XMLElement* pItem = pXmlElent->FirstChildElement();
  312. while (pItem)
  313. {
  314. if (_tcsicmp(pItem->Value(), _T("NAME")) == 0)
  315. {
  316. keyInfo.strName = pItem->GetText();
  317. }
  318. else if (_tcsicmp(pItem->Value(), _T("USE")) == 0)
  319. {
  320. keyInfo.bUse = pItem->BoolText(true);
  321. }
  322. else if (_tcsicmp(pItem->Value(), _T("DESC")) == 0)
  323. {
  324. keyInfo.strDesc = pItem->GetText();
  325. }
  326. else if (_tcsicmp(pItem->Value(), _T("TYPE")) == 0)
  327. {
  328. keyInfo.strType = pItem->GetText();
  329. }
  330. else if (_tcsicmp(pItem->Value(), _T("VALUE")) == 0)
  331. {
  332. keyInfo.strValue = pItem->GetText();
  333. }
  334. pItem = pItem->NextSiblingElement();
  335. }
  336. keyInfo.pbtnInfo = GetUnUseBTN();
  337. if ( keyInfo.pbtnInfo == NULL)
  338. {
  339. BTNInfo *pbtnInfo = new BTNInfo();
  340. pbtnInfo->pBTN = new CMFCButton();
  341. m_vtBTNInfo.push_back(pbtnInfo);
  342. keyInfo.pbtnInfo = pbtnInfo;
  343. }
  344. SetBTNStatus(keyInfo.pbtnInfo, TRUE);
  345. vtKeyInfo.push_back(keyInfo);
  346. }
  347. pXmlElent = pXmlElent->NextSiblingElement();
  348. }
  349. }
  350. }
  351. int sx = 0, sy = m_nComboHeight * 2 + 15;
  352. int i = 0, id = 10000;
  353. DWORD dwStyle = WS_CHILD | WS_VISIBLE;
  354. int maxX = 0, maxY = 0;
  355. for (std::vector<KeyInfo>::iterator it = vtKeyInfo.begin(); it != vtKeyInfo.end(); it++)
  356. {
  357. if (i != 0 && i % m_nCols == 0)
  358. {//换行;
  359. sy += it->height + m_nRowSpacing;
  360. }
  361. sx = (i % m_nCols) * it->width + (i % m_nCols + 1) * m_nColSpacing;
  362. m_nDefaultWidth = m_nLeftMargin + m_nCols * it->width + m_nCols * m_nColSpacing;
  363. if ( !it->pbtnInfo->bCreated )
  364. {
  365. it->pbtnInfo->pBTN->Create(it->strName.c_str(), dwStyle, CRect(sx, sy, sx + it->width, sy + it->height), this, BTNID + i);
  366. it->pbtnInfo->bCreated = true;
  367. // 设置透明false以显示背景色
  368. it->pbtnInfo->pBTN->m_bTransparent = FALSE;
  369. it->pbtnInfo->pBTN->m_bDontUseWinXPTheme = TRUE;
  370. // 消除单击时黑色内圈;
  371. it->pbtnInfo->pBTN->m_bDrawFocus = FALSE;
  372. // 设置按钮扁平样式;
  373. it->pbtnInfo->pBTN->m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
  374. // 设置鼠标形状;
  375. it->pbtnInfo->pBTN->SetMouseCursorHand();
  376. }
  377. // 设置背景色;
  378. it->pbtnInfo->pBTN->SetFaceColor(it->color, TRUE);
  379. // 显示窗口;
  380. it->pbtnInfo->pBTN->ShowWindow(SW_SHOW);
  381. // 是否禁用;
  382. it->pbtnInfo->pBTN->EnableWindow(it->bUse);
  383. // 存入map中;
  384. m_map_key.insert(std::pair<UINT, KeyInfo*>(BTNID + i, &*it));
  385. i++;
  386. }
  387. m_nDefaultHeight = sy + m_nTopMargin;
  388. m_nDefaultHeight = m_nDefaultHeight < MINIMUM_WINDOWS_Y ? MINIMUM_WINDOWS_Y : m_nDefaultHeight;
  389. m_nDefaultWidth = m_nDefaultWidth < MINIMUM_WINDOWS_X ? MINIMUM_WINDOWS_X : m_nDefaultWidth+30;
  390. // 设置窗口大小;
  391. SetWindowPos(NULL,0,0, m_nDefaultWidth, m_nDefaultHeight, SWP_NOMOVE);
  392. AdjustLayout();
  393. }
  394. BTNInfo *CTestWizardToolDlg::GetUnUseBTN()
  395. {
  396. for (std::vector<BTNInfo*>::iterator it = m_vtBTNInfo.begin(); it != m_vtBTNInfo.end(); it++ )
  397. {
  398. if ( !(*it)->bUsed )
  399. return *it;
  400. }
  401. return NULL;
  402. }
  403. void CTestWizardToolDlg::SetBTNStatus(BTNInfo *pbtnInfo, BOOL bStatus /* = TRUE */)
  404. {
  405. if ( pbtnInfo )
  406. {
  407. pbtnInfo->bUsed = bStatus;
  408. }
  409. }
  410. void CTestWizardToolDlg::SetAllBTNUnUsed()
  411. {
  412. BTNInfo *pbtnInfo = NULL;
  413. for (std::vector<BTNInfo*>::iterator it = m_vtBTNInfo.begin(); it != m_vtBTNInfo.end(); it++ )
  414. {
  415. pbtnInfo = (*it);
  416. if ( pbtnInfo )
  417. {
  418. pbtnInfo->bUsed = false;
  419. if ( pbtnInfo->bCreated )
  420. {
  421. pbtnInfo->pBTN->ShowWindow(SW_HIDE);
  422. }
  423. }
  424. }
  425. }
  426. void CTestWizardToolDlg::ClearAllBTNInfo()
  427. {
  428. BTNInfo *pbtnInfo = NULL;
  429. for (std::vector<BTNInfo*>::iterator it = m_vtBTNInfo.begin(); it != m_vtBTNInfo.end(); it++ )
  430. {
  431. pbtnInfo = (*it);
  432. if ( pbtnInfo )
  433. {
  434. pbtnInfo->pBTN->DestroyWindow();
  435. delete pbtnInfo->pBTN;
  436. pbtnInfo->pBTN = NULL;
  437. }
  438. delete pbtnInfo;
  439. pbtnInfo = NULL;
  440. }
  441. m_vtBTNInfo.clear();
  442. }
  443. void CTestWizardToolDlg::OnSize(UINT nType, int cx, int cy)
  444. {
  445. CDialog::OnSize(nType, cx, cy);
  446. // TODO: 在此处添加消息处理程序代码
  447. AdjustLayout();
  448. }
  449. void CTestWizardToolDlg::OnSizing(UINT fwSide, LPRECT pRect)
  450. {
  451. CDialog::OnSizing(fwSide, pRect);
  452. // TODO: 在此处添加消息处理程序代码
  453. }
  454. void CTestWizardToolDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
  455. {
  456. // TODO: 在此添加消息处理程序代码和/或调用默认值
  457. int cx = GetSystemMetrics(SM_CXSCREEN);
  458. int cy = GetSystemMetrics(SM_CYSCREEN);
  459. int nShellHight = 0;
  460. //获取任务栏
  461. CWnd* pTaskWnd = FindWindow( _T("Shell_TrayWnd"), NULL );
  462. if (pTaskWnd != NULL)
  463. {
  464. LONG lStyle = GetWindowLong( pTaskWnd->GetSafeHwnd(), GWL_STYLE );
  465. //如果任务栏存在且可见,要减去任务栏高度
  466. if( lStyle & WS_VISIBLE )
  467. {
  468. //任务栏可见
  469. RECT TastRect;
  470. pTaskWnd->GetWindowRect(&TastRect); //任务栏的尺寸
  471. nShellHight = TastRect.bottom - TastRect.top;
  472. }
  473. else
  474. {
  475. //任务栏隐藏 不做处理
  476. }
  477. }
  478. cy -= nShellHight;
  479. lpMMI->ptMaxSize.x = cx; // 设置窗口最大化时的宽度
  480. lpMMI->ptMaxSize.y = cy; // 设置窗口最大化时的高度
  481. lpMMI->ptMaxPosition.x = 0; // 设置窗口最大化时x坐标
  482. lpMMI->ptMaxPosition.y = 0; // 设置窗口最大化时y坐标
  483. lpMMI->ptMinTrackSize.x = MINIMUM_WINDOWS_X; // 设置窗口最小宽度
  484. lpMMI->ptMinTrackSize.y = MINIMUM_WINDOWS_Y; // 设置窗口最小高度
  485. lpMMI->ptMaxTrackSize.x = cx; // 设置窗口最大宽度
  486. lpMMI->ptMaxTrackSize.y = cy; // 设置窗口最大高度
  487. CDialog::OnGetMinMaxInfo(lpMMI);
  488. }
  489. void CTestWizardToolDlg::OnSignalBtnClick(UINT uId) // 发送遥控信号;
  490. {
  491. CWnd* pWnd = GetFocus();
  492. int id = pWnd->GetDlgCtrlID();
  493. if (id >= BTNID && id <= BTNID + 100)
  494. {
  495. CString text;
  496. pWnd->GetWindowText(text);
  497. KeyInfo *pKey = m_map_key.find(id)->second;
  498. if ( m_Serial.IsOpen() ){
  499. // 封装发送包;
  500. byte szSendData[MAX_PATH] = {0};
  501. _stprintf_s((TCHAR*)szSendData, MAX_PATH, _T("*INPUT %s %s\r"), pKey->strType.c_str(), pKey->strValue.c_str());
  502. // 发送单信号;
  503. if ( m_Serial.WriteSync(szSendData, _tcslen((TCHAR*)szSendData)) )
  504. {
  505. memset(szSendData, 0, MAX_PATH);
  506. m_Serial.ReadSync(szSendData, MAX_PATH);
  507. TRACE("发送单信号成功\n");
  508. }
  509. else
  510. {
  511. TRACE("发送单信号失败\n");
  512. }
  513. }
  514. else
  515. {
  516. MessageBox(_T("The serial port is not open."), _T("Warnning"), MB_OK|MB_ICONWARNING);
  517. }
  518. }
  519. }
  520. void CTestWizardToolDlg::OnBnClickedOpenCom() // 打开串口;
  521. {
  522. // TODO: 在此添加控件通知处理程序代码
  523. CString strText = _T("");
  524. GetDlgItemText(BTN_OPEN_COM, strText);
  525. if ( strText == _T("Open") )
  526. {
  527. int nCurSel = m_cbCOM.GetCurSel();
  528. if ( nCurSel != CB_ERR )
  529. {
  530. m_Serial.SetIOMode();
  531. m_cbCOM.GetLBText(nCurSel,strText);
  532. if ( m_Serial.Open(atol(strText.Mid(3).GetString()), 115200) )
  533. {
  534. SetDlgItemText(BTN_OPEN_COM, _T("Close"));
  535. m_cbCOM.EnableWindow(FALSE);
  536. m_Serial.SetBufferSize(1024,1024);
  537. WritePrivateProfileString("TestWizard", "Com", strText.GetString(), Global::g_szConfig);
  538. }
  539. }
  540. }
  541. else
  542. {
  543. m_cbCOM.EnableWindow();
  544. SetDlgItemText(BTN_OPEN_COM, _T("Open"));
  545. if ( m_Serial.IsOpen() )
  546. m_Serial.Close();
  547. }
  548. }
  549. void CTestWizardToolDlg::OnCbnSelchangeSingals()
  550. {
  551. // TODO: 在此添加控件通知处理程序代码
  552. CString strSignal;
  553. int nCurSel = m_cbSignals.GetCurSel();
  554. if (nCurSel != CB_ERR)
  555. {
  556. std::string signalpath;
  557. m_cbSignals.GetLBText(nCurSel, strSignal);
  558. // 保存到配置文件中;
  559. Global::g_Config.twUseSignal = strSignal.GetString();
  560. WritePrivateProfileString("TestWizard", "useSignal", strSignal.GetString(), Global::g_szConfig);
  561. SetAllBTNUnUsed();
  562. LoadKeyInfo(m_vtKeyInfo, Global::g_Config.twSignaldir + _T("\\") + Global::g_Config.twUseSignal + _T(".xml"));
  563. }
  564. }
  565. void CTestWizardToolDlg::OnBnClickedReloadSignal() // 重新加载;
  566. {
  567. // TODO: 在此添加控件通知处理程序代码
  568. LoadSignals();
  569. m_cbSignals.SelectString(0, Global::g_Config.twUseSignal.c_str());
  570. }
  571. void CTestWizardToolDlg::OnDestroy()
  572. {
  573. CDialog::OnDestroy();
  574. // TODO: 在此处添加消息处理程序代码
  575. ClearAllBTNInfo();
  576. }
  577. void CTestWizardToolDlg::OnOK()
  578. {
  579. // TODO: 在此添加专用代码和/或调用基类
  580. //CDialog::OnOK();
  581. }