Browse Source

1、学习红外-需另起后台线程处理。
2、保存xml-未完成

sat23 3 năm trước cách đây
mục cha
commit
542d7a3431

+ 315 - 309
FieldTestTool/FieldTestTool/MainFrm.cpp

@@ -35,14 +35,14 @@ const UINT uiFirstUserToolBarId = AFX_IDW_CONTROLBAR_FIRST + 40;
 const UINT uiLastUserToolBarId = uiFirstUserToolBarId + iMaxUserToolbars - 1;
 
 BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
-	ON_WM_CREATE()
+    ON_WM_CREATE()
     ON_WM_DEVICECHANGE()
-	ON_COMMAND(ID_WINDOW_MANAGER, &CMainFrame::OnWindowManager)
-	ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_OFF_2007_AQUA, &CMainFrame::OnApplicationLook)
-	ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_OFF_2007_AQUA, &CMainFrame::OnUpdateApplicationLook)
+    ON_COMMAND(ID_WINDOW_MANAGER, &CMainFrame::OnWindowManager)
+    ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_OFF_2007_AQUA, &CMainFrame::OnApplicationLook)
+    ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_OFF_2007_AQUA, &CMainFrame::OnUpdateApplicationLook)
 #ifndef DISABLE_CAPTIONBAR
     ON_COMMAND(ID_VIEW_CAPTION_BAR, &CMainFrame::OnViewCaptionBar)
-	ON_UPDATE_COMMAND_UI(ID_VIEW_CAPTION_BAR, &CMainFrame::OnUpdateViewCaptionBar)
+    ON_UPDATE_COMMAND_UI(ID_VIEW_CAPTION_BAR, &CMainFrame::OnUpdateViewCaptionBar)
 #endif
     // 摄像头;
     ON_COMMAND(ID_RIBBON_CAMERA_COMBOBOX, &CMainFrame::OnCameraCombobox)
@@ -79,7 +79,7 @@ END_MESSAGE_MAP()
 
 CMainFrame::CMainFrame()
 {
-	// TODO: 在此添加成员初始化代码
+    // TODO: 在此添加成员初始化代码
     m_pDoc = NULL;
     m_pDocTemplate = NULL;
     m_bFindTestWizardPort = false;
@@ -88,78 +88,78 @@ CMainFrame::CMainFrame()
     m_bSwitcherCheckB = false;
     m_pActiveView = NULL;
     m_pChildFrame = NULL;
-	theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_OFF_2007_BLUE);
+    theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_OFF_2007_BLUE);
 }
 
 CMainFrame::~CMainFrame()
 {
-    
+
 }
 
 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
 {
-	if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)
-		return -1;
-
-	BOOL bNameValid;
-	// 基于持久值设置视觉管理器和样式
-	OnApplicationLook(theApp.m_nAppLook);
-
-	CMDITabInfo mdiTabParams;
-	mdiTabParams.m_style = CMFCTabCtrl::STYLE_3D_ONENOTE; // 其他可用样式...
-	mdiTabParams.m_bActiveTabCloseButton = TRUE;      // 设置为 FALSE 会将关闭按钮放置在选项卡区域的右侧
-	mdiTabParams.m_bTabIcons = FALSE;    // 设置为 TRUE 将在 MDI 选项卡上启用文档图标
-	mdiTabParams.m_bAutoColor = TRUE;    // 设置为 FALSE 将禁用 MDI 选项卡的自动着色
-	mdiTabParams.m_bDocumentMenu = TRUE; // 在选项卡区域的右边缘启用文档菜单
-	EnableMDITabbedGroups(TRUE, mdiTabParams);
-
-	m_wndRibbonBar.Create(this);
-	InitializeRibbon();
-
-	if (!m_wndStatusBar.Create(this))
-	{
-		TRACE0("未能创建状态栏\n");
-		return -1;      // 未能创建
-	}
-
-	CString strTitlePane1;
-	CString strTitlePane2;
-	bNameValid = strTitlePane1.LoadString(IDS_STATUS_PANE1);
-	ASSERT(bNameValid);
-	bNameValid = strTitlePane2.LoadString(IDS_STATUS_PANE2);
-	ASSERT(bNameValid);
-	m_wndStatusBar.AddElement(new CMFCRibbonStatusBarPane(ID_STATUSBAR_PANE1, strTitlePane1, TRUE), strTitlePane1);
-	m_wndStatusBar.AddExtendedElement(new CMFCRibbonStatusBarPane(ID_STATUSBAR_PANE2, strTitlePane2, TRUE), strTitlePane2);
-
-	// 启用 Visual Studio 2005 样式停靠窗口行为
-	CDockingManager::SetDockingMode(DT_SMART);
-	// 启用 Visual Studio 2005 样式停靠窗口自动隐藏行为
-	EnableAutoHidePanes(CBRS_ALIGN_ANY);
-
-	// 导航窗格将创建在左侧,因此将暂时禁用左侧的停靠:
-	EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM | CBRS_ALIGN_RIGHT);
+    if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)
+        return -1;
+
+    BOOL bNameValid;
+    // 基于持久值设置视觉管理器和样式
+    OnApplicationLook(theApp.m_nAppLook);
+
+    CMDITabInfo mdiTabParams;
+    mdiTabParams.m_style = CMFCTabCtrl::STYLE_3D_ONENOTE; // 其他可用样式...
+    mdiTabParams.m_bActiveTabCloseButton = TRUE;      // 设置为 FALSE 会将关闭按钮放置在选项卡区域的右侧
+    mdiTabParams.m_bTabIcons = FALSE;    // 设置为 TRUE 将在 MDI 选项卡上启用文档图标
+    mdiTabParams.m_bAutoColor = TRUE;    // 设置为 FALSE 将禁用 MDI 选项卡的自动着色
+    mdiTabParams.m_bDocumentMenu = TRUE; // 在选项卡区域的右边缘启用文档菜单
+    EnableMDITabbedGroups(TRUE, mdiTabParams);
+
+    m_wndRibbonBar.Create(this);
+    InitializeRibbon();
+
+    if (!m_wndStatusBar.Create(this))
+    {
+        TRACE0("未能创建状态栏\n");
+        return -1;      // 未能创建
+    }
+
+    CString strTitlePane1;
+    CString strTitlePane2;
+    bNameValid = strTitlePane1.LoadString(IDS_STATUS_PANE1);
+    ASSERT(bNameValid);
+    bNameValid = strTitlePane2.LoadString(IDS_STATUS_PANE2);
+    ASSERT(bNameValid);
+    m_wndStatusBar.AddElement(new CMFCRibbonStatusBarPane(ID_STATUSBAR_PANE1, strTitlePane1, TRUE), strTitlePane1);
+    m_wndStatusBar.AddExtendedElement(new CMFCRibbonStatusBarPane(ID_STATUSBAR_PANE2, strTitlePane2, TRUE), strTitlePane2);
+
+    // 启用 Visual Studio 2005 样式停靠窗口行为
+    CDockingManager::SetDockingMode(DT_SMART);
+    // 启用 Visual Studio 2005 样式停靠窗口自动隐藏行为
+    EnableAutoHidePanes(CBRS_ALIGN_ANY);
+
+    // 导航窗格将创建在左侧,因此将暂时禁用左侧的停靠:
+    EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM | CBRS_ALIGN_RIGHT);
 
 #ifndef DISABLE_OUTLOOKBAR
-	// 创建并设置“Outlook”导航栏:
-	if (!CreateOutlookBar(m_wndNavigationBar, ID_VIEW_NAVIGATION, m_wndTree, m_wndCalendar, 250))
-	{
-		TRACE0("未能创建导航窗格\n");
-		return -1;      // 未能创建
-	}
+    // 创建并设置“Outlook”导航栏:
+    if (!CreateOutlookBar(m_wndNavigationBar, ID_VIEW_NAVIGATION, m_wndTree, m_wndCalendar, 250))
+    {
+        TRACE0("未能创建导航窗格\n");
+        return -1;      // 未能创建
+    }
 #endif
 
 #ifndef DISABLE_CAPTIONBAR
-	// 创建标题栏:
-	if (!CreateCaptionBar())
-	{
-		TRACE0("未能创建标题栏\n");
-		return -1;      // 未能创建
-	}
+    // 创建标题栏:
+    if (!CreateCaptionBar())
+    {
+        TRACE0("未能创建标题栏\n");
+        return -1;      // 未能创建
+    }
 #endif
 
-	// 已创建 Outlook 栏,应允许在左侧停靠。
-	EnableDocking(CBRS_ALIGN_LEFT);
-	EnableAutoHidePanes(CBRS_ALIGN_RIGHT);
+    // 已创建 Outlook 栏,应允许在左侧停靠。
+    EnableDocking(CBRS_ALIGN_LEFT);
+    EnableAutoHidePanes(CBRS_ALIGN_RIGHT);
 
     // 加载菜单项图像(不在任何标准工具栏上):
     //CMFCToolBar::AddToolBarForImageCollection(IDR_MENU_IMAGES, theApp.m_bHiColorIcons ? IDB_MENU_IMAGES_24 : 0);
@@ -174,8 +174,8 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
     m_wndProperties.EnableDocking(CBRS_ALIGN_ANY);
     DockPane(&m_wndProperties);
 
-	// 启用增强的窗口管理对话框
-	EnableWindowsDialog(ID_WINDOW_MANAGER, IDS_WINDOWS_MANAGER, TRUE);
+    // 启用增强的窗口管理对话框
+    EnableWindowsDialog(ID_WINDOW_MANAGER, IDS_WINDOWS_MANAGER, TRUE);
 
     SetTimer(0,100,NULL);
 
@@ -187,93 +187,93 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
     CMFCRibbonComboBox* pCameraCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_CAMERA_COMBOBOX));
     m_cap.EnumDevices(pCameraCombo);    
 
-	return 0;
+    return 0;
 }
 
 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
 {
-	if( !CMDIFrameWndEx::PreCreateWindow(cs) )
-		return FALSE;
-	// TODO: 在此处通过修改
-	//  CREATESTRUCT cs 来修改窗口类或样式
+    if( !CMDIFrameWndEx::PreCreateWindow(cs) )
+        return FALSE;
+    // TODO: 在此处通过修改
+    //  CREATESTRUCT cs 来修改窗口类或样式
 
-	return TRUE;
+    return TRUE;
 }
 
 void CMainFrame::InitializeRibbon()
 {
-	BOOL bNameValid;
+    BOOL bNameValid;
 
-	CString strTemp;
-	bNameValid = strTemp.LoadString(IDS_RIBBON_FILE);
-	ASSERT(bNameValid);
+    CString strTemp;
+    bNameValid = strTemp.LoadString(IDS_RIBBON_FILE);
+    ASSERT(bNameValid);
 
-	// 加载面板图像:
-	m_PanelImages.SetImageSize(CSize(16, 16));
-	m_PanelImages.Load(IDB_BUTTONS);
+    // 加载面板图像:
+    m_PanelImages.SetImageSize(CSize(16, 16));
+    m_PanelImages.Load(IDB_BUTTONS);
 
-	// 初始主按钮:
-	m_MainButton.SetImage(IDB_MAIN);
-	m_MainButton.SetText(_T("\nf"));
-	m_MainButton.SetToolTipText(strTemp);
+    // 初始主按钮:
+    m_MainButton.SetImage(IDB_MAIN);
+    m_MainButton.SetText(_T("\nf"));
+    m_MainButton.SetToolTipText(strTemp);
 
-	m_wndRibbonBar.SetApplicationButton(&m_MainButton, CSize (45, 45));
-	CMFCRibbonMainPanel* pMainPanel = m_wndRibbonBar.AddMainCategory(strTemp, IDB_FILESMALL, IDB_FILELARGE);
+    m_wndRibbonBar.SetApplicationButton(&m_MainButton, CSize (45, 45));
+    CMFCRibbonMainPanel* pMainPanel = m_wndRibbonBar.AddMainCategory(strTemp, IDB_FILESMALL, IDB_FILELARGE);
 
 #if 0 // 禁用文档相关菜单;
-	bNameValid = strTemp.LoadString(IDS_RIBBON_NEW);
-	ASSERT(bNameValid);
-	pMainPanel->Add(new CMFCRibbonButton(ID_FILE_NEW, strTemp, 0, 0));
-	bNameValid = strTemp.LoadString(IDS_RIBBON_OPEN);
-	ASSERT(bNameValid);
-	pMainPanel->Add(new CMFCRibbonButton(ID_FILE_OPEN, strTemp, 1, 1));
-	bNameValid = strTemp.LoadString(IDS_RIBBON_SAVE);
-	ASSERT(bNameValid);
-	pMainPanel->Add(new CMFCRibbonButton(ID_FILE_SAVE, strTemp, 2, 2));
-	bNameValid = strTemp.LoadString(IDS_RIBBON_SAVEAS);
-	ASSERT(bNameValid);
-	pMainPanel->Add(new CMFCRibbonButton(ID_FILE_SAVE_AS, strTemp, 3, 3));
+    bNameValid = strTemp.LoadString(IDS_RIBBON_NEW);
+    ASSERT(bNameValid);
+    pMainPanel->Add(new CMFCRibbonButton(ID_FILE_NEW, strTemp, 0, 0));
+    bNameValid = strTemp.LoadString(IDS_RIBBON_OPEN);
+    ASSERT(bNameValid);
+    pMainPanel->Add(new CMFCRibbonButton(ID_FILE_OPEN, strTemp, 1, 1));
+    bNameValid = strTemp.LoadString(IDS_RIBBON_SAVE);
+    ASSERT(bNameValid);
+    pMainPanel->Add(new CMFCRibbonButton(ID_FILE_SAVE, strTemp, 2, 2));
+    bNameValid = strTemp.LoadString(IDS_RIBBON_SAVEAS);
+    ASSERT(bNameValid);
+    pMainPanel->Add(new CMFCRibbonButton(ID_FILE_SAVE_AS, strTemp, 3, 3));
 #endif
 
 #if 0 // 禁用打印相关的菜单;
-	bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT);
-	ASSERT(bNameValid);
-	CMFCRibbonButton* pBtnPrint = new CMFCRibbonButton(ID_FILE_PRINT, strTemp, 6, 6);
-	pBtnPrint->SetKeys(_T("p"), _T("w"));
-	bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_LABEL);
-	ASSERT(bNameValid);
-	pBtnPrint->AddSubItem(new CMFCRibbonLabel(strTemp));
-	bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_QUICK);
-	ASSERT(bNameValid);
-	pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_DIRECT, strTemp, 7, 7, TRUE));
-	bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_PREVIEW);
-	ASSERT(bNameValid);
-	pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_PREVIEW, strTemp, 8, 8, TRUE));
-	bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_SETUP);
-	ASSERT(bNameValid);
-	pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_SETUP, strTemp, 11, 11, TRUE));
-	pMainPanel->Add(pBtnPrint);
-	pMainPanel->Add(new CMFCRibbonSeparator(TRUE));
+    bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT);
+    ASSERT(bNameValid);
+    CMFCRibbonButton* pBtnPrint = new CMFCRibbonButton(ID_FILE_PRINT, strTemp, 6, 6);
+    pBtnPrint->SetKeys(_T("p"), _T("w"));
+    bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_LABEL);
+    ASSERT(bNameValid);
+    pBtnPrint->AddSubItem(new CMFCRibbonLabel(strTemp));
+    bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_QUICK);
+    ASSERT(bNameValid);
+    pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_DIRECT, strTemp, 7, 7, TRUE));
+    bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_PREVIEW);
+    ASSERT(bNameValid);
+    pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_PREVIEW, strTemp, 8, 8, TRUE));
+    bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_SETUP);
+    ASSERT(bNameValid);
+    pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_SETUP, strTemp, 11, 11, TRUE));
+    pMainPanel->Add(pBtnPrint);
+    pMainPanel->Add(new CMFCRibbonSeparator(TRUE));
 #endif
 
-	bNameValid = strTemp.LoadString(IDS_RIBBON_CLOSE);
-	ASSERT(bNameValid);
-	pMainPanel->Add(new CMFCRibbonButton(ID_FILE_CLOSE, strTemp, 9, 9));
+    bNameValid = strTemp.LoadString(IDS_RIBBON_CLOSE);
+    ASSERT(bNameValid);
+    pMainPanel->Add(new CMFCRibbonButton(ID_FILE_CLOSE, strTemp, 9, 9));
 
 #if 0 // 去掉最近打开的文档;
-	bNameValid = strTemp.LoadString(IDS_RIBBON_RECENT_DOCS);
-	ASSERT(bNameValid);
-	pMainPanel->AddRecentFilesList(strTemp);
+    bNameValid = strTemp.LoadString(IDS_RIBBON_RECENT_DOCS);
+    ASSERT(bNameValid);
+    pMainPanel->AddRecentFilesList(strTemp);
 #endif
 
-	bNameValid = strTemp.LoadString(IDS_RIBBON_EXIT);
-	ASSERT(bNameValid);
-	pMainPanel->AddToBottom(new CMFCRibbonMainPanelButton(ID_APP_EXIT, strTemp, 15));
+    bNameValid = strTemp.LoadString(IDS_RIBBON_EXIT);
+    ASSERT(bNameValid);
+    pMainPanel->AddToBottom(new CMFCRibbonMainPanelButton(ID_APP_EXIT, strTemp, 15));
 
-	// 为“剪贴板”面板添加“主”类别:
-	bNameValid = strTemp.LoadString(IDS_RIBBON_HOME);
-	ASSERT(bNameValid);
-	CMFCRibbonCategory* pCategoryHome = m_wndRibbonBar.AddCategory(strTemp, IDB_WRITESMALL, IDB_WRITELARGE);
+    // 为“剪贴板”面板添加“主”类别:
+    bNameValid = strTemp.LoadString(IDS_RIBBON_HOME);
+    ASSERT(bNameValid);
+    CMFCRibbonCategory* pCategoryHome = m_wndRibbonBar.AddCategory(strTemp, IDB_WRITESMALL, IDB_WRITELARGE);
 
     //////////////////////////////////////////////////////////////////////////
     // 创建“摄像头”面板:
@@ -307,9 +307,9 @@ void CMainFrame::InitializeRibbon()
         pGroup->AddButton(pCameraFlush);
         pGroup->SetCompactMode(FALSE);
     }
-    
+
     //////////////////////////////////////////////////////////////////////////
-	// 创建“测试精灵”面板:
+    // 创建“测试精灵”面板:
     {
         bNameValid = strTemp.LoadString(IDS_RIBBON_INFRAED);
         ASSERT(bNameValid);
@@ -326,7 +326,7 @@ void CMainFrame::InitializeRibbon()
         CMFCRibbonComboBox* pInfraedCombobox = new CMFCRibbonComboBox(ID_RIBBON_INFRAED_COMBOBOX, FALSE);
         pGroup->AddButton(pInfraedCombobox);
         pInfraedCombobox->SetWidth(110);
-        
+
         bNameValid = strTemp.LoadString(IDS_RIBBON_INFRAED_CHECKBOX);
         ASSERT(bNameValid);
         CMFCRibbonCheckBox *pInfraedCheckbox = new CMFCRibbonCheckBox(ID_RIBBON_INFRAED_CHECKBOX, strTemp);
@@ -351,6 +351,8 @@ void CMainFrame::InitializeRibbon()
         pVersion->AddItem(_T("2nd-version"));
         //pVersion->AddItem(_T("3rd-version"));
         //pVersion->AddItem(_T("4th-version"));
+
+        pVersion->SelectItem(Global::g_nVersion-1);
     }
 
     // 创建“U盘切换器”面板:
@@ -391,33 +393,33 @@ void CMainFrame::InitializeRibbon()
         pGroupCheckBox->AddButton(pSwitcherCheckboxB);
     }
 
-	// 将元素添加到选项卡右侧:
-	bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE);
-	ASSERT(bNameValid);
-	CMFCRibbonButton* pVisualStyleButton = new CMFCRibbonButton(-1, strTemp, -1, -1);
-
-	pVisualStyleButton->SetMenu(IDR_THEME_MENU, FALSE /* 无默认命令*/, TRUE /* 右对齐*/);
-
-	bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE_TIP);
-	ASSERT(bNameValid);
-	pVisualStyleButton->SetToolTipText(strTemp);
-	bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE_DESC);
-	ASSERT(bNameValid);
-	pVisualStyleButton->SetDescription(strTemp);
-	m_wndRibbonBar.AddToTabs(pVisualStyleButton);
-   
+    // 将元素添加到选项卡右侧:
+    bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE);
+    ASSERT(bNameValid);
+    CMFCRibbonButton* pVisualStyleButton = new CMFCRibbonButton(-1, strTemp, -1, -1);
+
+    pVisualStyleButton->SetMenu(IDR_THEME_MENU, FALSE /* 无默认命令*/, TRUE /* 右对齐*/);
+
+    bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE_TIP);
+    ASSERT(bNameValid);
+    pVisualStyleButton->SetToolTipText(strTemp);
+    bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE_DESC);
+    ASSERT(bNameValid);
+    pVisualStyleButton->SetDescription(strTemp);
+    m_wndRibbonBar.AddToTabs(pVisualStyleButton);
+
 #ifndef DISABLE_QUICKACCESS
-	// 添加快速访问工具栏命令:
-	CList<UINT, UINT> lstQATCmds;
-
-	lstQATCmds.AddTail(ID_FILE_NEW);
-	lstQATCmds.AddTail(ID_FILE_OPEN);
-	lstQATCmds.AddTail(ID_FILE_SAVE);
-	lstQATCmds.AddTail(ID_FILE_PRINT_DIRECT);
-	m_wndRibbonBar.SetQuickAccessCommands(lstQATCmds);
+    // 添加快速访问工具栏命令:
+    CList<UINT, UINT> lstQATCmds;
+
+    lstQATCmds.AddTail(ID_FILE_NEW);
+    lstQATCmds.AddTail(ID_FILE_OPEN);
+    lstQATCmds.AddTail(ID_FILE_SAVE);
+    lstQATCmds.AddTail(ID_FILE_PRINT_DIRECT);
+    m_wndRibbonBar.SetQuickAccessCommands(lstQATCmds);
 #endif
 
-	m_wndRibbonBar.AddToTabs(new CMFCRibbonButton(ID_APP_ABOUT, _T("\na"), m_PanelImages.ExtractIcon (0)));
+    m_wndRibbonBar.AddToTabs(new CMFCRibbonButton(ID_APP_ABOUT, _T("\na"), m_PanelImages.ExtractIcon (0)));
 }
 
 BOOL CMainFrame::CreateDockingWindows()
@@ -449,95 +451,95 @@ void CMainFrame::SetDockingWindowIcons(BOOL bHiColorIcons)
 #ifndef DISABLE_OUTLOOKBAR
 BOOL CMainFrame::CreateOutlookBar(CMFCOutlookBar& bar, UINT uiID, CMFCShellTreeCtrl& tree, CCalendarBar& calendar, int nInitialWidth)
 {
-	CWindowDC dc(NULL);
+    CWindowDC dc(NULL);
 
-	bar.SetMode2003();
+    bar.SetMode2003();
 
-	BOOL bNameValid;
-	CString strTemp;
-	bNameValid = strTemp.LoadString(IDS_SHORTCUTS);
-	ASSERT(bNameValid);
-	if (!bar.Create(strTemp, this, CRect(0, 0, nInitialWidth, 32000), uiID, WS_CHILD | WS_VISIBLE | CBRS_LEFT))
-	{
-		return FALSE; // 未能创建
-	}
+    BOOL bNameValid;
+    CString strTemp;
+    bNameValid = strTemp.LoadString(IDS_SHORTCUTS);
+    ASSERT(bNameValid);
+    if (!bar.Create(strTemp, this, CRect(0, 0, nInitialWidth, 32000), uiID, WS_CHILD | WS_VISIBLE | CBRS_LEFT))
+    {
+        return FALSE; // 未能创建
+    }
 
-	CMFCOutlookBarTabCtrl* pOutlookBar = (CMFCOutlookBarTabCtrl*)bar.GetUnderlyingWindow();
+    CMFCOutlookBarTabCtrl* pOutlookBar = (CMFCOutlookBarTabCtrl*)bar.GetUnderlyingWindow();
 
-	if (pOutlookBar == NULL)
-	{
-		ASSERT(FALSE);
-		return FALSE;
-	}
+    if (pOutlookBar == NULL)
+    {
+        ASSERT(FALSE);
+        return FALSE;
+    }
 
-	pOutlookBar->EnableInPlaceEdit(TRUE);
+    pOutlookBar->EnableInPlaceEdit(TRUE);
 
-	static UINT uiPageID = 1;
+    static UINT uiPageID = 1;
 
-	DWORD dwPaneStyle = AFX_DEFAULT_TOOLBAR_STYLE | CBRS_FLOAT_MULTI;
+    DWORD dwPaneStyle = AFX_DEFAULT_TOOLBAR_STYLE | CBRS_FLOAT_MULTI;
 
-	// 可浮动,可自动隐藏,可调整大小,但不能关闭
-	DWORD dwStyle = AFX_CBRS_FLOAT | AFX_CBRS_AUTOHIDE | AFX_CBRS_RESIZE;
+    // 可浮动,可自动隐藏,可调整大小,但不能关闭
+    DWORD dwStyle = AFX_CBRS_FLOAT | AFX_CBRS_AUTOHIDE | AFX_CBRS_RESIZE;
 
-	CRect rectDummy(0, 0, 0, 0);
-	const DWORD dwTreeStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS;
+    CRect rectDummy(0, 0, 0, 0);
+    const DWORD dwTreeStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS;
 
-	tree.Create(dwTreeStyle, rectDummy, &bar, 1200);
-	bNameValid = strTemp.LoadString(IDS_FOLDERS);
-	ASSERT(bNameValid);
-	pOutlookBar->AddControl(&tree, strTemp, 2, TRUE, dwStyle);
+    tree.Create(dwTreeStyle, rectDummy, &bar, 1200);
+    bNameValid = strTemp.LoadString(IDS_FOLDERS);
+    ASSERT(bNameValid);
+    pOutlookBar->AddControl(&tree, strTemp, 2, TRUE, dwStyle);
 
-	calendar.Create(rectDummy, &bar, 1201);
-	bNameValid = strTemp.LoadString(IDS_CALENDAR);
-	ASSERT(bNameValid);
-	pOutlookBar->AddControl(&calendar, strTemp, 3, TRUE, dwStyle);
+    calendar.Create(rectDummy, &bar, 1201);
+    bNameValid = strTemp.LoadString(IDS_CALENDAR);
+    ASSERT(bNameValid);
+    pOutlookBar->AddControl(&calendar, strTemp, 3, TRUE, dwStyle);
 
-	bar.SetPaneStyle(bar.GetPaneStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
+    bar.SetPaneStyle(bar.GetPaneStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
 
-	pOutlookBar->SetImageList(theApp.m_bHiColorIcons ? IDB_PAGES_HC : IDB_PAGES, 24);
-	pOutlookBar->SetToolbarImageList(theApp.m_bHiColorIcons ? IDB_PAGES_SMALL_HC : IDB_PAGES_SMALL, 16);
-	pOutlookBar->RecalcLayout();
+    pOutlookBar->SetImageList(theApp.m_bHiColorIcons ? IDB_PAGES_HC : IDB_PAGES, 24);
+    pOutlookBar->SetToolbarImageList(theApp.m_bHiColorIcons ? IDB_PAGES_SMALL_HC : IDB_PAGES_SMALL, 16);
+    pOutlookBar->RecalcLayout();
 
-	BOOL bAnimation = theApp.GetInt(_T("OutlookAnimation"), TRUE);
-	CMFCOutlookBarTabCtrl::EnableAnimation(bAnimation);
+    BOOL bAnimation = theApp.GetInt(_T("OutlookAnimation"), TRUE);
+    CMFCOutlookBarTabCtrl::EnableAnimation(bAnimation);
 
-	bar.SetButtonsFont(&afxGlobalData.fontBold);
+    bar.SetButtonsFont(&afxGlobalData.fontBold);
 
-	return TRUE;
+    return TRUE;
 }
 #endif
 
 #ifndef DISABLE_CAPTIONBAR
 BOOL CMainFrame::CreateCaptionBar()
 {
-	if (!m_wndCaptionBar.Create(WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, this, ID_VIEW_CAPTION_BAR, -1, TRUE))
-	{
-		TRACE0("未能创建标题栏\n");
-		return FALSE;
-	}
-
-	BOOL bNameValid;
-
-	CString strTemp, strTemp2;
-	bNameValid = strTemp.LoadString(IDS_CAPTION_BUTTON);
-	ASSERT(bNameValid);
-	m_wndCaptionBar.SetButton(strTemp, ID_TOOLS_OPTIONS, CMFCCaptionBar::ALIGN_LEFT, FALSE);
-	bNameValid = strTemp.LoadString(IDS_CAPTION_BUTTON_TIP);
-	ASSERT(bNameValid);
-	m_wndCaptionBar.SetButtonToolTip(strTemp);
-
-	bNameValid = strTemp.LoadString(IDS_CAPTION_TEXT);
-	ASSERT(bNameValid);
-	m_wndCaptionBar.SetText(strTemp, CMFCCaptionBar::ALIGN_LEFT);
-
-	m_wndCaptionBar.SetBitmap(IDB_INFO, RGB(255, 255, 255), FALSE, CMFCCaptionBar::ALIGN_LEFT);
-	bNameValid = strTemp.LoadString(IDS_CAPTION_IMAGE_TIP);
-	ASSERT(bNameValid);
-	bNameValid = strTemp2.LoadString(IDS_CAPTION_IMAGE_TEXT);
-	ASSERT(bNameValid);
-	m_wndCaptionBar.SetImageToolTip(strTemp, strTemp2);
-
-	return TRUE;
+    if (!m_wndCaptionBar.Create(WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, this, ID_VIEW_CAPTION_BAR, -1, TRUE))
+    {
+        TRACE0("未能创建标题栏\n");
+        return FALSE;
+    }
+
+    BOOL bNameValid;
+
+    CString strTemp, strTemp2;
+    bNameValid = strTemp.LoadString(IDS_CAPTION_BUTTON);
+    ASSERT(bNameValid);
+    m_wndCaptionBar.SetButton(strTemp, ID_TOOLS_OPTIONS, CMFCCaptionBar::ALIGN_LEFT, FALSE);
+    bNameValid = strTemp.LoadString(IDS_CAPTION_BUTTON_TIP);
+    ASSERT(bNameValid);
+    m_wndCaptionBar.SetButtonToolTip(strTemp);
+
+    bNameValid = strTemp.LoadString(IDS_CAPTION_TEXT);
+    ASSERT(bNameValid);
+    m_wndCaptionBar.SetText(strTemp, CMFCCaptionBar::ALIGN_LEFT);
+
+    m_wndCaptionBar.SetBitmap(IDB_INFO, RGB(255, 255, 255), FALSE, CMFCCaptionBar::ALIGN_LEFT);
+    bNameValid = strTemp.LoadString(IDS_CAPTION_IMAGE_TIP);
+    ASSERT(bNameValid);
+    bNameValid = strTemp2.LoadString(IDS_CAPTION_IMAGE_TEXT);
+    ASSERT(bNameValid);
+    m_wndCaptionBar.SetImageToolTip(strTemp, strTemp2);
+
+    return TRUE;
 }
 #endif
 
@@ -546,12 +548,12 @@ BOOL CMainFrame::CreateCaptionBar()
 #ifdef _DEBUG
 void CMainFrame::AssertValid() const
 {
-	CMDIFrameWndEx::AssertValid();
+    CMDIFrameWndEx::AssertValid();
 }
 
 void CMainFrame::Dump(CDumpContext& dc) const
 {
-	CMDIFrameWndEx::Dump(dc);
+    CMDIFrameWndEx::Dump(dc);
 }
 #endif //_DEBUG
 
@@ -560,84 +562,84 @@ void CMainFrame::Dump(CDumpContext& dc) const
 
 void CMainFrame::OnWindowManager()
 {
-	ShowWindowsDialog();
+    ShowWindowsDialog();
 }
 
 void CMainFrame::OnApplicationLook(UINT id)
 {
-	CWaitCursor wait;
-
-	theApp.m_nAppLook = id;
-
-	switch (theApp.m_nAppLook)
-	{
-	case ID_VIEW_APPLOOK_WIN_2000:
-		CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager));
-		break;
-
-	case ID_VIEW_APPLOOK_OFF_XP:
-		CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP));
-		break;
-
-	case ID_VIEW_APPLOOK_WIN_XP:
-		CMFCVisualManagerWindows::m_b3DTabsXPTheme = TRUE;
-		CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
-		break;
-
-	case ID_VIEW_APPLOOK_OFF_2003:
-		CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003));
-		CDockingManager::SetDockingMode(DT_SMART);
-		break;
-
-	case ID_VIEW_APPLOOK_VS_2005:
-		CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005));
-		CDockingManager::SetDockingMode(DT_SMART);
-		break;
-
-	default:
-		switch (theApp.m_nAppLook)
-		{
-		case ID_VIEW_APPLOOK_OFF_2007_BLUE:
-			CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);
-			break;
-
-		case ID_VIEW_APPLOOK_OFF_2007_BLACK:
-			CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);
-			break;
-
-		case ID_VIEW_APPLOOK_OFF_2007_SILVER:
-			CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);
-			break;
-
-		case ID_VIEW_APPLOOK_OFF_2007_AQUA:
-			CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);
-			break;
-		}
-
-		CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));
-		CDockingManager::SetDockingMode(DT_SMART);
-	}
-
-	RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);
-
-	theApp.WriteInt(_T("ApplicationLook"), theApp.m_nAppLook);
+    CWaitCursor wait;
+
+    theApp.m_nAppLook = id;
+
+    switch (theApp.m_nAppLook)
+    {
+    case ID_VIEW_APPLOOK_WIN_2000:
+        CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager));
+        break;
+
+    case ID_VIEW_APPLOOK_OFF_XP:
+        CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP));
+        break;
+
+    case ID_VIEW_APPLOOK_WIN_XP:
+        CMFCVisualManagerWindows::m_b3DTabsXPTheme = TRUE;
+        CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
+        break;
+
+    case ID_VIEW_APPLOOK_OFF_2003:
+        CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003));
+        CDockingManager::SetDockingMode(DT_SMART);
+        break;
+
+    case ID_VIEW_APPLOOK_VS_2005:
+        CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005));
+        CDockingManager::SetDockingMode(DT_SMART);
+        break;
+
+    default:
+        switch (theApp.m_nAppLook)
+        {
+        case ID_VIEW_APPLOOK_OFF_2007_BLUE:
+            CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);
+            break;
+
+        case ID_VIEW_APPLOOK_OFF_2007_BLACK:
+            CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);
+            break;
+
+        case ID_VIEW_APPLOOK_OFF_2007_SILVER:
+            CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);
+            break;
+
+        case ID_VIEW_APPLOOK_OFF_2007_AQUA:
+            CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);
+            break;
+        }
+
+        CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));
+        CDockingManager::SetDockingMode(DT_SMART);
+    }
+
+    RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);
+
+    theApp.WriteInt(_T("ApplicationLook"), theApp.m_nAppLook);
 }
 
 void CMainFrame::OnUpdateApplicationLook(CCmdUI* pCmdUI)
 {
-	pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID);
+    pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID);
 }
 
 #ifndef DISABLE_CAPTIONBAR
 void CMainFrame::OnViewCaptionBar()
 {
-	m_wndCaptionBar.ShowWindow(m_wndCaptionBar.IsVisible() ? SW_HIDE : SW_SHOW);
-	RecalcLayout(FALSE);
+    m_wndCaptionBar.ShowWindow(m_wndCaptionBar.IsVisible() ? SW_HIDE : SW_SHOW);
+    RecalcLayout(FALSE);
 }
 
 void CMainFrame::OnUpdateViewCaptionBar(CCmdUI* pCmdUI)
 {
-	pCmdUI->SetCheck(m_wndCaptionBar.IsVisible());
+    pCmdUI->SetCheck(m_wndCaptionBar.IsVisible());
 }
 #endif
 
@@ -661,7 +663,7 @@ void CMainFrame::OnCameraCombobox()
                 m_pChildFrame->DestroyWindow(); //m_pChildFrame->SendMessage(WM_CLOSE, 0, 0);
                 m_pChildFrame = NULL;
             }
-  
+
             CString strCamera = pCameraCombo->GetItem(nCurSel);
             OutputDebugString(strCamera + _T("\r\n"));
 
@@ -726,6 +728,12 @@ void CMainFrame::OnInfraedCheckbox()
             CString strText = pInfraedCombobox->GetItem(nCurSel);
             if ( m_SerialTW.Open(atol(strText.Mid(3).GetString()), 115200) )
             {
+                // 由于芯片性能不一样,导致串口读写超时也不一样;
+                if ( Global::g_nVersion == 1 )
+                    m_SerialTW.SetTimeouts();
+                else if ( Global::g_nVersion == 2 )
+                    m_SerialTW.SetTimeouts();//未验证其超时值;
+            
                 m_SerialTW.SetBufferSize(1024,1024);
                 WritePrivateProfileString("TestWizard", "Com", strText.GetString(), Global::g_szConfig);
             }
@@ -754,10 +762,8 @@ void CMainFrame::OnInfraedVersionCombobox()
         if ( nCurSel != CB_ERR )
         {
             Global::g_nVersion = nCurSel;
-#if 1
-            if ( nCurSel== 0 )
-                WritePrivateProfileString("TestWizard", "Ver", "1", Global::g_szConfig);
-            else if ( nCurSel == 1 )
+#if _MSC_VER <= 1500
+            if ( nCurSel == 1 )
                 WritePrivateProfileString("TestWizard", "Ver", "2", Global::g_szConfig);
             else if ( nCurSel == 2 )
                 WritePrivateProfileString("TestWizard", "Ver", "3", Global::g_szConfig);
@@ -767,7 +773,7 @@ void CMainFrame::OnInfraedVersionCombobox()
                 WritePrivateProfileString("TestWizard", "Ver", "1", Global::g_szConfig);
 #else
             // C++11直接用lambda表示式处理;
-            WritePrivateProfileString("TestWizard", "Ver", [&](){if(nCurSel == 0 ) return "1";else if ( nCurSel == 1)return "2";else if (nCurSel == 2)return "3";else if (nCurSel == 3)return "4";else return "1";}, Global::g_szConfig);
+            WritePrivateProfileString("TestWizard", "Ver", [&](){if ( nCurSel == 1)return "2";else if (nCurSel == 2)return "3";else if (nCurSel == 3)return "4";else return "1";}, Global::g_szConfig);
 #endif
 
         }
@@ -779,7 +785,7 @@ void CMainFrame::OnUpdateInfraedVersionCombobox(CCmdUI* pCmdUI)
     CMFCRibbonBar* pRibbon = GetRibbonBar();
     ASSERT_VALID(pRibbon);
     CMFCRibbonComboBox* pVersionCombobox = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_INFRAED_VERSION_COMBOBOX));
-    
+
 }
 
 void CMainFrame::OnSwitcherCombobox()
@@ -1184,18 +1190,18 @@ bool CMainFrame::IsTestWizardPort(CString strCOMPort)
     }
 
     /* 
-       发送:
-            *about 
-       返回:
-            *about
-
-            Product name:      Test Wizard
-            Firmware version:  v3.6.210811
-            SN:                30FF6B064243393036140457
-            Active state:      Activated
-
-            Developer:         sun shengpeng
-            Email:             sunsp@tcl.com
+    发送:
+    *about 
+    返回:
+    *about
+
+    Product name:      Test Wizard
+    Firmware version:  v3.6.210811
+    SN:                30FF6B064243393036140457
+    Active state:      Activated
+
+    Developer:         sun shengpeng
+    Email:             sunsp@tcl.com
     */
     m_SerialTW.SetIOMode();
     if ( m_SerialTW.Open(_tstol(strCOMPort.Mid(3).GetString()), 115200) )
@@ -1249,10 +1255,10 @@ bool CMainFrame::IsUSBSwitchPort(CString strCOMPort)
     }
 
     /* 
-       发送:
-            *SET PORT A\r 
-       返回:
-            set PORT A\r\n 
+    发送:
+    *SET PORT A\r 
+    返回:
+    set PORT A\r\n 
     */
     m_SerialUSB.SetIOMode();
     if ( m_SerialUSB.Open(_tstol(strCOMPort.Mid(3).GetString()), 115200) )
@@ -1348,13 +1354,13 @@ BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
             if (bTopWnd == FALSE)
             {
                 SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);//窗口置顶
-                CString strVersionInfo = _T("视频采集卡 - 前置窗口(请按F3取消或开启前置)");
+                CString strVersionInfo = _T("Front window (press F3 to cancel or enable the front window)");
                 SetWindowText(strVersionInfo);
             }
             else
             {
                 SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);//取消窗口置顶	
-                CString strVersionInfo = _T("视频采集卡 - 取消前置(请按F3取消或开启前置)");
+                CString strVersionInfo = _T("Cancel the front (press F3 to cancel or enable the front window)");
                 SetWindowText(strVersionInfo);
             }
 

+ 129 - 28
FieldTestTool/FieldTestTool/PropertiesWnd.cpp

@@ -20,6 +20,7 @@
 #define MINIMUM_WINDOWS_X 395  
 #define MINIMUM_WINDOWS_Y 535
 #define MAX_SWITCH_LEN 16
+#define MAX_SENDDATA 512
 
 #ifdef _DEBUG
 #undef THIS_FILE
@@ -181,34 +182,9 @@ void CPropertiesWnd::OnSignalBtnClick(UINT uId) // 
         CString text;
         pWnd->GetWindowText(text);
         KeyInfo *pKey = m_map_key.find(id)->second;
-
-        // 从父窗口获取对象;
-        CMainFrame *pMainWnd = (CMainFrame*)AfxGetApp()->m_pMainWnd;
-        if ( pMainWnd )
-        {
-            if ( pMainWnd->m_SerialTW.IsOpen() ){
-                pMainWnd->m_SerialTW.SetTimeouts();
-                // 封装发送包;
-                byte szSendData[MAX_PATH] = {0};
-                _stprintf_s((TCHAR*)szSendData, MAX_PATH, _T("*INPUT %s %s\r"), pKey->strType.c_str(), pKey->strValue.c_str());
-
-                // 发送单信号;
-                if ( pMainWnd->m_SerialTW.WriteSync(szSendData, _tcslen((TCHAR*)szSendData)) )
-                {
-                    memset(szSendData, 0, MAX_PATH);
-                    pMainWnd->m_SerialTW.ReadSync(szSendData, MAX_PATH);
-                    TRACE("发送单信号成功\n");
-                }
-                else
-                {
-                    TRACE("发送单信号失败\n");
-                }
-            }
-            else
-            {
-                MessageBox(_T("The serial port is not open."), _T("Warnning"), MB_OK|MB_ICONWARNING);
-            }
-        }
+        // 发送红外信号;
+        //SendInfraedSignal(pKey);
+        LearnInfraedSignal(pKey);
     }
 }
 
@@ -427,6 +403,32 @@ void CPropertiesWnd::LoadKeyInfo(std::vector<KeyInfo> &vtKeyInfo, TString path)
     AdjustLayout();
 }
 
+void CPropertiesWnd::SaveKeyInfo(std::vector<KeyInfo> &vtKeyInfo, TString path)
+{
+    tinyxml2::XMLDocument doc;
+    tinyxml2::XMLElement* pXmlRoot = NULL;
+    // 创建新的xml文件;
+    const char* declaration = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+    doc.Parse(declaration); // 覆盖之前的xml;
+
+    pXmlRoot = doc.NewElement("KeyList");
+    if ( pXmlRoot )
+    {
+        pXmlRoot->SetAttribute(_T("cols"), _T("4"));
+        pXmlRoot->SetAttribute(_T("with"), _T("60"));
+        pXmlRoot->SetAttribute(_T("height"), _T("25"));
+        pXmlRoot->SetAttribute(_T("rowSpacing"), _T("5"));
+        pXmlRoot->SetAttribute(_T("colSpacing"), _T("3"));
+        pXmlRoot->SetAttribute(_T("leftMargin"), _T("8"));
+        pXmlRoot->SetAttribute(_T("topMargin"), _T("8"));
+        pXmlRoot->SetAttribute(_T("ver"), _T("1.0.0.1"));
+        pXmlRoot->SetAttribute(_T("desc"), _T("key info"));
+        doc.InsertEndChild(pXmlRoot);
+    }
+
+    doc.SaveFile(path.c_str());
+}
+
 void CPropertiesWnd::ConvertOldSignalsToNew(std::string strOldSignal, std::string strNewSignal)
 {
     typedef struct
@@ -640,6 +642,105 @@ void CPropertiesWnd::AutoSetDroppedWidth(CComboBox* pCombobox)
     pCombobox->SetHorizontalExtent(dx);
 }
 
+bool CPropertiesWnd::SendInfraedSignal(const KeyInfo *pKey)
+{
+    CMainFrame *pMainWnd = (CMainFrame*)AfxGetApp()->m_pMainWnd;
+    if ( !pMainWnd )
+        return false;
+
+    if (!pMainWnd->m_SerialTW.IsOpen())
+    {
+        MessageBox(_T("The serial port is not open."), _T("Warnning"), MB_OK|MB_ICONWARNING);
+        return false;
+    }
+
+    DWORD dwSendLen = 0;
+    byte szSendData[MAX_SENDDATA] = {0};
+    // 根据不同的版本号来发送;
+    if ( Global::g_nVersion == 1 )
+    {
+        _stprintf_s((TCHAR*)szSendData, MAX_SENDDATA, _T("*INPUT %s %s\r"), pKey->strType.c_str(), pKey->strValue.c_str());
+        dwSendLen = _tcslen((TCHAR*)szSendData);
+    }
+    else if ( Global::g_nVersion == 2 )
+    {
+        // 将十六进制的字符串转成字节流;
+        std::string strBytes = utils::HexStringToBytes(pKey->strValue2, 3);
+        memcpy_s(szSendData, MAX_SENDDATA, strBytes.c_str(), strBytes.size());
+        dwSendLen = strBytes.size();
+    }
+
+    // 发送单信号;
+    if ( pMainWnd->m_SerialTW.WriteSync(szSendData, dwSendLen) )
+    {
+        memset(szSendData, 0, MAX_SENDDATA);
+        pMainWnd->m_SerialTW.ReadSync(szSendData, MAX_SENDDATA);
+        TRACE("发送单信号成功\n");
+        return true;
+    }
+    else
+    {
+        TRACE("发送单信号失败\n");
+    }
+
+    return false;
+}
+
+void CPropertiesWnd::LearnInfraedSignal(KeyInfo *pKey)
+{
+    CMainFrame *pMainWnd = (CMainFrame*)AfxGetApp()->m_pMainWnd;
+    if ( !pMainWnd )
+        return;
+
+    if (!pMainWnd->m_SerialTW.IsOpen())
+    {
+        MessageBox(_T("The serial port is not open."), _T("Warnning"), MB_OK|MB_ICONWARNING);
+        return;
+    }
+
+    DWORD dwSendLen = 0;
+    byte szSendData[MAX_SENDDATA] = {0};
+    // 根据不同的版本号来发送;
+    if ( Global::g_nVersion == 1 )
+    {
+        
+    }
+    else if ( Global::g_nVersion == 2 )
+    {
+        // 将十六进制的字符串转成字节流;
+        std::string strBytes = utils::HexStringToBytes(_T("FD FD F1 F2 DF"), 3);
+        memcpy_s(szSendData, MAX_SENDDATA, strBytes.c_str(), strBytes.size());
+        dwSendLen = strBytes.size();
+
+        // 发送学习红外信号;
+        if ( pMainWnd->m_SerialTW.WriteSync(szSendData, dwSendLen) )
+        {
+            memset(szSendData, 0, MAX_SENDDATA);
+            pMainWnd->m_SerialTW.ReadSync(szSendData, MAX_SENDDATA);
+            TRACE("发送单信号成功\n");
+        }
+        else
+        {
+            TRACE("发送单信号失败\n");
+        }
+    }
+
+#if 1 
+    // 要另起线程后台读取,否则UI会卡住,体验不好;
+    Sleep(1500);
+    // 等待学习的红外信号发出;
+    DWORD dwRealRead = 0;
+    memset(szSendData, 0, MAX_SENDDATA);
+    if ( dwRealRead = pMainWnd->m_SerialTW.ReadSync(szSendData, MAX_SENDDATA) )
+    {
+        if ( Global::g_nVersion == 1 )
+            pKey->strValue =(TCHAR*)szSendData;
+        else if ( Global::g_nVersion == 2 )
+            pKey->strValue2 = utils::BytesToHexString(szSendData, dwRealRead, ' ');
+    }
+#endif
+}
+
 // 如果CDockablePane无控件,改变大小时背景会刷新失败;
 // 所以要重载onpaint;
 void CPropertiesWnd::OnPaint()

+ 5 - 0
FieldTestTool/FieldTestTool/PropertiesWnd.h

@@ -125,6 +125,7 @@ protected:
     void SetPropListFont();
     void LoadSignals();
     void LoadKeyInfo(std::vector<KeyInfo> &vtKeyInfo, TString path);
+    void SaveKeyInfo(std::vector<KeyInfo> &vtKeyInfo, TString path);
     void ConvertOldSignalsToNew(TString strOldSignal, TString strNewSignal);
     BTNInfo *GetUnUseBTN();
     void SetBTNStatus(BTNInfo *pbtnInfo, BOOL bStatus = TRUE);
@@ -132,6 +133,10 @@ protected:
     void ClearAllBTNInfo();
     // 自动根据Combobox选项长度设置宽度;
     void AutoSetDroppedWidth(CComboBox* pCombobox);
+
+    bool SendInfraedSignal(const KeyInfo *pKey);
+    // 学习红外键值;
+    void LearnInfraedSignal(KeyInfo *pKey);
 public:
     afx_msg void OnPaint();
     afx_msg void OnDestroy();