sat23 3 жил өмнө
parent
commit
96d0c2d6eb

+ 1126 - 1121
FieldTestTool/FieldTestTool/MainFrm.cpp

@@ -35,60 +35,60 @@ const UINT uiFirstUserToolBarId = AFX_IDW_CONTROLBAR_FIRST + 40;
 const UINT uiLastUserToolBarId = uiFirstUserToolBarId + iMaxUserToolbars - 1;
 
 BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
-    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_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)
 #ifndef DISABLE_CAPTIONBAR
-    ON_COMMAND(ID_VIEW_CAPTION_BAR, &CMainFrame::OnViewCaptionBar)
-    ON_UPDATE_COMMAND_UI(ID_VIEW_CAPTION_BAR, &CMainFrame::OnUpdateViewCaptionBar)
+	ON_COMMAND(ID_VIEW_CAPTION_BAR, &CMainFrame::OnViewCaptionBar)
+	ON_UPDATE_COMMAND_UI(ID_VIEW_CAPTION_BAR, &CMainFrame::OnUpdateViewCaptionBar)
 #endif
-    // 摄像头;
-    ON_COMMAND(ID_RIBBON_CAMERA_COMBOBOX, &CMainFrame::OnCameraCombobox)
-    ON_UPDATE_COMMAND_UI(ID_RIBBON_CAMERA_COMBOBOX, &CMainFrame::OnUpdateCameraCombobox)
-    // 摄像头刷新;
-    ON_COMMAND(ID_RIBBON_CAMERA_FLUSH, &CMainFrame::OnCameraFlush)
-    ON_UPDATE_COMMAND_UI(ID_RIBBON_CAMERA_FLUSH, &CMainFrame::OnUpdateCameraFlush)
-    // 红外:测试精灵;
-    ON_COMMAND(ID_RIBBON_INFRAED_COMBOBOX, &CMainFrame::OnInfraedCombobox)
-    ON_UPDATE_COMMAND_UI(ID_RIBBON_INFRAED_COMBOBOX, &CMainFrame::OnUpdateInfraedCombobox)
-    ON_COMMAND(ID_RIBBON_INFRAED_CHECKBOX, &CMainFrame::OnInfraedCheckbox)
-    ON_UPDATE_COMMAND_UI(ID_RIBBON_INFRAED_CHECKBOX, &CMainFrame::OnUpdateInfraedCheckbox)
-    // 红外版本选择;
-    ON_COMMAND(ID_RIBBON_INFRAED_VERSION_COMBOBOX, &CMainFrame::OnInfraedVersionCombobox)
-    ON_UPDATE_COMMAND_UI(ID_RIBBON_INFRAED_VERSION_COMBOBOX, &CMainFrame::OnUpdateInfraedVersionCombobox)
-    // USB切换器;
-    ON_COMMAND(ID_RIBBON_SWITCHER_COMBOBOX, &CMainFrame::OnSwitcherCombobox)
-    ON_UPDATE_COMMAND_UI(ID_RIBBON_SWITCHER_COMBOBOX, &CMainFrame::OnUpdateSwitcherCombobox)
-    // 打开USB切换器;
-    ON_COMMAND(ID_RIBBON_SWITCHER_CHECKBOX, &CMainFrame::OnSwitcherCheckbox)
-    ON_UPDATE_COMMAND_UI(ID_RIBBON_SWITCHER_CHECKBOX, &CMainFrame::OnUpdateSwitcherCheckbox)
-    // Switch A;
-    ON_COMMAND(ID_RIBBON_SWITCHER_CHECKBOXA, &CMainFrame::OnSwitcherCheckboxA)
-    ON_UPDATE_COMMAND_UI(ID_RIBBON_SWITCHER_CHECKBOXA, &CMainFrame::OnUpdateSwitcherCheckboxA)
-    // Switch B;
-    ON_COMMAND(ID_RIBBON_SWITCHER_CHECKBOXB, &CMainFrame::OnSwitcherCheckboxB)
-    ON_UPDATE_COMMAND_UI(ID_RIBBON_SWITCHER_CHECKBOXB, &CMainFrame::OnUpdateSwitcherCheckboxB)
-    // 计时器;
-    ON_WM_TIMER()
-    ON_WM_CLOSE()
+	// 摄像头;
+	ON_COMMAND(ID_RIBBON_CAMERA_COMBOBOX, &CMainFrame::OnCameraCombobox)
+	ON_UPDATE_COMMAND_UI(ID_RIBBON_CAMERA_COMBOBOX, &CMainFrame::OnUpdateCameraCombobox)
+	// 摄像头刷新;
+	ON_COMMAND(ID_RIBBON_CAMERA_FLUSH, &CMainFrame::OnCameraFlush)
+	ON_UPDATE_COMMAND_UI(ID_RIBBON_CAMERA_FLUSH, &CMainFrame::OnUpdateCameraFlush)
+	// 红外:测试精灵;
+	ON_COMMAND(ID_RIBBON_INFRAED_COMBOBOX, &CMainFrame::OnInfraedCombobox)
+	ON_UPDATE_COMMAND_UI(ID_RIBBON_INFRAED_COMBOBOX, &CMainFrame::OnUpdateInfraedCombobox)
+	ON_COMMAND(ID_RIBBON_INFRAED_CHECKBOX, &CMainFrame::OnInfraedCheckbox)
+	ON_UPDATE_COMMAND_UI(ID_RIBBON_INFRAED_CHECKBOX, &CMainFrame::OnUpdateInfraedCheckbox)
+	// 红外版本选择;
+	ON_COMMAND(ID_RIBBON_INFRAED_VERSION_COMBOBOX, &CMainFrame::OnInfraedVersionCombobox)
+	ON_UPDATE_COMMAND_UI(ID_RIBBON_INFRAED_VERSION_COMBOBOX, &CMainFrame::OnUpdateInfraedVersionCombobox)
+	// USB切换器;
+	ON_COMMAND(ID_RIBBON_SWITCHER_COMBOBOX, &CMainFrame::OnSwitcherCombobox)
+	ON_UPDATE_COMMAND_UI(ID_RIBBON_SWITCHER_COMBOBOX, &CMainFrame::OnUpdateSwitcherCombobox)
+	// 打开USB切换器;
+	ON_COMMAND(ID_RIBBON_SWITCHER_CHECKBOX, &CMainFrame::OnSwitcherCheckbox)
+	ON_UPDATE_COMMAND_UI(ID_RIBBON_SWITCHER_CHECKBOX, &CMainFrame::OnUpdateSwitcherCheckbox)
+	// Switch A;
+	ON_COMMAND(ID_RIBBON_SWITCHER_CHECKBOXA, &CMainFrame::OnSwitcherCheckboxA)
+	ON_UPDATE_COMMAND_UI(ID_RIBBON_SWITCHER_CHECKBOXA, &CMainFrame::OnUpdateSwitcherCheckboxA)
+	// Switch B;
+	ON_COMMAND(ID_RIBBON_SWITCHER_CHECKBOXB, &CMainFrame::OnSwitcherCheckboxB)
+	ON_UPDATE_COMMAND_UI(ID_RIBBON_SWITCHER_CHECKBOXB, &CMainFrame::OnUpdateSwitcherCheckboxB)
+	// 计时器;
+	ON_WM_TIMER()
+	ON_WM_CLOSE()
 END_MESSAGE_MAP()
 
 // CMainFrame 构造/析构
 
 CMainFrame::CMainFrame()
 {
-    // TODO: 在此添加成员初始化代码
-    m_pDoc = NULL;
-    m_pDocTemplate = NULL;
-    m_bFindTestWizardPort = false;
-    m_bFindSwitcherPort = false;
-    m_bSwitcherCheckA = false;
-    m_bSwitcherCheckB = false;
-    m_pActiveView = NULL;
-    m_pChildFrame = NULL;
-    theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_OFF_2007_BLUE);
+	// TODO: 在此添加成员初始化代码
+	m_pDoc = NULL;
+	m_pDocTemplate = NULL;
+	m_bFindTestWizardPort = false;
+	m_bFindSwitcherPort = false;
+	m_bSwitcherCheckA = false;
+	m_bSwitcherCheckB = false;
+	m_pActiveView = NULL;
+	m_pChildFrame = NULL;
+	theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_OFF_2007_BLUE);
 }
 
 CMainFrame::~CMainFrame()
@@ -98,448 +98,448 @@ 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);
+	// 加载菜单项图像(不在任何标准工具栏上):
+	//CMFCToolBar::AddToolBarForImageCollection(IDR_MENU_IMAGES, theApp.m_bHiColorIcons ? IDB_MENU_IMAGES_24 : 0);
 
-    // 创建停靠窗口
-    if (!CreateDockingWindows())
-    {
-        TRACE0("未能创建停靠窗口\n");
-        return -1;
-    }
+	// 创建停靠窗口
+	if (!CreateDockingWindows())
+	{
+		TRACE0("未能创建停靠窗口\n");
+		return -1;
+	}
 
-    m_wndProperties.EnableDocking(CBRS_ALIGN_ANY);
-    DockPane(&m_wndProperties);
+	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);
+	SetTimer(0, 100, NULL);
 
-    RegisterDeviceChange();
+	RegisterDeviceChange();
 
-    // 初始化摄像头下拉框;
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonComboBox* pCameraCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_CAMERA_COMBOBOX));
-    m_cap.EnumDevices(pCameraCombo);    
+	// 初始化摄像头下拉框;
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	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_HOME);
-    ASSERT(bNameValid);
-    CMFCRibbonCategory* pCategoryHome = m_wndRibbonBar.AddCategory(strTemp, IDB_WRITESMALL, IDB_WRITELARGE);
-
-    //////////////////////////////////////////////////////////////////////////
-    // 创建“摄像头”面板:
-    {
-        bNameValid = strTemp.LoadString(IDS_RIBBON_CAMERA);
-        ASSERT(bNameValid);
-        CMFCRibbonPanel* pPanelCamera = pCategoryHome->AddPanel(strTemp, m_PanelImages.ExtractIcon(27));
-        // 排序面板按列垂直对齐元素;
-        pPanelCamera->SetCenterColumnVert(TRUE);
-        // 启用或禁用功能区元素的宽度调整在同一列的
-        pPanelCamera->SetJustifyColumns(TRUE);
-
-        // 只有组的元素,才能水平对齐;
-        CMFCRibbonButtonsGroup *pGroup = new CMFCRibbonButtonsGroup();
-        pPanelCamera->Add(pGroup);
-
-        bNameValid = strTemp.LoadString(IDS_RIBBON_CAMERA_LABEL);
-        ASSERT(bNameValid);
-        CMFCRibbonLabel* pCameraLable = new CMFCRibbonLabel(strTemp);
-        pGroup->AddButton(pCameraLable);
-        pCameraLable->SetRect(CRect(0,0,150,20));
-
-        CMFCRibbonComboBox *pCameraCombobx = new CMFCRibbonComboBox(ID_RIBBON_CAMERA_COMBOBOX, FALSE);
-        pGroup->AddButton(pCameraCombobx);
-        pCameraCombobx->SetWidth(80);
-        pCameraCombobx->SetCompactMode(FALSE);
-
-        bNameValid = strTemp.LoadString(IDS_RIBBON_CAMERA_FLUSH);
-        ASSERT(bNameValid);
-        CMFCRibbonButton *pCameraFlush = new CMFCRibbonButton(ID_RIBBON_CAMERA_FLUSH, strTemp);
-        pGroup->AddButton(pCameraFlush);
-        pGroup->SetCompactMode(FALSE);
-    }
-
-    //////////////////////////////////////////////////////////////////////////
-    // 创建“测试精灵”面板:
-    {
-        bNameValid = strTemp.LoadString(IDS_RIBBON_INFRAED);
-        ASSERT(bNameValid);
-        CMFCRibbonPanel* pPanelInfraed = pCategoryHome->AddPanel(strTemp, m_PanelImages.ExtractIcon (7));
-        // 排序面板按列垂直对齐元素;
-        pPanelInfraed->SetCenterColumnVert(TRUE);
-        // 启用或禁用功能区元素的宽度调整在同一列的
-        pPanelInfraed->SetJustifyColumns(TRUE);
-
-        // 只有组的元素,才能水平对齐;
-        CMFCRibbonButtonsGroup *pGroup = new CMFCRibbonButtonsGroup();
-        pPanelInfraed->Add(pGroup);
-
-        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);
-        pGroup->AddButton(pInfraedCheckbox);
-
-        // 红外遥控版本选择
-        CMFCRibbonButtonsGroup *pGroup2 = new CMFCRibbonButtonsGroup();
-        pPanelInfraed->Add(pGroup2);
-
-        bNameValid = strTemp.LoadString(IDS_RIBBON_INFRAED_VERSION);
-        ASSERT(bNameValid);
-        CMFCRibbonLabel* pCameraLable = new CMFCRibbonLabel(strTemp);
-        pGroup2->AddButton(pCameraLable);
-        pCameraLable->SetRect(CRect(0,0,150,20));
-
-        bNameValid = strTemp.LoadString(IDS_RIBBON_INFRAED_VERSION);
-        ASSERT(bNameValid);
-        CMFCRibbonComboBox *pVersion = new CMFCRibbonComboBox(ID_RIBBON_INFRAED_VERSION_COMBOBOX, FALSE);
-        pGroup2->AddButton(pVersion);
-        pVersion->SetWidth(80);
-        pVersion->AddItem(_T("1st-version"));
-        pVersion->AddItem(_T("2nd-version"));
-        //pVersion->AddItem(_T("3rd-version"));
-        //pVersion->AddItem(_T("4th-version"));
-
-        pVersion->SelectItem(Global::g_nVersion-1);
-    }
-
-    // 创建“U盘切换器”面板:
-    {
-        bNameValid = strTemp.LoadString(IDS_RIBBON_SWITCHER);
-        ASSERT(bNameValid);
-        CMFCRibbonPanel* pPanelSwitcher = pCategoryHome->AddPanel(strTemp, m_PanelImages.ExtractIcon (7));
-        // 排序面板按列垂直对齐元素;
-        pPanelSwitcher->SetCenterColumnVert(TRUE);
-        // 启用或禁用功能区元素的宽度调整在同一列的
-        pPanelSwitcher->SetJustifyColumns(TRUE);
-
-        // 只有组的元素,才能水平对齐;
-        CMFCRibbonButtonsGroup *pGroup = new CMFCRibbonButtonsGroup();
-        pPanelSwitcher->Add(pGroup);
-
-        CMFCRibbonComboBox* pSwitcherCombobox = new CMFCRibbonComboBox(ID_RIBBON_SWITCHER_COMBOBOX, FALSE);
-        pGroup->AddButton(pSwitcherCombobox);
-        pSwitcherCombobox->SetWidth(60);
-
-        bNameValid = strTemp.LoadString(IDS_RIBBON_SWITCHER_CHECKBOX);
-        ASSERT(bNameValid);
-        CMFCRibbonCheckBox *pSwitcherCheckbox = new CMFCRibbonCheckBox(ID_RIBBON_SWITCHER_CHECKBOX, strTemp);
-        pGroup->AddButton(pSwitcherCheckbox);
-
-        // 只有组的元素,才能水平对齐;
-        CMFCRibbonButtonsGroup *pGroupCheckBox = new CMFCRibbonButtonsGroup();
-        pPanelSwitcher->Add(pGroupCheckBox);
-
-        bNameValid = strTemp.LoadString(IDS_RIBBON_SWITCHER_CHECKBOXA);
-        ASSERT(bNameValid);
-        CMFCRibbonCheckBox *pSwitcherCheckboxA = new CMFCRibbonCheckBox(ID_RIBBON_SWITCHER_CHECKBOXA, strTemp);
-        pGroupCheckBox->AddButton(pSwitcherCheckboxA);
-
-        bNameValid = strTemp.LoadString(IDS_RIBBON_SWITCHER_CHECKBOXB);
-        ASSERT(bNameValid);
-        CMFCRibbonCheckBox *pSwitcherCheckboxB = new CMFCRibbonCheckBox(ID_RIBBON_SWITCHER_CHECKBOXB, strTemp);
-        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_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_CAMERA);
+		ASSERT(bNameValid);
+		CMFCRibbonPanel* pPanelCamera = pCategoryHome->AddPanel(strTemp, m_PanelImages.ExtractIcon(27));
+		// 排序面板按列垂直对齐元素;
+		pPanelCamera->SetCenterColumnVert(TRUE);
+		// 启用或禁用功能区元素的宽度调整在同一列的
+		pPanelCamera->SetJustifyColumns(TRUE);
+
+		// 只有组的元素,才能水平对齐;
+		CMFCRibbonButtonsGroup* pGroup = new CMFCRibbonButtonsGroup();
+		pPanelCamera->Add(pGroup);
+
+		bNameValid = strTemp.LoadString(IDS_RIBBON_CAMERA_LABEL);
+		ASSERT(bNameValid);
+		CMFCRibbonLabel* pCameraLable = new CMFCRibbonLabel(strTemp);
+		pGroup->AddButton(pCameraLable);
+		pCameraLable->SetRect(CRect(0, 0, 150, 20));
+
+		CMFCRibbonComboBox* pCameraCombobx = new CMFCRibbonComboBox(ID_RIBBON_CAMERA_COMBOBOX, FALSE);
+		pGroup->AddButton(pCameraCombobx);
+		pCameraCombobx->SetWidth(80);
+		pCameraCombobx->SetCompactMode(FALSE);
+
+		bNameValid = strTemp.LoadString(IDS_RIBBON_CAMERA_FLUSH);
+		ASSERT(bNameValid);
+		CMFCRibbonButton* pCameraFlush = new CMFCRibbonButton(ID_RIBBON_CAMERA_FLUSH, strTemp);
+		pGroup->AddButton(pCameraFlush);
+		pGroup->SetCompactMode(FALSE);
+	}
+
+	//////////////////////////////////////////////////////////////////////////
+	// 创建“测试精灵”面板:
+	{
+		bNameValid = strTemp.LoadString(IDS_RIBBON_INFRAED);
+		ASSERT(bNameValid);
+		CMFCRibbonPanel* pPanelInfraed = pCategoryHome->AddPanel(strTemp, m_PanelImages.ExtractIcon(7));
+		// 排序面板按列垂直对齐元素;
+		pPanelInfraed->SetCenterColumnVert(TRUE);
+		// 启用或禁用功能区元素的宽度调整在同一列的
+		pPanelInfraed->SetJustifyColumns(TRUE);
+
+		// 只有组的元素,才能水平对齐;
+		CMFCRibbonButtonsGroup* pGroup = new CMFCRibbonButtonsGroup();
+		pPanelInfraed->Add(pGroup);
+
+		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);
+		pGroup->AddButton(pInfraedCheckbox);
+
+		// 红外遥控版本选择
+		CMFCRibbonButtonsGroup* pGroup2 = new CMFCRibbonButtonsGroup();
+		pPanelInfraed->Add(pGroup2);
+
+		bNameValid = strTemp.LoadString(IDS_RIBBON_INFRAED_VERSION);
+		ASSERT(bNameValid);
+		CMFCRibbonLabel* pCameraLable = new CMFCRibbonLabel(strTemp);
+		pGroup2->AddButton(pCameraLable);
+		pCameraLable->SetRect(CRect(0, 0, 150, 20));
+
+		bNameValid = strTemp.LoadString(IDS_RIBBON_INFRAED_VERSION);
+		ASSERT(bNameValid);
+		CMFCRibbonComboBox* pVersion = new CMFCRibbonComboBox(ID_RIBBON_INFRAED_VERSION_COMBOBOX, FALSE);
+		pGroup2->AddButton(pVersion);
+		pVersion->SetWidth(80);
+		pVersion->AddItem(_T("1st-version"));
+		pVersion->AddItem(_T("2nd-version"));
+		//pVersion->AddItem(_T("3rd-version"));
+		//pVersion->AddItem(_T("4th-version"));
+
+		pVersion->SelectItem(Global::g_nVersion - 1);
+	}
+
+	// 创建“U盘切换器”面板:
+	{
+		bNameValid = strTemp.LoadString(IDS_RIBBON_SWITCHER);
+		ASSERT(bNameValid);
+		CMFCRibbonPanel* pPanelSwitcher = pCategoryHome->AddPanel(strTemp, m_PanelImages.ExtractIcon(7));
+		// 排序面板按列垂直对齐元素;
+		pPanelSwitcher->SetCenterColumnVert(TRUE);
+		// 启用或禁用功能区元素的宽度调整在同一列的
+		pPanelSwitcher->SetJustifyColumns(TRUE);
+
+		// 只有组的元素,才能水平对齐;
+		CMFCRibbonButtonsGroup* pGroup = new CMFCRibbonButtonsGroup();
+		pPanelSwitcher->Add(pGroup);
+
+		CMFCRibbonComboBox* pSwitcherCombobox = new CMFCRibbonComboBox(ID_RIBBON_SWITCHER_COMBOBOX, FALSE);
+		pGroup->AddButton(pSwitcherCombobox);
+		pSwitcherCombobox->SetWidth(60);
+
+		bNameValid = strTemp.LoadString(IDS_RIBBON_SWITCHER_CHECKBOX);
+		ASSERT(bNameValid);
+		CMFCRibbonCheckBox* pSwitcherCheckbox = new CMFCRibbonCheckBox(ID_RIBBON_SWITCHER_CHECKBOX, strTemp);
+		pGroup->AddButton(pSwitcherCheckbox);
+
+		// 只有组的元素,才能水平对齐;
+		CMFCRibbonButtonsGroup* pGroupCheckBox = new CMFCRibbonButtonsGroup();
+		pPanelSwitcher->Add(pGroupCheckBox);
+
+		bNameValid = strTemp.LoadString(IDS_RIBBON_SWITCHER_CHECKBOXA);
+		ASSERT(bNameValid);
+		CMFCRibbonCheckBox* pSwitcherCheckboxA = new CMFCRibbonCheckBox(ID_RIBBON_SWITCHER_CHECKBOXA, strTemp);
+		pGroupCheckBox->AddButton(pSwitcherCheckboxA);
+
+		bNameValid = strTemp.LoadString(IDS_RIBBON_SWITCHER_CHECKBOXB);
+		ASSERT(bNameValid);
+		CMFCRibbonCheckBox* pSwitcherCheckboxB = new CMFCRibbonCheckBox(ID_RIBBON_SWITCHER_CHECKBOXB, strTemp);
+		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);
 
 #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()
 {
-    BOOL bNameValid;
-
-    // 创建属性窗口
-    CString strPropertiesWnd;
-    bNameValid = strPropertiesWnd.LoadString(IDS_PROPERTIES_WND);
-    ASSERT(bNameValid);
-    if (!m_wndProperties.Create(strPropertiesWnd, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_PROPERTIESWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI))
-    {
-        TRACE0("未能创建“属性”窗口\n");
-        return FALSE; // 未能创建
-    }
-
-    SetDockingWindowIcons(theApp.m_bHiColorIcons);
-    return TRUE;
+	BOOL bNameValid;
+
+	// 创建属性窗口
+	CString strPropertiesWnd;
+	bNameValid = strPropertiesWnd.LoadString(IDS_PROPERTIES_WND);
+	ASSERT(bNameValid);
+	if (!m_wndProperties.Create(strPropertiesWnd, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_PROPERTIESWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI))
+	{
+		TRACE0("未能创建“属性”窗口\n");
+		return FALSE; // 未能创建
+	}
+
+	SetDockingWindowIcons(theApp.m_bHiColorIcons);
+	return TRUE;
 }
 
 void CMainFrame::SetDockingWindowIcons(BOOL bHiColorIcons)
 {
-    HICON hPropertiesBarIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_PROPERTIES_WND_HC : IDI_PROPERTIES_WND), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);
-    m_wndProperties.SetIcon(hPropertiesBarIcon, FALSE);
+	HICON hPropertiesBarIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_PROPERTIES_WND_HC : IDI_PROPERTIES_WND), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);
+	m_wndProperties.SetIcon(hPropertiesBarIcon, FALSE);
 
-    UpdateMDITabbedBarsIcons();
+	UpdateMDITabbedBarsIcons();
 }
 
 #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
 
@@ -548,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
 
@@ -562,843 +562,848 @@ 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
 
 void CMainFrame::OnCameraCombobox()
 {
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonComboBox* pCameraCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_CAMERA_COMBOBOX));
-    if ( pCameraCombo )
-    {
-        int nCurSel = pCameraCombo->GetCurSel();
-        if ( nCurSel != -1 )
-        {
-            if ( m_pChildFrame )
-            {
-                CFieldTestToolView *pView = (CFieldTestToolView*)m_pChildFrame->GetActiveView();
-                if ( pView->m_pCamera )
-                    delete pView->m_pCamera;
-                pView->m_pCamera = NULL;
-                pView->DestroyWindow(); //pView->SendMessage(WM_CLOSE, 0, 0);
-                m_pChildFrame->DestroyWindow(); //m_pChildFrame->SendMessage(WM_CLOSE, 0, 0);
-                m_pChildFrame = NULL;
-            }
-
-            CString strCamera = pCameraCombo->GetItem(nCurSel);
-            OutputDebugString(strCamera + _T("\r\n"));
-
-            CCreateContext context;
-            m_pChildFrame = new CChildFrame();
-            context.m_pLastView = NULL;
-            context.m_pCurrentFrame = this;
-            // 不要使用m_pDoc,这个是会在第一次随m_pChildFrame->DestroyWindow或m_pChildFrame->SendMessage(WM_CLOSE, 0, 0);销毁
-            // 再次使用时m_pDoc是野指针,导致LoadFrame出错;
-            context.m_pCurrentDoc = NULL;//m_pDocTemplate->CreateNewDocument();
-            context.m_pNewViewClass = RUNTIME_CLASS(CFieldTestToolView);
-            context.m_pNewDocTemplate = m_pDocTemplate;
-
-            if (m_pChildFrame->LoadFrame(IDR_MAINFRAME, WS_MAXIMIZE | WS_CHILDWINDOW, this, &context))
-            {
-                m_pChildFrame->MDIActivate();
-                m_pChildFrame->InitialUpdateFrame(m_pDoc, TRUE);
-                m_pChildFrame->ShowWindow(SW_SHOWMAXIMIZED);
-                CFieldTestToolView *pView = (CFieldTestToolView*)m_pChildFrame->GetActiveView();
-
-                if ( pView )
-                    pView->m_pCamera = new CCaptureVideo();
-                pView->m_pCamera->Init(nCurSel, m_pChildFrame->GetSafeHwnd());
-            }
-        }
-    }
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pCameraCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_CAMERA_COMBOBOX));
+	if (pCameraCombo)
+	{
+		int nCurSel = pCameraCombo->GetCurSel();
+		if (nCurSel != -1)
+		{
+			if (m_pChildFrame)
+			{
+				CFieldTestToolView* pView = (CFieldTestToolView*)m_pChildFrame->GetActiveView();
+				if (pView->m_pCamera)
+					delete pView->m_pCamera;
+				pView->m_pCamera = NULL;
+				pView->DestroyWindow(); //pView->SendMessage(WM_CLOSE, 0, 0);
+				m_pChildFrame->DestroyWindow(); //m_pChildFrame->SendMessage(WM_CLOSE, 0, 0);
+				m_pChildFrame = NULL;
+			}
+
+			CString strCamera = pCameraCombo->GetItem(nCurSel);
+			OutputDebugString(strCamera + _T("\r\n"));
+
+			CCreateContext context;
+			m_pChildFrame = new CChildFrame();
+			context.m_pLastView = NULL;
+			context.m_pCurrentFrame = this;
+			// 不要使用m_pDoc,这个是会在第一次随m_pChildFrame->DestroyWindow或m_pChildFrame->SendMessage(WM_CLOSE, 0, 0);销毁
+			// 再次使用时m_pDoc是野指针,导致LoadFrame出错;
+			context.m_pCurrentDoc = NULL;//m_pDocTemplate->CreateNewDocument();
+			context.m_pNewViewClass = RUNTIME_CLASS(CFieldTestToolView);
+			context.m_pNewDocTemplate = m_pDocTemplate;
+
+			if (m_pChildFrame->LoadFrame(IDR_MAINFRAME, WS_MAXIMIZE | WS_CHILDWINDOW, this, &context))
+			{
+				m_pChildFrame->MDIActivate();
+				m_pChildFrame->InitialUpdateFrame(m_pDoc, TRUE);
+				m_pChildFrame->ShowWindow(SW_SHOWMAXIMIZED);
+				CFieldTestToolView* pView = (CFieldTestToolView*)m_pChildFrame->GetActiveView();
+
+				if (pView)
+					pView->m_pCamera = new CCaptureVideo();
+				pView->m_pCamera->Init(nCurSel, m_pChildFrame->GetSafeHwnd());
+			}
+		}
+	}
 }
 
 void CMainFrame::OnUpdateCameraCombobox(CCmdUI* pCmdUI)
 {
-    //pCmdUI->SetCheck(m_wndCaptionBar.IsVisible());
+	//pCmdUI->SetCheck(m_wndCaptionBar.IsVisible());
 }
 
 void CMainFrame::OnInfraedCombobox()
 {
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonComboBox* pCameraCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_CAMERA_COMBOBOX));
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pCameraCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_CAMERA_COMBOBOX));
 }
 
 void CMainFrame::OnUpdateInfraedCombobox(CCmdUI* pCmdUI)
 {
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonCheckBox* pInfraedCheckbox = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_RIBBON_INFRAED_CHECKBOX));
-    pCmdUI->Enable(!pInfraedCheckbox->IsChecked());
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonCheckBox* pInfraedCheckbox = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_RIBBON_INFRAED_CHECKBOX));
+	pCmdUI->Enable(!pInfraedCheckbox->IsChecked());
 }
 
 void CMainFrame::OnInfraedCheckbox()
 {
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonCheckBox* pInfraedCheckbox = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_RIBBON_INFRAED_CHECKBOX));
-    CMFCRibbonComboBox* pInfraedCombobox = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_INFRAED_COMBOBOX));
-
-    if ( !pInfraedCheckbox->IsChecked() )
-    {
-        int nCurSel = pInfraedCombobox->GetCurSel();
-        if ( nCurSel != CB_ERR ) 
-        {
-            m_SerialTW.SetIOMode();
-            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);
-            }
-        }
-    }
-    else
-    {
-        if ( m_SerialTW.IsOpen() )
-            m_SerialTW.Close();
-    }
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonCheckBox* pInfraedCheckbox = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_RIBBON_INFRAED_CHECKBOX));
+	CMFCRibbonComboBox* pInfraedCombobox = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_INFRAED_COMBOBOX));
+
+	if (!pInfraedCheckbox->IsChecked())
+	{
+		int nCurSel = pInfraedCombobox->GetCurSel();
+		if (nCurSel != CB_ERR)
+		{
+			m_SerialTW.SetIOMode();
+			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);
+			}
+		}
+	}
+	else
+	{
+		if (m_SerialTW.IsOpen())
+			m_SerialTW.Close();
+	}
 }
 
 void CMainFrame::OnUpdateInfraedCheckbox(CCmdUI* pCmdUI)
 {
-    pCmdUI->SetCheck(m_SerialTW.IsOpen());
+	pCmdUI->SetCheck(m_SerialTW.IsOpen());
 }
 
 void CMainFrame::OnInfraedVersionCombobox()
 {
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonComboBox* pVersionCombobox = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_INFRAED_VERSION_COMBOBOX));
-    if ( pVersionCombobox )
-    {
-        Global::g_nVersion = pVersionCombobox->GetCurSel();
-        if (Global::g_nVersion != CB_ERR )
-        {
-            Global::g_nVersion++;
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pVersionCombobox = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_INFRAED_VERSION_COMBOBOX));
+	if (pVersionCombobox)
+	{
+		Global::g_nVersion = pVersionCombobox->GetCurSel();
+		if (Global::g_nVersion != CB_ERR)
+		{
+			Global::g_nVersion++;
 #if _MSC_VER <= 1500
-            if (Global::g_nVersion == 1 )
-                WritePrivateProfileString("TestWizard", "Ver", "1", Global::g_szConfig);
-            else if (Global::g_nVersion == 2 )
-                WritePrivateProfileString("TestWizard", "Ver", "2", Global::g_szConfig);
-            else if (Global::g_nVersion == 3 )
-                WritePrivateProfileString("TestWizard", "Ver", "3", Global::g_szConfig);
-            else if (Global::g_nVersion == 4)
-                WritePrivateProfileString("TestWizard", "Ver", "4", Global::g_szConfig);
+			if (Global::g_nVersion == 1)
+				WritePrivateProfileString("TestWizard", "Ver", "1", Global::g_szConfig);
+			else if (Global::g_nVersion == 2)
+				WritePrivateProfileString("TestWizard", "Ver", "2", Global::g_szConfig);
+			else if (Global::g_nVersion == 3)
+				WritePrivateProfileString("TestWizard", "Ver", "3", Global::g_szConfig);
+			else if (Global::g_nVersion == 4)
+				WritePrivateProfileString("TestWizard", "Ver", "4", Global::g_szConfig);
 #else
-            // C++11直接用lambda表示式处理;
-            WritePrivateProfileString("TestWizard", "Ver", [](int nVer)->LPCSTR{
-                if (nVer == 1)
-                    return _T("1");
-                else if (nVer == 2)
-                    return _T("2");
-                else if (nVer == 3)
-                    return _T("3");
-                else if (nVer == 4)
-                    return _T("4");
-                }(Global::g_nVersion), Global::g_szConfig);
+			// C++11直接用lambda表示式处理;
+			WritePrivateProfileString("TestWizard", "Ver", [](int nVer)->LPCSTR {
+				if (nVer == 1)
+					return _T("1");
+				else if (nVer == 2)
+					return _T("2");
+				else if (nVer == 3)
+					return _T("3");
+				else if (nVer == 4)
+					return _T("4");
+				else
+					return _T("1");
+				}(Global::g_nVersion), Global::g_szConfig);
 #endif
-
-        }
-    }
+		}
+	}
 }
 
 void CMainFrame::OnUpdateInfraedVersionCombobox(CCmdUI* pCmdUI)
 {
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonComboBox* pVersionCombobox = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_INFRAED_VERSION_COMBOBOX));
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pVersionCombobox = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_INFRAED_VERSION_COMBOBOX));
 
 }
 
 void CMainFrame::OnSwitcherCombobox()
 {
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonComboBox* pCameraCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_COMBOBOX));
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pCameraCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_COMBOBOX));
 }
 
 void CMainFrame::OnUpdateSwitcherCombobox(CCmdUI* pCmdUI)
 {
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonCheckBox* pSwitcherCheckbox = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_CHECKBOX));
-    pCmdUI->Enable(!pSwitcherCheckbox->IsChecked());
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonCheckBox* pSwitcherCheckbox = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_CHECKBOX));
+	pCmdUI->Enable(!pSwitcherCheckbox->IsChecked());
 }
 
 void CMainFrame::OnSwitcherCheckbox()
 {
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonCheckBox* pSwitcherCheckbox = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_CHECKBOX));
-    CMFCRibbonComboBox* pSwitcherCombobox = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_COMBOBOX));
-
-    if ( !pSwitcherCheckbox->IsChecked() )
-    {
-        int nCurSel = pSwitcherCombobox->GetCurSel();
-        if ( nCurSel != CB_ERR ) 
-        {
-            m_SerialUSB.SetIOMode();
-            CString strText = pSwitcherCombobox->GetItem(nCurSel);
-            if ( m_SerialUSB.Open(atol(strText.Mid(3).GetString()), 115200) )
-            {
-                m_SerialUSB.SetBufferSize(1024,1024);
-                WritePrivateProfileString("Switcher", "Com", strText.GetString(), Global::g_szConfig);
-            }
-        }
-    }
-    else
-    {
-        if ( m_SerialUSB.IsOpen() )
-            m_SerialUSB.Close();
-
-        // 重转Checkbox;
-        m_bSwitcherCheckA = false;
-        m_bSwitcherCheckB = false;
-    }
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonCheckBox* pSwitcherCheckbox = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_CHECKBOX));
+	CMFCRibbonComboBox* pSwitcherCombobox = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_COMBOBOX));
+
+	if (!pSwitcherCheckbox->IsChecked())
+	{
+		int nCurSel = pSwitcherCombobox->GetCurSel();
+		if (nCurSel != CB_ERR)
+		{
+			m_SerialUSB.SetIOMode();
+			CString strText = pSwitcherCombobox->GetItem(nCurSel);
+			if (m_SerialUSB.Open(atol(strText.Mid(3).GetString()), 115200))
+			{
+				m_SerialUSB.SetBufferSize(1024, 1024);
+				WritePrivateProfileString("Switcher", "Com", strText.GetString(), Global::g_szConfig);
+			}
+		}
+	}
+	else
+	{
+		if (m_SerialUSB.IsOpen())
+			m_SerialUSB.Close();
+
+		// 重转Checkbox;
+		m_bSwitcherCheckA = false;
+		m_bSwitcherCheckB = false;
+	}
 }
 
 void CMainFrame::OnUpdateSwitcherCheckbox(CCmdUI* pCmdUI)
 {
-    pCmdUI->SetCheck(m_SerialUSB.IsOpen());
+	pCmdUI->SetCheck(m_SerialUSB.IsOpen());
 }
 
 void CMainFrame::OnSwitcherCheckboxA()
 {
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonCheckBox* pCheckbox = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_CHECKBOXA));
-    m_bSwitcherCheckA = !(m_bSwitcherCheckB = pCheckbox->IsChecked());
-
-    if ( m_SerialUSB.IsOpen() )
-    {
-        m_SerialUSB.SetTimeouts(0,2,50,1,150);
-        // 封装发送包;
-        byte szSendData[MAX_SWITCH_LEN] = {0};
-        _stprintf_s((TCHAR*)szSendData, MAX_SWITCH_LEN, _T("*SET PORT %c\r"), m_bSwitcherCheckA ? 'A':'B');
-
-        // 发送单信号;
-        if ( m_SerialUSB.WriteSync(szSendData, _tcslen((TCHAR*)szSendData)) )
-        {
-            memset(szSendData, 0, MAX_SWITCH_LEN);
-            m_SerialUSB.ReadSync(szSendData, MAX_SWITCH_LEN);
-            TRACE("切换U盘成功\n");
-        }
-        else
-        {
-            TRACE("切换U盘失败\n");
-        }
-    }
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonCheckBox* pCheckbox = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_CHECKBOXA));
+	m_bSwitcherCheckA = !(m_bSwitcherCheckB = pCheckbox->IsChecked());
+
+	if (m_SerialUSB.IsOpen())
+	{
+		m_SerialUSB.SetTimeouts(0, 2, 50, 1, 150);
+		// 封装发送包;
+		byte szSendData[MAX_SWITCH_LEN] = { 0 };
+		_stprintf_s((TCHAR*)szSendData, MAX_SWITCH_LEN, _T("*SET PORT %c\r"), m_bSwitcherCheckA ? 'A' : 'B');
+
+		// 发送单信号;
+		if (m_SerialUSB.WriteSync(szSendData, _tcslen((TCHAR*)szSendData)))
+		{
+			memset(szSendData, 0, MAX_SWITCH_LEN);
+			m_SerialUSB.ReadSync(szSendData, MAX_SWITCH_LEN);
+			TRACE("切换U盘成功\n");
+		}
+		else
+		{
+			TRACE("切换U盘失败\n");
+		}
+	}
 }
 
 void CMainFrame::OnUpdateSwitcherCheckboxA(CCmdUI* pCmdUI)
 {
-    pCmdUI->Enable(m_SerialUSB.IsOpen());
-    pCmdUI->SetCheck(m_bSwitcherCheckA);
+	pCmdUI->Enable(m_SerialUSB.IsOpen());
+	pCmdUI->SetCheck(m_bSwitcherCheckA);
 }
 
 void CMainFrame::OnSwitcherCheckboxB()
 {
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonCheckBox* pCheckbox = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_CHECKBOXB));
-    m_bSwitcherCheckB = !(m_bSwitcherCheckA = pCheckbox->IsChecked());
-
-    if ( m_SerialUSB.IsOpen() )
-    {
-        m_SerialUSB.SetTimeouts(0,2,50,1,150);
-        // 封装发送包;
-        byte szSendData[MAX_SWITCH_LEN] = {0};
-        _stprintf_s((TCHAR*)szSendData, MAX_SWITCH_LEN, _T("*SET PORT %c\r"), m_bSwitcherCheckA ? 'A':'B');
-
-        // 发送单信号;
-        if ( m_SerialUSB.WriteSync(szSendData, _tcslen((TCHAR*)szSendData)) )
-        {
-            memset(szSendData, 0, MAX_SWITCH_LEN);
-            m_SerialUSB.ReadSync(szSendData, MAX_SWITCH_LEN);
-            TRACE("切换U盘成功\n");
-        }
-        else
-        {
-            TRACE("切换U盘失败\n");
-        }
-    }
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonCheckBox* pCheckbox = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_CHECKBOXB));
+	m_bSwitcherCheckB = !(m_bSwitcherCheckA = pCheckbox->IsChecked());
+
+	if (m_SerialUSB.IsOpen())
+	{
+		m_SerialUSB.SetTimeouts(0, 2, 50, 1, 150);
+		// 封装发送包;
+		byte szSendData[MAX_SWITCH_LEN] = { 0 };
+		_stprintf_s((TCHAR*)szSendData, MAX_SWITCH_LEN, _T("*SET PORT %c\r"), m_bSwitcherCheckA ? 'A' : 'B');
+
+		// 发送单信号;
+		if (m_SerialUSB.WriteSync(szSendData, _tcslen((TCHAR*)szSendData)))
+		{
+			memset(szSendData, 0, MAX_SWITCH_LEN);
+			m_SerialUSB.ReadSync(szSendData, MAX_SWITCH_LEN);
+			TRACE("切换U盘成功\n");
+		}
+		else
+		{
+			TRACE("切换U盘失败\n");
+		}
+	}
 }
 
 void CMainFrame::OnUpdateSwitcherCheckboxB(CCmdUI* pCmdUI)
 {
-    pCmdUI->Enable(m_SerialUSB.IsOpen());
-    pCmdUI->SetCheck(m_bSwitcherCheckB);
+	pCmdUI->Enable(m_SerialUSB.IsOpen());
+	pCmdUI->SetCheck(m_bSwitcherCheckB);
 }
 
 void CMainFrame::OnCameraFlush()
 {
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonComboBox* pCameraCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_CAMERA_COMBOBOX));
-    std::vector<TString> vtDevices;
-    EnumDevices(vtDevices);
-    int nCurSel = pCameraCombo->GetCurSel();
-    if ( nCurSel != -1 )
-    {    
-        bool bDel = true;
-        TString str = pCameraCombo->GetItem(pCameraCombo->GetCurSel());
-        for ( std::vector<TString>::iterator it = vtDevices.begin(); it != vtDevices.end(); it++ )
-        {
-            if ( _tcscmp(str.c_str(), it->c_str()) == 0 )
-            {
-                bDel = false;
-                break;
-            }
-        }
-
-        if ( bDel && m_pChildFrame )
-        {
-            CFieldTestToolView *pView = (CFieldTestToolView*)m_pChildFrame->GetActiveView();
-            if ( pView->m_pCamera )
-                delete pView->m_pCamera;
-            pView->m_pCamera = NULL;
-            pView->CloseWindow();
-            pView->DestroyWindow();
-
-            m_pChildFrame->CloseWindow();
-            m_pChildFrame = NULL;
-
-            // 设备移除后,设置空;
-            pCameraCombo->DeleteItem(nCurSel);
-        }
-    }
-
-    pCameraCombo->RemoveAllItems();
-    for (std::vector<TString>::iterator it = vtDevices.begin(); it != vtDevices.end(); it++)
-    {
-        pCameraCombo->AddItem(it->c_str());
-    }
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pCameraCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_CAMERA_COMBOBOX));
+	std::vector<TString> vtDevices;
+	EnumDevices(vtDevices);
+	int nCurSel = pCameraCombo->GetCurSel();
+	if (nCurSel != -1)
+	{
+		bool bDel = true;
+		TString str = pCameraCombo->GetItem(pCameraCombo->GetCurSel());
+		for (std::vector<TString>::iterator it = vtDevices.begin(); it != vtDevices.end(); it++)
+		{
+			if (_tcscmp(str.c_str(), it->c_str()) == 0)
+			{
+				bDel = false;
+				break;
+			}
+		}
+
+		if (bDel && m_pChildFrame)
+		{
+			CFieldTestToolView* pView = (CFieldTestToolView*)m_pChildFrame->GetActiveView();
+			if (pView->m_pCamera)
+				delete pView->m_pCamera;
+			pView->m_pCamera = NULL;
+			pView->CloseWindow();
+			pView->DestroyWindow();
+
+			m_pChildFrame->CloseWindow();
+			m_pChildFrame = NULL;
+
+			// 设备移除后,设置空;
+			pCameraCombo->DeleteItem(nCurSel);
+		}
+	}
+
+	pCameraCombo->RemoveAllItems();
+	for (std::vector<TString>::iterator it = vtDevices.begin(); it != vtDevices.end(); it++)
+	{
+		pCameraCombo->AddItem(it->c_str());
+	}
 }
 
 void CMainFrame::OnUpdateCameraFlush(CCmdUI* pCmdUI)
 {
-    //pCmdUI->Enable();
+	//pCmdUI->Enable();
 }
 
 bool CMainFrame::RegisterDeviceChange()
 {
-    // HID设备的GUID,可在设备管理器中查询,经查结果如下:
-    // {745a17a0-74d3-11d0-b6fe-00a0c90f57da}
-    // 注:使用真实的HID的GUID,反正检测不出来,如果是其它的GUID,所有USB事件都能检测出
-    const GUID GUID_DEVINTERFACE_LIST[] = {
-        { 0xA5DCBF10, 0x6530, 0x11D2,{ 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } },  // USB设备
-        { 0x53f56307, 0xb6bf, 0x11d0,{ 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b } },  // 磁盘(U盘)
-        { 0x4D1E55B2, 0xF16F, 0x11CF,{ 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 } },  // HID
-        { 0x745A17A0, 0x74D3, 0x11D0,{ 0xB6, 0xFE, 0x00, 0xA0, 0xC9, 0x0F, 0x57, 0xDA } },  // 另一个HID
-        { 0xad498944, 0x762f, 0x11d0,{ 0x8d, 0xcb, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c } },  // 网卡;
-        { 0x4d36e96c, 0xe325, 0x11ce,{ 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18 } }
-    }; 
+	// HID设备的GUID,可在设备管理器中查询,经查结果如下:
+	// {745a17a0-74d3-11d0-b6fe-00a0c90f57da}
+	// 注:使用真实的HID的GUID,反正检测不出来,如果是其它的GUID,所有USB事件都能检测出
+	// 实际上:目前测试精灵等通过USB转串口的设备都是USB设备,而USB摄像头也是;
+	const GUID GUID_DEVINTERFACE_LIST[] = {
+		{ 0xA5DCBF10, 0x6530, 0x11D2,{ 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } },  // USB设备
+		{ 0x53f56307, 0xb6bf, 0x11d0,{ 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b } },  // 磁盘(U盘)
+		{ 0x4D1E55B2, 0xF16F, 0x11CF,{ 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 } },  // HID
+		{ 0x745A17A0, 0x74D3, 0x11D0,{ 0xB6, 0xFE, 0x00, 0xA0, 0xC9, 0x0F, 0x57, 0xDA } },  // 另一个HID
+		{ 0xad498944, 0x762f, 0x11d0,{ 0x8d, 0xcb, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c } },  // 网卡;
+		{ 0x4d36e96c, 0xe325, 0x11ce,{ 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18 } }
+	};
 #if 0
-    // 注册HID事件
-    DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface;
-    memset(&DevBroadcastDeviceInterface, 0, sizeof(DEV_BROADCAST_DEVICEINTERFACE));
-    DevBroadcastDeviceInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
-    DevBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
-    // 可以循环注册所有列出的GUID,此处只使用一种
-    DevBroadcastDeviceInterface.dbcc_classguid = GUID_DEVINTERFACE_LIST[5];
-    HDEVNOTIFY hDevNotify = RegisterDeviceNotification(this->GetSafeHwnd(), &DevBroadcastDeviceInterface, DEVICE_NOTIFY_WINDOW_HANDLE);
-
-    return hDevNotify ? true : false;
+	// 注册HID事件
+	DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface;
+	memset(&DevBroadcastDeviceInterface, 0, sizeof(DEV_BROADCAST_DEVICEINTERFACE));
+	DevBroadcastDeviceInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
+	DevBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
+	// 可以循环注册所有列出的GUID,此处只使用一种
+	DevBroadcastDeviceInterface.dbcc_classguid = GUID_DEVINTERFACE_LIST[5];
+	HDEVNOTIFY hDevNotify = RegisterDeviceNotification(this->GetSafeHwnd(), &DevBroadcastDeviceInterface, DEVICE_NOTIFY_WINDOW_HANDLE);
+
+	return hDevNotify ? true : false;
 #else
-    HDEVNOTIFY hDevNotify;
-    for ( int i = 0; i < 6; i++ )
-    {
-        // 注册HID事件
-        DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface;
-        memset(&DevBroadcastDeviceInterface, 0, sizeof(DEV_BROADCAST_DEVICEINTERFACE));
-        DevBroadcastDeviceInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
-        DevBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
-        DevBroadcastDeviceInterface.dbcc_classguid = GUID_DEVINTERFACE_LIST[i];
-        HDEVNOTIFY hDevNotify = RegisterDeviceNotification(this->GetSafeHwnd(), &DevBroadcastDeviceInterface, DEVICE_NOTIFY_WINDOW_HANDLE);
-        if ( !hDevNotify )
-            return false;
-    }
-
-    return true;
+	HDEVNOTIFY hDevNotify;
+	for (int i = 0; i < 6; i++)
+	{
+		// 注册HID事件
+		DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface;
+		memset(&DevBroadcastDeviceInterface, 0, sizeof(DEV_BROADCAST_DEVICEINTERFACE));
+		DevBroadcastDeviceInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
+		DevBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
+		DevBroadcastDeviceInterface.dbcc_classguid = GUID_DEVINTERFACE_LIST[i];
+		HDEVNOTIFY hDevNotify = RegisterDeviceNotification(this->GetSafeHwnd(), &DevBroadcastDeviceInterface, DEVICE_NOTIFY_WINDOW_HANDLE);
+		if (!hDevNotify)
+			return false;
+	}
+
+	return true;
 #endif    
 }
 
 BOOL CMainFrame::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)
 {
-    if ( dwData == 0 )
-        return FALSE;
-
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-
-    CMFCRibbonComboBox* pInfradeCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_INFRAED_COMBOBOX));
-    CMFCRibbonComboBox* pSwitcherCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_COMBOBOX));
-    ASSERT_VALID(pInfradeCombo);
-    ASSERT_VALID(pSwitcherCombo);
-
-    DEV_BROADCAST_DEVICEINTERFACE* pdbd = (DEV_BROADCAST_DEVICEINTERFACE*)dwData;
-    if ( pdbd->dbcc_devicetype == DBT_DEVTYP_PORT )
-    {
-        DEV_BROADCAST_PORT *pbdp = (DEV_BROADCAST_PORT*)dwData;
-        if (_tcsstr(pbdp->dbcp_name, _T("COM")))
-        {
-            // 测试精灵;
-            {
-                // 查找是否有添加过该项;
-                int nIndex = pInfradeCombo->FindItem(pbdp->dbcp_name);
-                // 删除和新增前,先获取当前选中的项;
-                CString strCurCOM = _T("");
-                int nCurIndex = pInfradeCombo->GetCurSel();
-                if ( nCurIndex != CB_ERR )
-                    strCurCOM = pInfradeCombo->GetItem(nCurIndex);
-
-                if ( nEventType == DBT_DEVICEREMOVECOMPLETE )
-                {// 串口拨掉;
-                    TRACE(_T("串口拨掉\n"));
-                    if ( nIndex != CB_ERR )
-                    {                
-                        pInfradeCombo->DeleteItem(nIndex);
-                        // 删除后, 由于索引变化了,要重新设置选中项;
-                        if ( nCurIndex != CB_ERR )
-                            pInfradeCombo->SelectItem(strCurCOM);
-                    }
-                }
-                else if ( nEventType == DBT_DEVICEARRIVAL )
-                {// 串口插入;
-                    TRACE(_T("串口插入\n"));
-                    if ( nIndex == CB_ERR )
-                    {
-                        pInfradeCombo->AddItem(pbdp->dbcp_name);
-                        // 新增后,由于索引变化了,要重新设置选中项;
-                        if ( nCurIndex != CB_ERR )
-                            pInfradeCombo->SelectItem(strCurCOM);
-                        else
-                        {
-                            IsTestWizardPort(pbdp->dbcp_name);
-                        }
-                    }
-                }
-            }
-
-            // USB切换器;
-            {
-                // 查找是否有添加过该项;
-                int nIndex = pSwitcherCombo->FindItem(pbdp->dbcp_name);
-                // 删除和新增前,先获取当前选中的项;
-                CString strCurCOM = _T("");
-                int nCurIndex = pSwitcherCombo->GetCurSel();
-                if ( nCurIndex != CB_ERR )
-                    strCurCOM = pSwitcherCombo->GetItem(nCurIndex);
-
-                if ( nEventType == DBT_DEVICEREMOVECOMPLETE )
-                {// 串口拨掉;
-                    TRACE(_T("串口拨掉\n"));
-                    if ( nIndex != CB_ERR )
-                    {                
-                        pSwitcherCombo->DeleteItem(nIndex);
-                        // 删除后, 由于索引变化了,要重新设置选中项;
-                        if ( nCurIndex != CB_ERR )
-                            pSwitcherCombo->SelectItem(strCurCOM);
-                    }
-                }
-                else if ( nEventType == DBT_DEVICEARRIVAL )
-                {// 串口插入;
-                    TRACE(_T("串口插入\n"));
-                    if ( nIndex == CB_ERR )
-                    {
-                        pSwitcherCombo->AddItem(pbdp->dbcp_name);
-                        // 新增后,由于索引变化了,要重新设置选中项;
-                        if ( nCurIndex != CB_ERR )
-                            pSwitcherCombo->SelectItem(strCurCOM);
-                        else
-                        {
-                            IsUSBSwitchPort(pbdp->dbcp_name);
-                        }
-                    }
-                }
-            }
-        } 
-    }
-
-    // USB等接口设备;
-    if ( pdbd->dbcc_devicetype == DBT_DEVTYP_DEVICEINTERFACE )
-    {
-        DEV_BROADCAST_HDR* phdr = (DEV_BROADCAST_HDR*)dwData;
-        CMFCRibbonComboBox* pCameraCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_CAMERA_COMBOBOX));
-        std::vector<TString> vtDevices;
-        if ( nEventType == DBT_DEVICEREMOVECOMPLETE || nEventType == DBT_DEVICEARRIVAL)
-        {
-            OutputDebugString(_T("设备有变化===============\n"));
-            // 新增时,需要等待系统刷新后才能遍历设备(有时仍不灵,添加刷新按钮处理);
-            if ( nEventType == DBT_DEVICEARRIVAL )
-                Sleep(1000);
-
-            EnumDevices(vtDevices);
-            int nCurSel = pCameraCombo->GetCurSel();
-            if ( nCurSel != -1 )
-            {    
-                bool bDel = true;
-                TString str = pCameraCombo->GetItem(pCameraCombo->GetCurSel());
-                for ( std::vector<TString>::iterator it = vtDevices.begin(); it != vtDevices.end(); it++ )
-                {
-                    if ( _tcscmp(str.c_str(), it->c_str()) == 0 )
-                    {
-                        bDel = false;
-                        break;
-                    }
-                }
-
-                if ( bDel && m_pChildFrame )
-                {
-                    CFieldTestToolView *pView = (CFieldTestToolView*)m_pChildFrame->GetActiveView();
-                    if ( pView->m_pCamera )
-                        delete pView->m_pCamera;
-                    pView->m_pCamera = NULL;
-                    pView->DestroyWindow();
-
-                    m_pChildFrame->DestroyWindow();
-                    m_pChildFrame = NULL;
-
-                    // 设备移除后,设置空;
-                    pCameraCombo->DeleteItem(nCurSel);
-                }
-            }
-
-            pCameraCombo->RemoveAllItems();
-            for (std::vector<TString>::iterator it = vtDevices.begin(); it != vtDevices.end(); it++)
-            {
-                pCameraCombo->AddItem(it->c_str());
-            }
-        }
-    }
-
-    TRACE(_T("OnDeviceChange\n"));
-
-    return TRUE;
+	if (dwData == 0)
+		return FALSE;
+
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+
+	CMFCRibbonComboBox* pInfradeCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_INFRAED_COMBOBOX));
+	CMFCRibbonComboBox* pSwitcherCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_COMBOBOX));
+	ASSERT_VALID(pInfradeCombo);
+	ASSERT_VALID(pSwitcherCombo);
+
+	DEV_BROADCAST_DEVICEINTERFACE* pdbd = (DEV_BROADCAST_DEVICEINTERFACE*)dwData;
+	if (pdbd->dbcc_devicetype == DBT_DEVTYP_PORT)
+	{
+		DEV_BROADCAST_PORT* pbdp = (DEV_BROADCAST_PORT*)dwData;
+		if (_tcsstr(pbdp->dbcp_name, _T("COM")))
+		{
+			// 红外遥控头;
+			{
+				// 查找是否有添加过该项;
+				int nIndex = pInfradeCombo->FindItem(pbdp->dbcp_name);
+				// 删除和新增前,先获取当前选中的项;
+				CString strCurCOM = _T("");
+				int nCurIndex = pInfradeCombo->GetCurSel();
+				if (nCurIndex != CB_ERR)
+					strCurCOM = pInfradeCombo->GetItem(nCurIndex);
+
+				if (nEventType == DBT_DEVICEREMOVECOMPLETE)
+				{// 串口拨掉;
+					TRACE(_T("串口拨掉\n"));
+					if (nIndex != CB_ERR)
+					{
+						pInfradeCombo->DeleteItem(nIndex);
+						// 删除后, 由于索引变化了,要重新设置选中项;
+						if (nCurIndex != CB_ERR)
+							pInfradeCombo->SelectItem(strCurCOM);
+					}
+				}
+				else if (nEventType == DBT_DEVICEARRIVAL)
+				{// 串口插入;
+					TRACE(_T("串口插入\n"));
+					if (nIndex == CB_ERR)
+					{
+						pInfradeCombo->AddItem(pbdp->dbcp_name);
+						// 新增后,由于索引变化了,要重新设置选中项;
+						if (nCurIndex != CB_ERR)
+							pInfradeCombo->SelectItem(strCurCOM);
+						else
+						{
+							if (Global::g_nVersion == 1)
+								IsTestWizardPort(pbdp->dbcp_name);
+							else
+								OutputDebugString(_T("don't support"));
+						}
+					}
+				}
+			}
+
+			// USB切换器;
+			{
+				// 查找是否有添加过该项;
+				int nIndex = pSwitcherCombo->FindItem(pbdp->dbcp_name);
+				// 删除和新增前,先获取当前选中的项;
+				CString strCurCOM = _T("");
+				int nCurIndex = pSwitcherCombo->GetCurSel();
+				if (nCurIndex != CB_ERR)
+					strCurCOM = pSwitcherCombo->GetItem(nCurIndex);
+
+				if (nEventType == DBT_DEVICEREMOVECOMPLETE)
+				{// 串口拨掉;
+					TRACE(_T("串口拨掉\n"));
+					if (nIndex != CB_ERR)
+					{
+						pSwitcherCombo->DeleteItem(nIndex);
+						// 删除后, 由于索引变化了,要重新设置选中项;
+						if (nCurIndex != CB_ERR)
+							pSwitcherCombo->SelectItem(strCurCOM);
+					}
+				}
+				else if (nEventType == DBT_DEVICEARRIVAL)
+				{// 串口插入;
+					TRACE(_T("串口插入\n"));
+					if (nIndex == CB_ERR)
+					{
+						pSwitcherCombo->AddItem(pbdp->dbcp_name);
+						// 新增后,由于索引变化了,要重新设置选中项;
+						if (nCurIndex != CB_ERR)
+							pSwitcherCombo->SelectItem(strCurCOM);
+						else
+						{
+							IsUSBSwitchPort(pbdp->dbcp_name);
+						}
+					}
+				}
+			}
+		}
+	}
+
+	// USB等接口设备;
+	if (pdbd->dbcc_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
+	{
+		DEV_BROADCAST_HDR* phdr = (DEV_BROADCAST_HDR*)dwData;
+		CMFCRibbonComboBox* pCameraCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_CAMERA_COMBOBOX));
+		std::vector<TString> vtDevices;
+		if (nEventType == DBT_DEVICEREMOVECOMPLETE || nEventType == DBT_DEVICEARRIVAL)
+		{
+			OutputDebugString(_T("设备有变化===============\n"));
+			// 新增时,需要等待系统刷新后才能遍历设备(有时仍不灵,添加刷新按钮处理);
+			if (nEventType == DBT_DEVICEARRIVAL)
+				Sleep(1000);
+
+			EnumDevices(vtDevices);
+			int nCurSel = pCameraCombo->GetCurSel();
+			if (nCurSel != -1)
+			{
+				bool bDel = true;
+				TString str = pCameraCombo->GetItem(pCameraCombo->GetCurSel());
+				for (std::vector<TString>::iterator it = vtDevices.begin(); it != vtDevices.end(); it++)
+				{
+					if (_tcscmp(str.c_str(), it->c_str()) == 0)
+					{
+						bDel = false;
+						break;
+					}
+				}
+
+				if (bDel && m_pChildFrame)
+				{
+					CFieldTestToolView* pView = (CFieldTestToolView*)m_pChildFrame->GetActiveView();
+					if (pView->m_pCamera)
+						delete pView->m_pCamera;
+					pView->m_pCamera = NULL;
+					pView->DestroyWindow();
+
+					m_pChildFrame->DestroyWindow();
+					m_pChildFrame = NULL;
+
+					// 设备移除后,设置空;
+					pCameraCombo->DeleteItem(nCurSel);
+				}
+			}
+
+			pCameraCombo->RemoveAllItems();
+			for (std::vector<TString>::iterator it = vtDevices.begin(); it != vtDevices.end(); it++)
+			{
+				pCameraCombo->AddItem(it->c_str());
+			}
+		}
+	}
+
+	TRACE(_T("OnDeviceChange\n"));
+
+	return TRUE;
 }
 
 void CMainFrame::InitSerialCombobox()
 {
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonComboBox* pInfradeCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_INFRAED_COMBOBOX));
-    CMFCRibbonComboBox* pSwitcherCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_COMBOBOX));
-
-    ASSERT_VALID(pInfradeCombo);
-    ASSERT_VALID(pSwitcherCombo);
-
-    pInfradeCombo->RemoveAllItems();
-    pSwitcherCombo->RemoveAllItems();
-    for (std::vector<TString>::iterator it = m_vtPorts.begin(); it != m_vtPorts.end(); it++) 
-    {
-        pInfradeCombo->AddItem(it->c_str());
-        pSwitcherCombo->AddItem(it->c_str());
-    }
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pInfradeCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_INFRAED_COMBOBOX));
+	CMFCRibbonComboBox* pSwitcherCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_COMBOBOX));
+
+	ASSERT_VALID(pInfradeCombo);
+	ASSERT_VALID(pSwitcherCombo);
+
+	pInfradeCombo->RemoveAllItems();
+	pSwitcherCombo->RemoveAllItems();
+	for (std::vector<TString>::iterator it = m_vtPorts.begin(); it != m_vtPorts.end(); it++)
+	{
+		pInfradeCombo->AddItem(it->c_str());
+		pSwitcherCombo->AddItem(it->c_str());
+	}
 }
 
 bool CMainFrame::IsTestWizardPort(CString strCOMPort)
 {
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonComboBox* pInfradeCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_INFRAED_COMBOBOX));
-    CMFCRibbonCheckBox* pInfradeCheckbox = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_RIBBON_INFRAED_CHECKBOX));
-    ASSERT_VALID(pInfradeCombo);
-    ASSERT_VALID(pInfradeCheckbox);
-
-    CString strText = _T("");
-    if ( pInfradeCheckbox->IsChecked() )
-    {// 串口已打开;
-        return false;
-    }
-
-    /* 
-    发送:
-    *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) )
-    {
-        // 快速响应读写,不需要设置过长的超时;
-        m_SerialTW.SetTimeouts(0,1,20,1,150);
-        // 封装发送包;
-        byte szSendData[MAX_PATH] = "*about\r";
-        if ( m_SerialTW.WriteSync(szSendData, strlen((const char*)szSendData)) )
-        {
-            memset(szSendData, 0, MAX_PATH);
-            m_SerialTW.ReadSync(szSendData, MAX_PATH);
-            if ( strstr((char*)szSendData, "Product name:      Test Wizard\r") )
-            {
-                // 设置当前串口为选中状态;
-                pInfradeCombo->SelectItem(strCOMPort);
-                Global::g_Config.twPort = strCOMPort;
-                WritePrivateProfileString(_T("TestWizard"), _T("Com"), strCOMPort.GetString(), Global::g_szConfig);
-                // SetDlgItemText(BTN_OPEN_COM, _T("Close"));
-                // m_cbCOM.EnableWindow(FALSE);
-                // 关闭后,重新打开在设置超时值;
-                m_SerialTW.Close();
-                return true;
-            }
-            TRACE("发送单信号成功\n");
-        }
-        else
-        {
-            TRACE("发送单信号失败\n");
-        }
-
-        m_SerialTW.Close();
-    }
-
-    return false;
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pInfradeCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_INFRAED_COMBOBOX));
+	CMFCRibbonCheckBox* pInfradeCheckbox = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_RIBBON_INFRAED_CHECKBOX));
+	ASSERT_VALID(pInfradeCombo);
+	ASSERT_VALID(pInfradeCheckbox);
+
+	CString strText = _T("");
+	if (pInfradeCheckbox->IsChecked())
+	{// 串口已打开;
+		return false;
+	}
+
+	/*
+	发送:
+	*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))
+	{
+		// 快速响应读写,不需要设置过长的超时;
+		m_SerialTW.SetTimeouts(0, 1, 20, 1, 150);
+		// 封装发送包;
+		byte szSendData[MAX_PATH] = "*about\r";
+		if (m_SerialTW.WriteSync(szSendData, strlen((const char*)szSendData)))
+		{
+			memset(szSendData, 0, MAX_PATH);
+			m_SerialTW.ReadSync(szSendData, MAX_PATH);
+			if (strstr((char*)szSendData, "Product name:      Test Wizard\r"))
+			{
+				// 设置当前串口为选中状态;
+				pInfradeCombo->SelectItem(strCOMPort);
+				Global::g_Config.twPort = strCOMPort;
+				WritePrivateProfileString(_T("TestWizard"), _T("Com"), strCOMPort.GetString(), Global::g_szConfig);
+				// SetDlgItemText(BTN_OPEN_COM, _T("Close"));
+				// m_cbCOM.EnableWindow(FALSE);
+				// 关闭后,重新打开在设置超时值;
+				m_SerialTW.Close();
+				return true;
+			}
+			TRACE("发送单信号成功\n");
+		}
+		else
+		{
+			TRACE("发送单信号失败\n");
+		}
+
+		m_SerialTW.Close();
+	}
+
+	return false;
 }
 
 bool CMainFrame::IsUSBSwitchPort(CString strCOMPort)
 {
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonComboBox* pSwitcherCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_COMBOBOX));
-    CMFCRibbonCheckBox* pSwitcherCheckbox = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_CHECKBOX));
-    ASSERT_VALID(pSwitcherCombo);
-    ASSERT_VALID(pSwitcherCheckbox);
-
-    CString strText = _T("");
-    if ( pSwitcherCheckbox->IsChecked() )
-    {// 串口已打开;
-        return false;
-    }
-
-    /* 
-    发送:
-    *SET PORT A\r 
-    返回:
-    set PORT A\r\n 
-    */
-    m_SerialUSB.SetIOMode();
-    if ( m_SerialUSB.Open(_tstol(strCOMPort.Mid(3).GetString()), 115200) )
-    {
-        // 快速响应读写,不需要设置过长的超时;
-        m_SerialUSB.SetTimeouts(0,1,20,1,150);
-        // 封装发送包;
-        byte szSendData[MAX_PATH] = "*SET PORT A\r";
-        if ( m_SerialUSB.WriteSync(szSendData, strlen((const char*)szSendData)) )
-        {
-            memset(szSendData, 0, MAX_PATH);
-            m_SerialUSB.ReadSync(szSendData, MAX_PATH);
-            if ( strcmp((char*)szSendData, "set PORT A\r\n") == 0 )
-            {
-                // 设置当前串口为选中状态;
-                pSwitcherCombo->SelectItem(strCOMPort);
-                Global::g_Config.switchPort = strCOMPort;
-                WritePrivateProfileString(_T("Switcher"), _T("Com"), strCOMPort.GetString(), Global::g_szConfig);
-                // SetDlgItemText(BTN_OPEN_COM, _T("Close"));
-                // m_cbCOM.EnableWindow(FALSE);
-                // 关闭后,重新打开在设置超时值;
-                m_SerialUSB.Close();
-                return true;
-            }
-            TRACE("发送单信号成功\n");
-        }
-        else
-        {
-            TRACE("发送单信号失败\n");
-        }
-
-        m_SerialUSB.Close();
-    }
-
-    return false;
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pSwitcherCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_COMBOBOX));
+	CMFCRibbonCheckBox* pSwitcherCheckbox = DYNAMIC_DOWNCAST(CMFCRibbonCheckBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_CHECKBOX));
+	ASSERT_VALID(pSwitcherCombo);
+	ASSERT_VALID(pSwitcherCheckbox);
+
+	CString strText = _T("");
+	if (pSwitcherCheckbox->IsChecked())
+	{// 串口已打开;
+		return false;
+	}
+
+	/*
+	发送:
+	*SET PORT A\r
+	返回:
+	set PORT A\r\n
+	*/
+	m_SerialUSB.SetIOMode();
+	if (m_SerialUSB.Open(_tstol(strCOMPort.Mid(3).GetString()), 115200))
+	{
+		// 快速响应读写,不需要设置过长的超时;
+		m_SerialUSB.SetTimeouts(0, 1, 20, 1, 150);
+		// 封装发送包;
+		byte szSendData[MAX_PATH] = "*SET PORT A\r";
+		if (m_SerialUSB.WriteSync(szSendData, strlen((const char*)szSendData)))
+		{
+			memset(szSendData, 0, MAX_PATH);
+			m_SerialUSB.ReadSync(szSendData, MAX_PATH);
+			if (strcmp((char*)szSendData, "set PORT A\r\n") == 0)
+			{
+				// 设置当前串口为选中状态;
+				pSwitcherCombo->SelectItem(strCOMPort);
+				Global::g_Config.switchPort = strCOMPort;
+				WritePrivateProfileString(_T("Switcher"), _T("Com"), strCOMPort.GetString(), Global::g_szConfig);
+				// SetDlgItemText(BTN_OPEN_COM, _T("Close"));
+				// m_cbCOM.EnableWindow(FALSE);
+				// 关闭后,重新打开在设置超时值;
+				m_SerialUSB.Close();
+				return true;
+			}
+			TRACE("发送单信号成功\n");
+		}
+		else
+		{
+			TRACE("发送单信号失败\n");
+		}
+
+		m_SerialUSB.Close();
+	}
+
+	return false;
 }
 
 void CMainFrame::OnTimer(UINT_PTR nIDEvent)
 {
-    // TODO: 在此添加消息处理程序代码和/或调用默认值
-    CMFCRibbonBar* pRibbon = GetRibbonBar();
-    ASSERT_VALID(pRibbon);
-    CMFCRibbonComboBox* pInfradeCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_INFRAED_COMBOBOX));
-    CMFCRibbonComboBox* pSwitcherCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_COMBOBOX));
-    ASSERT_VALID(pInfradeCombo);
-    ASSERT_VALID(pSwitcherCombo);
-
-    if ( nIDEvent == 0 )
-    {
-        KillTimer(nIDEvent);
-        Global::GetSysSerialPort(m_vtPorts);
-        InitSerialCombobox();
-        if ( Global::g_Config.twPort.size() == 0 || !pInfradeCombo->SelectItem(Global::g_Config.twPort.c_str()) )
-        {
-            for (std::vector<TString>::iterator it = m_vtPorts.begin(); it != m_vtPorts.end(); it++) 
-            {
-                if ( !m_bFindTestWizardPort )
-                {
-                    m_bFindTestWizardPort = IsTestWizardPort(it->c_str());
-                }
-            }
-
-            if ( !m_bFindTestWizardPort )
-                MessageBox(_T("No Test Wizard found"), _T("Prompt"), MB_OK);
-        }
-
-        if ( Global::g_Config.switchPort.size() == 0 || !pSwitcherCombo->SelectItem(Global::g_Config.switchPort.c_str()) )
-        {
-            for (std::vector<TString>::iterator it = m_vtPorts.begin(); it != m_vtPorts.end(); it++) 
-            {
-                if ( !m_bFindSwitcherPort )
-                {
-                    m_bFindSwitcherPort = IsUSBSwitchPort(it->c_str());
-                }
-            }
-
-            if ( !m_bFindSwitcherPort )
-                MessageBox(_T("No USB Switcher found"), _T("Prompt"), MB_OK);
-        }
-    }
-
-    CMDIFrameWndEx::OnTimer(nIDEvent);
+	// TODO: 在此添加消息处理程序代码和/或调用默认值
+	CMFCRibbonBar* pRibbon = GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pInfradeCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_INFRAED_COMBOBOX));
+	CMFCRibbonComboBox* pSwitcherCombo = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_RIBBON_SWITCHER_COMBOBOX));
+	ASSERT_VALID(pInfradeCombo);
+	ASSERT_VALID(pSwitcherCombo);
+
+	if (nIDEvent == 0)
+	{
+		KillTimer(nIDEvent);
+		Global::GetSysSerialPort(m_vtPorts);
+		InitSerialCombobox();
+		if (Global::g_Config.twPort.size() == 0 || !pInfradeCombo->SelectItem(Global::g_Config.twPort.c_str()))
+		{
+			for (std::vector<TString>::iterator it = m_vtPorts.begin(); it != m_vtPorts.end(); it++)
+			{
+				if (!m_bFindTestWizardPort)
+				{
+					m_bFindTestWizardPort = IsTestWizardPort(it->c_str());
+				}
+			}
+
+			if (!m_bFindTestWizardPort)
+				MessageBox(_T("No Test Wizard found"), _T("Prompt"), MB_OK);
+		}
+
+		if (Global::g_Config.switchPort.size() == 0 || !pSwitcherCombo->SelectItem(Global::g_Config.switchPort.c_str()))
+		{
+			for (std::vector<TString>::iterator it = m_vtPorts.begin(); it != m_vtPorts.end(); it++)
+			{
+				if (!m_bFindSwitcherPort)
+				{
+					m_bFindSwitcherPort = IsUSBSwitchPort(it->c_str());
+				}
+			}
+
+			if (!m_bFindSwitcherPort)
+				MessageBox(_T("No USB Switcher found"), _T("Prompt"), MB_OK);
+		}
+	}
+
+	CMDIFrameWndEx::OnTimer(nIDEvent);
 }
 
 BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
 {
-    // TODO: 在此添加专用代码和/或调用基类
-    if (pMsg->message == WM_KEYDOWN)
-    {
-        if (pMsg->wParam == VK_F3)
-        {
-            static BOOL bTopWnd = FALSE;
-            if (bTopWnd == FALSE)
-            {
-                SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);//窗口置顶
-                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("Cancel the front (press F3 to cancel or enable the front window)");
-                SetWindowText(strVersionInfo);
-            }
-
-            bTopWnd = !bTopWnd;
-
-            // 必须退出,否则执行2次;
-            return TRUE;
-        }
-        /* 放子窗口处理;
-        else if (pMsg->wParam == VK_F5)
-        {
-            Global::g_bLearn = !Global::g_bLearn;
-            MessageBox(Global::g_bLearn ? _T("开启学习红外") : _T("关闭红外学习"), _T("提示"), MB_OK);
-            return TRUE;
-        }*/
-    }
-    return CMDIFrameWndEx::PreTranslateMessage(pMsg);
+	// TODO: 在此添加专用代码和/或调用基类
+	if (pMsg->message == WM_KEYDOWN)
+	{
+		if (pMsg->wParam == VK_F3)
+		{
+			static BOOL bTopWnd = FALSE;
+			if (bTopWnd == FALSE)
+			{
+				SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);//窗口置顶
+				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("Cancel the front (press F3 to cancel or enable the front window)");
+				SetWindowText(strVersionInfo);
+			}
+
+			bTopWnd = !bTopWnd;
+
+			// 必须退出,否则执行2次;
+			return TRUE;
+		}
+		/* 放子窗口处理:减少更多数据传递;
+		else if (pMsg->wParam == VK_F5)
+		{
+			Global::g_bLearn = !Global::g_bLearn;
+			MessageBox(Global::g_bLearn ? _T("开启学习红外") : _T("关闭红外学习"), _T("提示"), MB_OK);
+			return TRUE;
+		}*/
+	}
+	return CMDIFrameWndEx::PreTranslateMessage(pMsg);
 }
 
 void CMainFrame::OnClose()
 {
-    // TODO: 在此添加消息处理程序代码和/或调用默认值
-    if ( m_pChildFrame )
-    {
-        CFieldTestToolView *pView = (CFieldTestToolView*)m_pChildFrame->GetActiveView();
-        if ( pView->m_pCamera )
-            delete pView->m_pCamera;
-        pView->m_pCamera = NULL;
-    }
-
-    CMDIFrameWndEx::OnClose();
+	// TODO: 在此添加消息处理程序代码和/或调用默认值
+	if (m_pChildFrame)
+	{
+		CFieldTestToolView* pView = (CFieldTestToolView*)m_pChildFrame->GetActiveView();
+		if (pView->m_pCamera)
+			delete pView->m_pCamera;
+		pView->m_pCamera = NULL;
+	}
+
+	CMDIFrameWndEx::OnClose();
 }

+ 740 - 739
FieldTestTool/FieldTestTool/PropertiesWnd.cpp

@@ -27,47 +27,47 @@
 
 #ifdef _DEBUG
 #undef THIS_FILE
-static char THIS_FILE[]=__FILE__;
+static char THIS_FILE[] = __FILE__;
 #define new DEBUG_NEW
 #endif
 
 unsigned char TwoHexChar2Char(char ch1, char ch2)
 {
-    char Numb1;
-    char Numb2;
+	char Numb1;
+	char Numb2;
 
-    if (ch1 >= 'A')
-        Numb1 = (toupper(ch1) - '0' - 7) * 16;
-    else
-        Numb1 = (ch1 - '0') * 16;
+	if (ch1 >= 'A')
+		Numb1 = (toupper(ch1) - '0' - 7) * 16;
+	else
+		Numb1 = (ch1 - '0') * 16;
 
-    if (ch2 >= 'A')
-        Numb2 = (toupper(ch2) - '0' - 7);
-    else
-        Numb2 = (ch2 - '0');
+	if (ch2 >= 'A')
+		Numb2 = (toupper(ch2) - '0' - 7);
+	else
+		Numb2 = (ch2 - '0');
 
-    return (Numb1 + Numb2);
+	return (Numb1 + Numb2);
 }
 
 COLORREF HexColor2RGB(std::string strHexColor)
 {
-    DWORD r = TwoHexChar2Char(strHexColor[0], strHexColor[1]);
-    DWORD g = TwoHexChar2Char(strHexColor[2], strHexColor[3]);
-    DWORD b = TwoHexChar2Char(strHexColor[4], strHexColor[5]);
+	DWORD r = TwoHexChar2Char(strHexColor[0], strHexColor[1]);
+	DWORD g = TwoHexChar2Char(strHexColor[2], strHexColor[3]);
+	DWORD b = TwoHexChar2Char(strHexColor[4], strHexColor[5]);
 
-    return RGB(r, g, b);
+	return RGB(r, g, b);
 }
 
 std::string RGBColor2Hex(DWORD dwRGB)
 {
-    DWORD r = GetRValue(dwRGB);
-    DWORD g = GetGValue(dwRGB);
-    DWORD b = GetBValue(dwRGB);
+	DWORD r = GetRValue(dwRGB);
+	DWORD g = GetGValue(dwRGB);
+	DWORD b = GetBValue(dwRGB);
 
-    TCHAR szHex[8] = {0};
-    _stprintf_s(szHex, _T("%02X%02X%02X"), r, g, b);
+	TCHAR szHex[8] = { 0 };
+	_stprintf_s(szHex, _T("%02X%02X%02X"), r, g, b);
 
-    return std::string(szHex);
+	return std::string(szHex);
 }
 
 /////////////////////////////////////////////////////////////////////////////
@@ -75,7 +75,7 @@ std::string RGBColor2Hex(DWORD dwRGB)
 KeyInfo* CPropertiesWnd::m_pKeyInfo = NULL;
 CPropertiesWnd::CPropertiesWnd()
 {
-    m_dwThreadId = 0;
+	m_dwThreadId = 0;
 }
 
 CPropertiesWnd::~CPropertiesWnd()
@@ -83,17 +83,17 @@ CPropertiesWnd::~CPropertiesWnd()
 }
 
 BEGIN_MESSAGE_MAP(CPropertiesWnd, CDockablePane)
-    ON_WM_CREATE()
-    ON_WM_SIZE()
-    ON_WM_SETFOCUS()
-    ON_WM_SETTINGCHANGE()
-    ON_WM_PAINT()
-    // 信号按钮;
-    ON_COMMAND_RANGE(BTNID, BTNID + 100, OnSignalBtnClick)
-    ON_UPDATE_COMMAND_UI_RANGE(BTNID, BTNID + 100, OnUpdateSignalBtnClick)
-    // 下拉框事件;
-    ON_CBN_SELCHANGE(1, &CPropertiesWnd::OnCbnSelchangeSingals)
-    ON_WM_DESTROY()
+	ON_WM_CREATE()
+	ON_WM_SIZE()
+	ON_WM_SETFOCUS()
+	ON_WM_SETTINGCHANGE()
+	ON_WM_PAINT()
+	// 信号按钮;
+	ON_COMMAND_RANGE(BTNID, BTNID + 100, OnSignalBtnClick)
+	ON_UPDATE_COMMAND_UI_RANGE(BTNID, BTNID + 100, OnUpdateSignalBtnClick)
+	// 下拉框事件;
+	ON_CBN_SELCHANGE(1, &CPropertiesWnd::OnCbnSelchangeSingals)
+	ON_WM_DESTROY()
 END_MESSAGE_MAP()
 
 /////////////////////////////////////////////////////////////////////////////
@@ -101,822 +101,823 @@ END_MESSAGE_MAP()
 
 void CPropertiesWnd::AdjustLayout()
 {
-    if (GetSafeHwnd() == NULL)
-    {
-        return;
-    }
-
-    CRect rectClient;
-    GetClientRect(rectClient);
-
-    m_wndSignalCombo.GetWindowRect(&m_rcCombobox);
-    ScreenToClient(m_rcCombobox);
-
-    int cyCmb = m_rcCombobox.Size().cy;
-    m_wndSignalCombo.SetWindowPos(NULL, rectClient.left, rectClient.top, rectClient.Width(), 200, SWP_NOACTIVATE | SWP_NOZORDER);
-
-    TRACE2(_T("更新后的大小:%d,%d\n"), rectClient.Width(), rectClient.Height());
-
-    int sx = 0, sy = m_rcCombobox.bottom + m_nTopMargin;
-    int i = 0, id = 10000;
-    int nWidth = (rectClient.Width() - 25) / m_nCols;
-    DWORD dwStyle = WS_CHILD | WS_VISIBLE;
-    for (std::vector<KeyInfo>::iterator it = m_vtKeyInfo.begin(); it != m_vtKeyInfo.end(); it++)
-    {
-        if (it->pbtnInfo->pBTN == NULL)
-            continue;
-        if (i != 0 && i % m_nCols == 0)
-        {//换行;
-            sy += it->height + m_nRowSpacing;
-        }
-
-        //sx = m_nLeftMargin + (i % m_nCols) * nWidth + (i % m_nCols + 1) * m_nColSpacing;
-        sx = m_nLeftMargin + (i % m_nCols) * (nWidth + m_nColSpacing);
-        it->pbtnInfo->pBTN->SetWindowPos(NULL, sx, sy, nWidth, it->height, SWP_NOACTIVATE | SWP_NOZORDER);
-        i++;
-    }
+	if (GetSafeHwnd() == NULL)
+	{
+		return;
+	}
+
+	CRect rectClient;
+	GetClientRect(rectClient);
+
+	m_wndSignalCombo.GetWindowRect(&m_rcCombobox);
+	ScreenToClient(m_rcCombobox);
+
+	int cyCmb = m_rcCombobox.Size().cy;
+	m_wndSignalCombo.SetWindowPos(NULL, rectClient.left, rectClient.top, rectClient.Width(), 200, SWP_NOACTIVATE | SWP_NOZORDER);
+
+	TRACE2(_T("更新后的大小:%d,%d\n"), rectClient.Width(), rectClient.Height());
+
+	int sx = 0, sy = m_rcCombobox.bottom + m_nTopMargin;
+	int i = 0, id = 10000;
+	int nWidth = (rectClient.Width() - 25) / m_nCols;
+	DWORD dwStyle = WS_CHILD | WS_VISIBLE;
+	for (std::vector<KeyInfo>::iterator it = m_vtKeyInfo.begin(); it != m_vtKeyInfo.end(); it++)
+	{
+		if (it->pbtnInfo->pBTN == NULL)
+			continue;
+		if (i != 0 && i % m_nCols == 0)
+		{//换行;
+			sy += it->height + m_nRowSpacing;
+		}
+
+		//sx = m_nLeftMargin + (i % m_nCols) * nWidth + (i % m_nCols + 1) * m_nColSpacing;
+		sx = m_nLeftMargin + (i % m_nCols) * (nWidth + m_nColSpacing);
+		it->pbtnInfo->pBTN->SetWindowPos(NULL, sx, sy, nWidth, it->height, SWP_NOACTIVATE | SWP_NOZORDER);
+		i++;
+	}
 }
 
 int CPropertiesWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 {
-    if (CDockablePane::OnCreate(lpCreateStruct) == -1)
-        return -1;
+	if (CDockablePane::OnCreate(lpCreateStruct) == -1)
+		return -1;
 
-    CRect rectDummy;
-    rectDummy.SetRectEmpty();
+	CRect rectDummy;
+	rectDummy.SetRectEmpty();
 
-    // 创建组合:
-    const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_BORDER | CBS_SORT | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
+	// 创建组合:
+	const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_BORDER | CBS_SORT | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
 
-    if (!m_wndSignalCombo.Create(dwViewStyle|WS_VSCROLL | WS_HSCROLL, rectDummy, this, 1))
-    {
-        TRACE0("未能创建属性组合 \n");
-        return -1;      // 未能创建
-    }
+	if (!m_wndSignalCombo.Create(dwViewStyle | WS_VSCROLL | WS_HSCROLL, rectDummy, this, 1))
+	{
+		TRACE0("未能创建属性组合 \n");
+		return -1;      // 未能创建
+	}
 
 
-    InitPropList();
+	InitPropList();
 
-    // 设置最小窗体;
-    SetMinSize((530, 260));
+	// 设置最小窗体;
+	SetMinSize((530, 260));
 
-    LoadSignals();
-    m_wndSignalCombo.SelectString(0, Global::g_Config.twUseSignal.c_str());
-    m_strXMLPath = Global::g_Config.twSignaldir + _T("\\") + Global::g_Config.twUseSignal + _T(".xml");
-    LoadKeyInfo(m_vtKeyInfo, m_strXMLPath);
+	LoadSignals();
+	m_wndSignalCombo.SelectString(0, Global::g_Config.twUseSignal.c_str());
+	m_strXMLPath = Global::g_Config.twSignaldir + _T("\\") + Global::g_Config.twUseSignal + _T(".xml");
+	LoadKeyInfo(m_vtKeyInfo, m_strXMLPath);
 
-    AdjustLayout();
-    return 0;
+	AdjustLayout();
+	return 0;
 }
 
 void CPropertiesWnd::OnSize(UINT nType, int cx, int cy)
 {
-    CDockablePane::OnSize(nType, cx, cy);
-    AdjustLayout();
+	CDockablePane::OnSize(nType, cx, cy);
+	AdjustLayout();
 }
 
 void CPropertiesWnd::InitPropList()
 {
-    SetPropListFont();
+	SetPropListFont();
 }
 
 void CPropertiesWnd::OnSetFocus(CWnd* pOldWnd)
 {
-    CDockablePane::OnSetFocus(pOldWnd);
+	CDockablePane::OnSetFocus(pOldWnd);
 }
 
 void CPropertiesWnd::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
 {
-    CDockablePane::OnSettingChange(uFlags, lpszSection);
-    SetPropListFont();
+	CDockablePane::OnSettingChange(uFlags, lpszSection);
+	SetPropListFont();
 }
 
 void CPropertiesWnd::OnSignalBtnClick(UINT uId) // 发送遥控信号;
 {
-    CWnd* pWnd = GetFocus();
-    int id = pWnd->GetDlgCtrlID();
-    if (id >= BTNID && id <= BTNID + 100)
-    {
-        CString text;
-        pWnd->GetWindowText(text);
-        KeyInfo *pKey = m_map_key.find(id)->second;
-        // 发送红外信号或学习;
-        Global::g_bLearn ? LearnInfraedSignal(uId, pKey) : SendInfraedSignal(pKey);
-    }
+	CWnd* pWnd = GetFocus();
+	int id = pWnd->GetDlgCtrlID();
+	if (id >= BTNID && id <= BTNID + 100)
+	{
+		CString text;
+		pWnd->GetWindowText(text);
+		KeyInfo* pKey = m_map_key.find(id)->second;
+		// 发送红外信号或学习;
+		Global::g_bLearn ? LearnInfraedSignal(uId, pKey) : SendInfraedSignal(pKey);
+	}
 }
 
 void CPropertiesWnd::OnUpdateSignalBtnClick(CCmdUI* pCmdUI)
 {
-    pCmdUI->Enable(m_map_key.find(pCmdUI->m_nID)->second->bUse);
+	pCmdUI->Enable(m_map_key.find(pCmdUI->m_nID)->second->bUse);
 }
 
 void CPropertiesWnd::OnCbnSelchangeSingals()
 {
-    // TODO: 在此添加控件通知处理程序代码
-    CString strSignal;
-    int nCurSel = m_wndSignalCombo.GetCurSel();
-    if (nCurSel != CB_ERR)
-    {
-        std::string signalpath;
-        m_wndSignalCombo.GetLBText(nCurSel, strSignal);
-
-        // 保存到配置文件中;
-        Global::g_Config.twUseSignal = strSignal.GetString();
-        WritePrivateProfileString("TestWizard", "useSignal", strSignal.GetString(), Global::g_szConfig);
-
-        SetAllBTNUnUsed();
-        m_strXMLPath = Global::g_Config.twSignaldir + _T("\\") + Global::g_Config.twUseSignal + _T(".xml");
-        LoadKeyInfo(m_vtKeyInfo, m_strXMLPath);
-    }
+	// TODO: 在此添加控件通知处理程序代码
+	CString strSignal;
+	int nCurSel = m_wndSignalCombo.GetCurSel();
+	if (nCurSel != CB_ERR)
+	{
+		std::string signalpath;
+		m_wndSignalCombo.GetLBText(nCurSel, strSignal);
+
+		// 保存到配置文件中;
+		Global::g_Config.twUseSignal = strSignal.GetString();
+		WritePrivateProfileString("TestWizard", "useSignal", strSignal.GetString(), Global::g_szConfig);
+
+		SetAllBTNUnUsed();
+		m_strXMLPath = Global::g_Config.twSignaldir + _T("\\") + Global::g_Config.twUseSignal + _T(".xml");
+		LoadKeyInfo(m_vtKeyInfo, m_strXMLPath);
+	}
 }
 
 void CPropertiesWnd::SetPropListFont()
 {
-    ::DeleteObject(m_fntPropList.Detach());
+	::DeleteObject(m_fntPropList.Detach());
 
-    LOGFONT lf;
-    afxGlobalData.fontRegular.GetLogFont(&lf);
+	LOGFONT lf;
+	afxGlobalData.fontRegular.GetLogFont(&lf);
 
-    NONCLIENTMETRICS info;
-    info.cbSize = sizeof(info);
+	NONCLIENTMETRICS info;
+	info.cbSize = sizeof(info);
 
-    afxGlobalData.GetNonClientMetrics(info);
+	afxGlobalData.GetNonClientMetrics(info);
 
-    lf.lfHeight = info.lfMenuFont.lfHeight;
-    lf.lfWeight = info.lfMenuFont.lfWeight;
-    lf.lfItalic = info.lfMenuFont.lfItalic;
+	lf.lfHeight = info.lfMenuFont.lfHeight;
+	lf.lfWeight = info.lfMenuFont.lfWeight;
+	lf.lfItalic = info.lfMenuFont.lfItalic;
 
-    m_fntPropList.CreateFontIndirect(&lf);
+	m_fntPropList.CreateFontIndirect(&lf);
 }
 
 void CPropertiesWnd::LoadSignals()
 {
-    filehelper fh;
-    m_vtTWSignal.clear();
-    fh.getfiles_findout_subfolder(Global::g_Config.twSignaldir.c_str(), _T("*.xml"), &m_vtTWSignal);
+	filehelper fh;
+	m_vtTWSignal.clear();
+	fh.getfiles_findout_subfolder(Global::g_Config.twSignaldir.c_str(), _T("*.xml"), &m_vtTWSignal);
 
-    m_wndSignalCombo.ResetContent();
-    for (std::vector<TString>::iterator it = m_vtTWSignal.begin(); it != m_vtTWSignal.end(); it++ )
-    {
-        m_wndSignalCombo.AddString(fh.getfilename(it->c_str()).c_str());
-    }
+	m_wndSignalCombo.ResetContent();
+	for (std::vector<TString>::iterator it = m_vtTWSignal.begin(); it != m_vtTWSignal.end(); it++)
+	{
+		m_wndSignalCombo.AddString(fh.getfilename(it->c_str()).c_str());
+	}
 
-    //AutoSetDroppedWidth(&m_cbSignals);
+	//AutoSetDroppedWidth(&m_cbSignals);
 }
 
-void CPropertiesWnd::LoadKeyInfo(std::vector<KeyInfo> &vtKeyInfo, TString path)
+void CPropertiesWnd::LoadKeyInfo(std::vector<KeyInfo>& vtKeyInfo, TString path)
 {
-    // 解析xml;
-    tinyxml2::XMLDocument doc;
-    if (tinyxml2::XML_SUCCESS != doc.LoadFile(path.c_str()))
-    {
-        return;
-    }
-
-    vtKeyInfo.clear();
-    std::string data;
-    tinyxml2::XMLElement* pXmlRoot = NULL;
-    if ((pXmlRoot = doc.RootElement()) != NULL)
-    {
-        if (_tcsicmp(pXmlRoot->Value(), "KeyList") == 0)
-        {
-            //////////////////////////////////////////////////////////////////////////
-            // 获取属性;
-            m_curKeyLayout.cols = pXmlRoot->Attribute("cols") ? pXmlRoot->Attribute("cols") : "3";
-            m_curKeyLayout.with = pXmlRoot->Attribute("with") ? pXmlRoot->Attribute("with") : "58";
-            m_curKeyLayout.height = pXmlRoot->Attribute("height") ? pXmlRoot->Attribute("height") : "25";
-            m_curKeyLayout.rowSpacing = pXmlRoot->Attribute("rowSpacing") ? pXmlRoot->Attribute("rowSpacing") : "5";
-            m_curKeyLayout.colSpacing = pXmlRoot->Attribute("colSpacing") ? pXmlRoot->Attribute("colSpacing") : "5";
-            m_curKeyLayout.leftMargin = pXmlRoot->Attribute("leftMargin") ? pXmlRoot->Attribute("leftMargin") : "8";
-            m_curKeyLayout.topMargin = pXmlRoot->Attribute("topMargin") ? pXmlRoot->Attribute("topMargin") : "8";
-            m_curKeyLayout.ver = pXmlRoot->Attribute("ver") ? pXmlRoot->Attribute("ver") : "1.0.0.1";
-            m_curKeyLayout.desc = pXmlRoot->Attribute("desc") ? pXmlRoot->Attribute("desc") : "key info";
-
-            m_nCols = _tstoi(m_curKeyLayout.cols.c_str());
-            m_nRowSpacing = _tstoi(m_curKeyLayout.rowSpacing.c_str());
-            m_nColSpacing = _tstoi(m_curKeyLayout.colSpacing.c_str());
-            m_nTopMargin = _tstoi(m_curKeyLayout.topMargin.c_str());
-            m_nLeftMargin = _tstoi(m_curKeyLayout.leftMargin.c_str());
-            int nWidth = _tstoi(m_curKeyLayout.with.c_str());
-            int nHeight = _tstoi(m_curKeyLayout.height.c_str());
-            //////////////////////////////////////////////////////////////////////////
-
-            // 子项;
-            tinyxml2::XMLElement* pXmlElent = pXmlRoot->FirstChildElement();
-            while (pXmlElent)
-            {
-                if (_tcsicmp(pXmlElent->Value(), _T("ITEM")) == 0)
-                {
-                    KeyInfo keyInfo;
-                    // 获取属性值;
-                    keyInfo.width = pXmlElent->Attribute("with") ? _ttol(pXmlElent->Attribute("with")) : nWidth;
-                    keyInfo.height = pXmlElent->Attribute("height") ? _ttol(pXmlElent->Attribute("height")) : nHeight;
-                    keyInfo.color = HexColor2RGB(pXmlElent->Attribute("color") ? pXmlElent->Attribute("color") : "87CEFA");
-
-                    tinyxml2::XMLElement* pItem = pXmlElent->FirstChildElement();
-                    while (pItem)
-                    {
-                        if (_tcsicmp(pItem->Value(), _T("NAME")) == 0)
-                        {
-                            keyInfo.strName = pItem->GetText();
-                        }
-                        else if (_tcsicmp(pItem->Value(), _T("USE")) == 0)
-                        {
-                            keyInfo.bUse = pItem->BoolText(true);
-                        }
-                        else if (_tcsicmp(pItem->Value(), _T("DESC")) == 0)
-                        {
-                            keyInfo.strDesc = pItem->GetText();
-                        }
-                        else if (_tcsicmp(pItem->Value(), _T("TYPE")) == 0)
-                        {
-                            keyInfo.strType = pItem->GetText();
-                        }
-                        else if (_tcsicmp(pItem->Value(), _T("VALUE")) == 0)
-                        {
-                            keyInfo.strValue = pItem->GetText();
-                        }
-                        else if (_tcsicmp(pItem->Value(), _T("VALUE2")) == 0)
-                        {
-                            keyInfo.strValue2 = pItem->GetText();
-                        }
-                        else if (_tcsicmp(pItem->Value(), _T("VALUE3")) == 0)
-                        {
-                            keyInfo.strValue3 = pItem->GetText();
-                        }
-                        else if (_tcsicmp(pItem->Value(), _T("VALUE4")) == 0)
-                        {
-                            keyInfo.strValue4 = pItem->GetText();
-                        }
-
-                        pItem = pItem->NextSiblingElement();
-                    }
-
-                    keyInfo.pbtnInfo = GetUnUseBTN();
-                    if ( keyInfo.pbtnInfo == NULL)
-                    {
-                        BTNInfo *pbtnInfo = new BTNInfo();
-                        pbtnInfo->pBTN = new CMFCButton();
-                        m_vtBTNInfo.push_back(pbtnInfo);
-
-                        keyInfo.pbtnInfo = pbtnInfo;
-                    }
-                    SetBTNStatus(keyInfo.pbtnInfo, TRUE);
-
-                    vtKeyInfo.push_back(keyInfo);
-                }
-
-                pXmlElent = pXmlElent->NextSiblingElement();
-            }
-        }
-    }
-
-    int sx = 0, sy = m_rcCombobox.bottom + m_nTopMargin;
-    int i = 0, id = 10000;
-    DWORD dwStyle = WS_CHILD | WS_VISIBLE;
-    int maxX = 0, maxY = 0;
-    for (std::vector<KeyInfo>::iterator it = vtKeyInfo.begin(); it != vtKeyInfo.end(); it++)
-    {
-        if (i != 0 && i % m_nCols == 0)
-        {//换行;
-            sy += it->height + m_nRowSpacing;
-        }
-
-        sx = (i % m_nCols) * it->width + (i % m_nCols + 1) * m_nColSpacing;
-        //m_nDefaultWidth = m_nLeftMargin + m_nCols * it->width + m_nCols * m_nColSpacing;
-
-        if ( !it->pbtnInfo->bCreated )
-        {
-            it->pbtnInfo->pBTN->Create(it->strName.c_str(), dwStyle, CRect(sx, sy, sx + it->width, sy + it->height), this, BTNID + i);
-            it->pbtnInfo->bCreated = true;
-
-            // 设置透明false以显示背景色
-            it->pbtnInfo->pBTN->m_bTransparent = FALSE;
-            it->pbtnInfo->pBTN->m_bDontUseWinXPTheme = TRUE;
-            // 消除单击时黑色内圈;
-            it->pbtnInfo->pBTN->m_bDrawFocus = FALSE;
-            // 设置按钮扁平样式;
-            it->pbtnInfo->pBTN->m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
-            // 设置鼠标形状;
-            it->pbtnInfo->pBTN->SetMouseCursorHand();
-        }
-        else
-        {
-            it->pbtnInfo->pBTN->SetWindowText(it->strName.c_str());
-        }
-
-        // 设置背景色;
-        it->pbtnInfo->pBTN->SetFaceColor(it->color, TRUE);
-        // 显示窗口;
-        it->pbtnInfo->pBTN->ShowWindow(SW_SHOW);
-        // 是否禁用;
-        it->pbtnInfo->pBTN->EnableWindow(it->bUse);
-
-        // 存入map中;
-        m_map_key.insert(std::pair<UINT, KeyInfo*>(BTNID + i, &*it));
-
-        i++;
-    }
-
-    std::vector<KeyInfo>::iterator it = vtKeyInfo.begin();
-    m_nDefaultHeight = m_rcCombobox.bottom + 15 + (vtKeyInfo.size()/m_nCols + (vtKeyInfo.size()%m_nCols > 0 ? 1 : 0)) * (it->height + m_nRowSpacing);
-    m_nDefaultHeight = m_nDefaultHeight < MINIMUM_WINDOWS_Y ? MINIMUM_WINDOWS_Y : m_nDefaultHeight;
-
-    m_nDefaultWidth = m_nLeftMargin*2 + m_nCols * it->width + m_nCols * m_nColSpacing;
-    m_nDefaultWidth = m_nDefaultWidth < MINIMUM_WINDOWS_X ? MINIMUM_WINDOWS_X : m_nDefaultWidth;
-
-    // 获取标题栏高度;
-    int nCaptionHeight = 39; //GetSystemMetrics(SM_CYCAPTION);不准 GetWindowRect - GetClientRect
-
-    AdjustLayout();
+	// 解析xml;
+	tinyxml2::XMLDocument doc;
+	if (tinyxml2::XML_SUCCESS != doc.LoadFile(path.c_str()))
+	{
+		return;
+	}
+
+	vtKeyInfo.clear();
+	std::string data;
+	tinyxml2::XMLElement* pXmlRoot = NULL;
+	if ((pXmlRoot = doc.RootElement()) != NULL)
+	{
+		if (_tcsicmp(pXmlRoot->Value(), "KeyList") == 0)
+		{
+			//////////////////////////////////////////////////////////////////////////
+			// 获取属性;
+			m_curKeyLayout.cols = pXmlRoot->Attribute("cols") ? pXmlRoot->Attribute("cols") : "3";
+			m_curKeyLayout.with = pXmlRoot->Attribute("with") ? pXmlRoot->Attribute("with") : "58";
+			m_curKeyLayout.height = pXmlRoot->Attribute("height") ? pXmlRoot->Attribute("height") : "25";
+			m_curKeyLayout.rowSpacing = pXmlRoot->Attribute("rowSpacing") ? pXmlRoot->Attribute("rowSpacing") : "5";
+			m_curKeyLayout.colSpacing = pXmlRoot->Attribute("colSpacing") ? pXmlRoot->Attribute("colSpacing") : "5";
+			m_curKeyLayout.leftMargin = pXmlRoot->Attribute("leftMargin") ? pXmlRoot->Attribute("leftMargin") : "8";
+			m_curKeyLayout.topMargin = pXmlRoot->Attribute("topMargin") ? pXmlRoot->Attribute("topMargin") : "8";
+			m_curKeyLayout.ver = pXmlRoot->Attribute("ver") ? pXmlRoot->Attribute("ver") : "1.0.0.1";
+			m_curKeyLayout.desc = pXmlRoot->Attribute("desc") ? pXmlRoot->Attribute("desc") : "key info";
+
+			m_nCols = _tstoi(m_curKeyLayout.cols.c_str());
+			m_nRowSpacing = _tstoi(m_curKeyLayout.rowSpacing.c_str());
+			m_nColSpacing = _tstoi(m_curKeyLayout.colSpacing.c_str());
+			m_nTopMargin = _tstoi(m_curKeyLayout.topMargin.c_str());
+			m_nLeftMargin = _tstoi(m_curKeyLayout.leftMargin.c_str());
+			int nWidth = _tstoi(m_curKeyLayout.with.c_str());
+			int nHeight = _tstoi(m_curKeyLayout.height.c_str());
+			//////////////////////////////////////////////////////////////////////////
+
+			// 子项;
+			tinyxml2::XMLElement* pXmlElent = pXmlRoot->FirstChildElement();
+			while (pXmlElent)
+			{
+				if (_tcsicmp(pXmlElent->Value(), _T("ITEM")) == 0)
+				{
+					KeyInfo keyInfo;
+					// 获取属性值;
+					keyInfo.width = pXmlElent->Attribute("with") ? _ttol(pXmlElent->Attribute("with")) : nWidth;
+					keyInfo.height = pXmlElent->Attribute("height") ? _ttol(pXmlElent->Attribute("height")) : nHeight;
+					keyInfo.color = HexColor2RGB(pXmlElent->Attribute("color") ? pXmlElent->Attribute("color") : "87CEFA");
+
+					tinyxml2::XMLElement* pItem = pXmlElent->FirstChildElement();
+					while (pItem)
+					{
+						if (_tcsicmp(pItem->Value(), _T("NAME")) == 0)
+						{
+							keyInfo.strName = pItem->GetText();
+						}
+						else if (_tcsicmp(pItem->Value(), _T("USE")) == 0)
+						{
+							keyInfo.bUse = pItem->BoolText(true);
+						}
+						else if (_tcsicmp(pItem->Value(), _T("DESC")) == 0)
+						{
+							keyInfo.strDesc = pItem->GetText();
+						}
+						else if (_tcsicmp(pItem->Value(), _T("TYPE")) == 0)
+						{
+							keyInfo.strType = pItem->GetText();
+						}
+						else if (_tcsicmp(pItem->Value(), _T("VALUE")) == 0)
+						{
+							keyInfo.strValue = pItem->GetText();
+						}
+						else if (_tcsicmp(pItem->Value(), _T("VALUE2")) == 0)
+						{
+							keyInfo.strValue2 = pItem->GetText();
+						}
+						else if (_tcsicmp(pItem->Value(), _T("VALUE3")) == 0)
+						{
+							keyInfo.strValue3 = pItem->GetText();
+						}
+						else if (_tcsicmp(pItem->Value(), _T("VALUE4")) == 0)
+						{
+							keyInfo.strValue4 = pItem->GetText();
+						}
+
+						pItem = pItem->NextSiblingElement();
+					}
+
+					keyInfo.pbtnInfo = GetUnUseBTN();
+					if (keyInfo.pbtnInfo == NULL)
+					{
+						BTNInfo* pbtnInfo = new BTNInfo();
+						pbtnInfo->pBTN = new CMFCButton();
+						m_vtBTNInfo.push_back(pbtnInfo);
+
+						keyInfo.pbtnInfo = pbtnInfo;
+					}
+					SetBTNStatus(keyInfo.pbtnInfo, TRUE);
+
+					vtKeyInfo.push_back(keyInfo);
+				}
+
+				pXmlElent = pXmlElent->NextSiblingElement();
+			}
+		}
+	}
+
+	int sx = 0, sy = m_rcCombobox.bottom + m_nTopMargin;
+	int i = 0, id = 10000;
+	DWORD dwStyle = WS_CHILD | WS_VISIBLE;
+	int maxX = 0, maxY = 0;
+	for (std::vector<KeyInfo>::iterator it = vtKeyInfo.begin(); it != vtKeyInfo.end(); it++)
+	{
+		if (i != 0 && i % m_nCols == 0)
+		{//换行;
+			sy += it->height + m_nRowSpacing;
+		}
+
+		sx = (i % m_nCols) * it->width + (i % m_nCols + 1) * m_nColSpacing;
+		//m_nDefaultWidth = m_nLeftMargin + m_nCols * it->width + m_nCols * m_nColSpacing;
+
+		if (!it->pbtnInfo->bCreated)
+		{
+			it->pbtnInfo->pBTN->Create(it->strName.c_str(), dwStyle, CRect(sx, sy, sx + it->width, sy + it->height), this, BTNID + i);
+			it->pbtnInfo->bCreated = true;
+
+			// 设置透明false以显示背景色
+			it->pbtnInfo->pBTN->m_bTransparent = FALSE;
+			it->pbtnInfo->pBTN->m_bDontUseWinXPTheme = TRUE;
+			// 消除单击时黑色内圈;
+			it->pbtnInfo->pBTN->m_bDrawFocus = FALSE;
+			// 设置按钮扁平样式;
+			it->pbtnInfo->pBTN->m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
+			// 设置鼠标形状;
+			it->pbtnInfo->pBTN->SetMouseCursorHand();
+		}
+		else
+		{
+			it->pbtnInfo->pBTN->SetWindowText(it->strName.c_str());
+		}
+
+		// 设置背景色;
+		it->pbtnInfo->pBTN->SetFaceColor(it->color, TRUE);
+		// 显示窗口;
+		it->pbtnInfo->pBTN->ShowWindow(SW_SHOW);
+		// 是否禁用;
+		it->pbtnInfo->pBTN->EnableWindow(it->bUse);
+
+		// 存入map中;
+		m_map_key.insert(std::pair<UINT, KeyInfo*>(BTNID + i, &*it));
+
+		i++;
+	}
+
+	std::vector<KeyInfo>::iterator it = vtKeyInfo.begin();
+	m_nDefaultHeight = m_rcCombobox.bottom + 15 + (vtKeyInfo.size() / m_nCols + (vtKeyInfo.size() % m_nCols > 0 ? 1 : 0)) * (it->height + m_nRowSpacing);
+	m_nDefaultHeight = m_nDefaultHeight < MINIMUM_WINDOWS_Y ? MINIMUM_WINDOWS_Y : m_nDefaultHeight;
+
+	m_nDefaultWidth = m_nLeftMargin * 2 + m_nCols * it->width + m_nCols * m_nColSpacing;
+	m_nDefaultWidth = m_nDefaultWidth < MINIMUM_WINDOWS_X ? MINIMUM_WINDOWS_X : m_nDefaultWidth;
+
+	// 获取标题栏高度;
+	int nCaptionHeight = 39; //GetSystemMetrics(SM_CYCAPTION);不准 GetWindowRect - GetClientRect
+
+	AdjustLayout();
 }
 
 void CPropertiesWnd::SaveKeyInfo()
 {
-    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"), m_curKeyLayout.cols.c_str());
-        pXmlRoot->SetAttribute(_T("with"), m_curKeyLayout.with.c_str());
-        pXmlRoot->SetAttribute(_T("height"), m_curKeyLayout.height.c_str());
-        pXmlRoot->SetAttribute(_T("rowSpacing"), m_curKeyLayout.rowSpacing.c_str());
-        pXmlRoot->SetAttribute(_T("colSpacing"), m_curKeyLayout.colSpacing.c_str());
-        pXmlRoot->SetAttribute(_T("leftMargin"), m_curKeyLayout.leftMargin.c_str());
-        pXmlRoot->SetAttribute(_T("topMargin"), m_curKeyLayout.topMargin.c_str());
-        pXmlRoot->SetAttribute(_T("ver"), m_curKeyLayout.ver.c_str());
-        pXmlRoot->SetAttribute(_T("desc"), m_curKeyLayout.desc.c_str());
-        doc.InsertEndChild(pXmlRoot);
-
-        for (std::vector<KeyInfo>::iterator it = m_vtKeyInfo.begin(); it != m_vtKeyInfo.end(); it++ )
-        {
-            tinyxml2::XMLElement* pXmlElent = doc.NewElement("ITEM");
-            if ( pXmlElent )
-            {
-                pXmlElent->SetAttribute(_T("color"), RGBColor2Hex(it->color).c_str());
-                // 赋值各元素节点;
-                tinyxml2::XMLElement *pUse = doc.NewElement("USE");
-                pUse->SetText(1);
-                pXmlElent->InsertEndChild(pUse);
-
-                tinyxml2::XMLElement *pName = doc.NewElement("NAME");
-                pName->SetText(it->strName.c_str());
-                pXmlElent->InsertEndChild(pName);
-
-                tinyxml2::XMLElement *pDesc = doc.NewElement("DESC");
-                pDesc->SetText(it->strDesc.c_str());
-                pXmlElent->InsertEndChild(pDesc);
-
-                tinyxml2::XMLElement *pType = doc.NewElement("TYPE");
-                pType->SetText(it->strType.c_str());
-                pXmlElent->InsertEndChild(pType);
-
-                tinyxml2::XMLElement *pValue = doc.NewElement("VALUE");
-                pValue->SetText(it->strValue.c_str());
-                pXmlElent->InsertEndChild(pValue);
-
-                tinyxml2::XMLElement *pValue2 = doc.NewElement("VALUE2");
-                pValue2->SetText(it->strValue2.c_str());
-                pXmlElent->InsertEndChild(pValue2);
-
-                tinyxml2::XMLElement *pValue3 = doc.NewElement("VALUE3");
-                pValue3->SetText(it->strValue3.c_str());
-                pXmlElent->InsertEndChild(pValue3);
-
-                tinyxml2::XMLElement *pValue4 = doc.NewElement("VALUE4");
-                pValue4->SetText(it->strValue4.c_str());
-                pXmlElent->InsertEndChild(pValue4);
-
-                pXmlRoot->InsertEndChild(pXmlElent);
-            }
-        }
-    }
-
-    doc.SaveFile(m_strXMLPath.c_str());
+	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"), m_curKeyLayout.cols.c_str());
+		pXmlRoot->SetAttribute(_T("with"), m_curKeyLayout.with.c_str());
+		pXmlRoot->SetAttribute(_T("height"), m_curKeyLayout.height.c_str());
+		pXmlRoot->SetAttribute(_T("rowSpacing"), m_curKeyLayout.rowSpacing.c_str());
+		pXmlRoot->SetAttribute(_T("colSpacing"), m_curKeyLayout.colSpacing.c_str());
+		pXmlRoot->SetAttribute(_T("leftMargin"), m_curKeyLayout.leftMargin.c_str());
+		pXmlRoot->SetAttribute(_T("topMargin"), m_curKeyLayout.topMargin.c_str());
+		pXmlRoot->SetAttribute(_T("ver"), m_curKeyLayout.ver.c_str());
+		pXmlRoot->SetAttribute(_T("desc"), m_curKeyLayout.desc.c_str());
+		doc.InsertEndChild(pXmlRoot);
+
+		for (std::vector<KeyInfo>::iterator it = m_vtKeyInfo.begin(); it != m_vtKeyInfo.end(); it++)
+		{
+			tinyxml2::XMLElement* pXmlElent = doc.NewElement("ITEM");
+			if (pXmlElent)
+			{
+				pXmlElent->SetAttribute(_T("color"), RGBColor2Hex(it->color).c_str());
+				// 赋值各元素节点;
+				tinyxml2::XMLElement* pUse = doc.NewElement("USE");
+				pUse->SetText(1);
+				pXmlElent->InsertEndChild(pUse);
+
+				tinyxml2::XMLElement* pName = doc.NewElement("NAME");
+				pName->SetText(it->strName.c_str());
+				pXmlElent->InsertEndChild(pName);
+
+				tinyxml2::XMLElement* pDesc = doc.NewElement("DESC");
+				pDesc->SetText(it->strDesc.c_str());
+				pXmlElent->InsertEndChild(pDesc);
+
+				tinyxml2::XMLElement* pType = doc.NewElement("TYPE");
+				pType->SetText(it->strType.c_str());
+				pXmlElent->InsertEndChild(pType);
+
+				tinyxml2::XMLElement* pValue = doc.NewElement("VALUE");
+				pValue->SetText(it->strValue.c_str());
+				pXmlElent->InsertEndChild(pValue);
+
+				tinyxml2::XMLElement* pValue2 = doc.NewElement("VALUE2");
+				pValue2->SetText(it->strValue2.c_str());
+				pXmlElent->InsertEndChild(pValue2);
+
+				tinyxml2::XMLElement* pValue3 = doc.NewElement("VALUE3");
+				pValue3->SetText(it->strValue3.c_str());
+				pXmlElent->InsertEndChild(pValue3);
+
+				tinyxml2::XMLElement* pValue4 = doc.NewElement("VALUE4");
+				pValue4->SetText(it->strValue4.c_str());
+				pXmlElent->InsertEndChild(pValue4);
+
+				pXmlRoot->InsertEndChild(pXmlElent);
+			}
+		}
+	}
+
+	doc.SaveFile(m_strXMLPath.c_str());
 }
 
 void CPropertiesWnd::ConvertOldSignalsToNew(std::string strOldSignal, std::string strNewSignal)
 {
-    typedef struct
-    {
-        std::string name;
-        std::string protocol;
-        std::string key;
-        //std::string color;
-    }OldXML, *pOldXML;
-
-    std::vector<OldXML> vtOldXML;
-    tinyxml2::XMLDocument doc;
-    if (tinyxml2::XML_SUCCESS != doc.LoadFile(strOldSignal.c_str()))
-    {
-        return;
-    }
-
-    tinyxml2::XMLElement* pXmlRoot = NULL;
-    if ((pXmlRoot = doc.RootElement()) != NULL)
-    {
-        if (_tcsicmp(pXmlRoot->Value(), "KeyList") == 0)
-        {
-            // 子项;
-            tinyxml2::XMLElement* pXmlElent = pXmlRoot->FirstChildElement();
-            while (pXmlElent)
-            {
-                if (_tcsicmp(pXmlElent->Value(), _T("ITEM")) == 0)
-                {
-                    OldXML oldxml;
-                    tinyxml2::XMLElement* pItem = pXmlElent->FirstChildElement();
-                    while (pItem)
-                    {
-                        if (_tcsicmp(pItem->Value(), _T("KeyName")) == 0)
-                        {
-                            oldxml.name = pItem->GetText();
-                        }
-                        else if (_tcsicmp(pItem->Value(), _T("KeyType")) == 0)
-                        {
-                            oldxml.protocol = pItem->GetText();
-                        }
-                        else if (_tcsicmp(pItem->Value(), _T("KeyCode")) == 0)
-                        {
-                            oldxml.key = pItem->GetText();
-                        }
-                        else if (_tcsicmp(pItem->Value(), _T("KeyCode")) == 0)
-                        {
-                            oldxml.key = pItem->GetText();
-                        }
-
-                        pItem = pItem->NextSiblingElement();
-                    }
-
-                    vtOldXML.push_back(oldxml);
-                }
-
-                pXmlElent = pXmlElent->NextSiblingElement();
-            }
-        }
-    }
-
-    if ( vtOldXML.size() == 0 )
-        return;
-
-    // 创建新的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);
-
-        for (std::vector<OldXML>::iterator it = vtOldXML.begin(); it != vtOldXML.end(); it++ )
-        {
-            tinyxml2::XMLElement* pXmlElent = doc.NewElement("ITEM");
-            if ( pXmlElent )
-            {
-                pXmlElent->SetAttribute(_T("color"), _T("87CEFA"));
-                // 赋值各元素节点;
-                tinyxml2::XMLElement *pUse = doc.NewElement("USE");
-                pUse->SetText(1);
-                pXmlElent->InsertEndChild(pUse);
-
-                tinyxml2::XMLElement *pName = doc.NewElement("NAME");
-                pName->SetText(it->name.c_str());
-                pXmlElent->InsertEndChild(pName);
-
-                tinyxml2::XMLElement *pDesc = doc.NewElement("DESC");
-                pDesc->SetText(_T(""));
-                pXmlElent->InsertEndChild(pDesc);
-
-                tinyxml2::XMLElement *pType = doc.NewElement("TYPE");
-                pType->SetText(it->protocol.c_str());
-                pXmlElent->InsertEndChild(pType);
-
-                tinyxml2::XMLElement *pValue = doc.NewElement("VALUE");
-                pValue->SetText(it->key.c_str());
-                pXmlElent->InsertEndChild(pValue);
-
-                pXmlRoot->InsertEndChild(pXmlElent);
-            }
-        }
-    }
-
-    doc.SaveFile(strNewSignal.c_str());
+	typedef struct
+	{
+		std::string name;
+		std::string protocol;
+		std::string key;
+		//std::string color;
+	}OldXML, * pOldXML;
+
+	std::vector<OldXML> vtOldXML;
+	tinyxml2::XMLDocument doc;
+	if (tinyxml2::XML_SUCCESS != doc.LoadFile(strOldSignal.c_str()))
+	{
+		return;
+	}
+
+	tinyxml2::XMLElement* pXmlRoot = NULL;
+	if ((pXmlRoot = doc.RootElement()) != NULL)
+	{
+		if (_tcsicmp(pXmlRoot->Value(), "KeyList") == 0)
+		{
+			// 子项;
+			tinyxml2::XMLElement* pXmlElent = pXmlRoot->FirstChildElement();
+			while (pXmlElent)
+			{
+				if (_tcsicmp(pXmlElent->Value(), _T("ITEM")) == 0)
+				{
+					OldXML oldxml;
+					tinyxml2::XMLElement* pItem = pXmlElent->FirstChildElement();
+					while (pItem)
+					{
+						if (_tcsicmp(pItem->Value(), _T("KeyName")) == 0)
+						{
+							oldxml.name = pItem->GetText();
+						}
+						else if (_tcsicmp(pItem->Value(), _T("KeyType")) == 0)
+						{
+							oldxml.protocol = pItem->GetText();
+						}
+						else if (_tcsicmp(pItem->Value(), _T("KeyCode")) == 0)
+						{
+							oldxml.key = pItem->GetText();
+						}
+						else if (_tcsicmp(pItem->Value(), _T("KeyCode")) == 0)
+						{
+							oldxml.key = pItem->GetText();
+						}
+
+						pItem = pItem->NextSiblingElement();
+					}
+
+					vtOldXML.push_back(oldxml);
+				}
+
+				pXmlElent = pXmlElent->NextSiblingElement();
+			}
+		}
+	}
+
+	if (vtOldXML.size() == 0)
+		return;
+
+	// 创建新的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);
+
+		for (std::vector<OldXML>::iterator it = vtOldXML.begin(); it != vtOldXML.end(); it++)
+		{
+			tinyxml2::XMLElement* pXmlElent = doc.NewElement("ITEM");
+			if (pXmlElent)
+			{
+				pXmlElent->SetAttribute(_T("color"), _T("87CEFA"));
+				// 赋值各元素节点;
+				tinyxml2::XMLElement* pUse = doc.NewElement("USE");
+				pUse->SetText(1);
+				pXmlElent->InsertEndChild(pUse);
+
+				tinyxml2::XMLElement* pName = doc.NewElement("NAME");
+				pName->SetText(it->name.c_str());
+				pXmlElent->InsertEndChild(pName);
+
+				tinyxml2::XMLElement* pDesc = doc.NewElement("DESC");
+				pDesc->SetText(_T(""));
+				pXmlElent->InsertEndChild(pDesc);
+
+				tinyxml2::XMLElement* pType = doc.NewElement("TYPE");
+				pType->SetText(it->protocol.c_str());
+				pXmlElent->InsertEndChild(pType);
+
+				tinyxml2::XMLElement* pValue = doc.NewElement("VALUE");
+				pValue->SetText(it->key.c_str());
+				pXmlElent->InsertEndChild(pValue);
+
+				pXmlRoot->InsertEndChild(pXmlElent);
+			}
+		}
+	}
+
+	doc.SaveFile(strNewSignal.c_str());
 }
 
-
-BTNInfo *CPropertiesWnd::GetUnUseBTN()
+BTNInfo* CPropertiesWnd::GetUnUseBTN()
 {
-    for (std::vector<BTNInfo*>::iterator it = m_vtBTNInfo.begin(); it != m_vtBTNInfo.end(); it++ )
-    {
-        if ( !(*it)->bUsed )
-            return *it;
-    }
+	for (std::vector<BTNInfo*>::iterator it = m_vtBTNInfo.begin(); it != m_vtBTNInfo.end(); it++)
+	{
+		if (!(*it)->bUsed)
+			return *it;
+	}
 
-    return NULL;
+	return NULL;
 }
 
-void CPropertiesWnd::SetBTNStatus(BTNInfo *pbtnInfo, BOOL bStatus /* = TRUE */)
+void CPropertiesWnd::SetBTNStatus(BTNInfo* pbtnInfo, BOOL bStatus /* = TRUE */)
 {
-    if ( pbtnInfo )
-    {
-        pbtnInfo->bUsed = bStatus;
-    }
+	if (pbtnInfo)
+	{
+		pbtnInfo->bUsed = bStatus;
+	}
 }
 
 void CPropertiesWnd::SetAllBTNUnUsed()
 {
-    BTNInfo *pbtnInfo = NULL;
-    for (std::vector<BTNInfo*>::iterator it = m_vtBTNInfo.begin(); it != m_vtBTNInfo.end(); it++ )
-    {
-        pbtnInfo = (*it);
-        if ( pbtnInfo )
-        {
-            pbtnInfo->bUsed = false;
-            if ( pbtnInfo->bCreated )
-            {
-                pbtnInfo->pBTN->ShowWindow(SW_HIDE);
-            }
-        }
-    }
+	BTNInfo* pbtnInfo = NULL;
+	for (std::vector<BTNInfo*>::iterator it = m_vtBTNInfo.begin(); it != m_vtBTNInfo.end(); it++)
+	{
+		pbtnInfo = (*it);
+		if (pbtnInfo)
+		{
+			pbtnInfo->bUsed = false;
+			if (pbtnInfo->bCreated)
+			{
+				pbtnInfo->pBTN->ShowWindow(SW_HIDE);
+			}
+		}
+	}
 }
 
 void CPropertiesWnd::ClearAllBTNInfo()
 {
-    BTNInfo *pbtnInfo = NULL;
-    for (std::vector<BTNInfo*>::iterator it = m_vtBTNInfo.begin(); it != m_vtBTNInfo.end(); it++ )
-    {
-        pbtnInfo = (*it);
-        if ( pbtnInfo )
-        {
-            pbtnInfo->pBTN->DestroyWindow();
-            delete pbtnInfo->pBTN;
-            pbtnInfo->pBTN = NULL;
-        }
-
-        delete pbtnInfo;
-        pbtnInfo = NULL;
-    }
-
-    m_vtBTNInfo.clear();
+	BTNInfo* pbtnInfo = NULL;
+	for (std::vector<BTNInfo*>::iterator it = m_vtBTNInfo.begin(); it != m_vtBTNInfo.end(); it++)
+	{
+		pbtnInfo = (*it);
+		if (pbtnInfo)
+		{
+			pbtnInfo->pBTN->DestroyWindow();
+			delete pbtnInfo->pBTN;
+			pbtnInfo->pBTN = NULL;
+		}
+
+		delete pbtnInfo;
+		pbtnInfo = NULL;
+	}
+
+	m_vtBTNInfo.clear();
 }
 
 void CPropertiesWnd::AutoSetDroppedWidth(CComboBox* pCombobox)
 {
-    if (!pCombobox)
-        return;
-    // Find the longest string in the combo box.
-    CString str;
-    CSize sz;
-    int dx = 0;
-
-    TEXTMETRIC tm = { 0 };
-    CDC* pDC = pCombobox->GetDC();
-    CFont* pFont = pCombobox->GetFont();
-
-    // Select the listbox font, save the old font
-    CFont* pOldFont = pDC->SelectObject(pFont);
-
-    // Get the text metrics for avg char width
-    pDC->GetTextMetrics(&tm);
-
-    for (int i = 0; i < pCombobox->GetCount(); i++)
-    {
-        pCombobox->GetLBText(i, str);
-        sz = pDC->GetTextExtent(str);
-
-        // Add the avg width to prevent clipping
-        sz.cx += tm.tmAveCharWidth;
-
-        if (sz.cx > dx)
-            dx = sz.cx;
-    }
-
-    // Select the old font back into the DC
-    pDC->SelectObject(pOldFont);
-    pCombobox->ReleaseDC(pDC);
-
-    // Set the horizontal extent so every character of all strings can
-    // be scrolled to.
-    pCombobox->SetHorizontalExtent(dx);
+	if (!pCombobox)
+		return;
+	// Find the longest string in the combo box.
+	CString str;
+	CSize sz;
+	int dx = 0;
+
+	TEXTMETRIC tm = { 0 };
+	CDC* pDC = pCombobox->GetDC();
+	CFont* pFont = pCombobox->GetFont();
+
+	// Select the listbox font, save the old font
+	CFont* pOldFont = pDC->SelectObject(pFont);
+
+	// Get the text metrics for avg char width
+	pDC->GetTextMetrics(&tm);
+
+	for (int i = 0; i < pCombobox->GetCount(); i++)
+	{
+		pCombobox->GetLBText(i, str);
+		sz = pDC->GetTextExtent(str);
+
+		// Add the avg width to prevent clipping
+		sz.cx += tm.tmAveCharWidth;
+
+		if (sz.cx > dx)
+			dx = sz.cx;
+	}
+
+	// Select the old font back into the DC
+	pDC->SelectObject(pOldFont);
+	pCombobox->ReleaseDC(pDC);
+
+	// Set the horizontal extent so every character of all strings can
+	// be scrolled to.
+	pCombobox->SetHorizontalExtent(dx);
 }
 
-bool CPropertiesWnd::SendInfraedSignal(const KeyInfo *pKey)
+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;
+	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(UINT uId, KeyInfo *pKey)
+void CPropertiesWnd::LearnInfraedSignal(UINT uId, KeyInfo* pKey)
 {
-    m_pKeyInfo = 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) )
-        {
-            // 自动化的红外不返回,如果没有收到任务红外,会等待10多秒后自动结束学习状态;
-            TRACE("发送单信号成功\n");
-        }
-        else
-        {
-            TRACE("发送单信号失败\n");
-        }
-    }
-  
-    if (m_dwThreadId)
-    {
-        PostThreadMessage(m_dwThreadId, TMSG_START_LEARN, uId, 0);
-    }
+	m_pKeyInfo = 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))
+		{
+			// 自动化的红外不返回,如果没有收到任务红外,会等待10多秒后自动结束学习状态;
+			TRACE("发送单信号成功\n");
+		}
+		else
+		{
+			TRACE("发送单信号失败\n");
+		}
+	}
+
+	if (m_dwThreadId)
+	{
+		PostThreadMessage(m_dwThreadId, TMSG_START_LEARN, uId, 0);
+	}
 }
 
 DWORD WINAPI CPropertiesWnd::ThreadLearn(LPVOID lpParam)
 {
-    CPropertiesWnd* pthis = (CPropertiesWnd*)lpParam;
-    CMainFrame* pMainWnd = (CMainFrame*)AfxGetApp()->m_pMainWnd;
-    if (!pthis || !pMainWnd)
-        return 0;
-
-    DWORD dwSendLen = 0;
-    byte szSendData[MAX_SENDDATA] = { 0 };
-    while (Global::g_bLearn)
-    {
-        MSG msg;
-        if (GetMessage(&msg, NULL, 0, 0))
-        {
-            if (msg.message == TMSG_QUITE_THREAD)
-            {
-                pthis->SaveKeyInfo();
-                break;
-            }
-            else if (msg.message == TMSG_START_LEARN )
-            {
-                DWORD dwTickCount = ::GetTickCount64();
-                while (GetTickCount64() - dwTickCount < 60000)
-                {
-                    // 等待学习的红外信号发出;
-                    DWORD dwRealRead = 0;
-                    memset((char*)szSendData, 0, MAX_SENDDATA);
-                    if (dwRealRead = pMainWnd->m_SerialTW.ReadSync(szSendData, MAX_SENDDATA))
-                    {
-                        if (m_pKeyInfo)
-                        {
-                            if (Global::g_nVersion == 1)
-                                m_pKeyInfo->strValue = (TCHAR*)szSendData;
-                            else if (Global::g_nVersion == 2)
-                            {
-                                std::string val = utils::BytesToHexString(szSendData, dwRealRead, ' ');
-                                //if (_tcsncmp("fd fd 30 03 88 99 aa 34 ff ff ff ff ff ff ff ff", val.c_str(), 16))
-                                if ( _tcsncmp("FD FD 30 03 88 99 AA 34 FF FF FF FF FF FF FF FF", val.c_str(), 16) )
-                                {
-                                    m_pKeyInfo->strValue2 = val;
-                                }
-                                else
-                                {
-                                    break;
-                                }
-                            }
-
-                            m_pKeyInfo->pbtnInfo->pBTN->SetFaceColor(RGB(255, 255, 255), TRUE);
-                        }
-
-                        break;
-                    }
-
-                    Sleep(200);
-                }
-            }
-        }
-    }
-
-    OutputDebugString(_T("线程结束"));
-    pthis->m_dwThreadId = 0;
-
-    return 0;
+	CPropertiesWnd* pthis = (CPropertiesWnd*)lpParam;
+	CMainFrame* pMainWnd = (CMainFrame*)AfxGetApp()->m_pMainWnd;
+	if (!pthis || !pMainWnd)
+		return 0;
+
+	DWORD dwSendLen = 0;
+	byte szSendData[MAX_SENDDATA] = { 0 };
+	while (Global::g_bLearn)
+	{
+		MSG msg;
+		if (GetMessage(&msg, NULL, 0, 0))
+		{
+			// 当接收到退出消息,退出线程;
+			if (msg.message == TMSG_QUITE_THREAD)
+			{
+				// 退出并保存学习数据;
+				pthis->SaveKeyInfo();
+				break;
+			}
+			else if (msg.message == TMSG_START_LEARN)
+			{
+				DWORD dwTickCount = ::GetTickCount64();
+				while (GetTickCount64() - dwTickCount < 60000)
+				{
+					// 等待学习的红外信号发出;
+					DWORD dwRealRead = 0;
+					memset((char*)szSendData, 0, MAX_SENDDATA);
+					if (dwRealRead = pMainWnd->m_SerialTW.ReadSync(szSendData, MAX_SENDDATA))
+					{
+						if (m_pKeyInfo)
+						{
+							if (Global::g_nVersion == 1)
+								m_pKeyInfo->strValue = (TCHAR*)szSendData;
+							else if (Global::g_nVersion == 2)
+							{
+								std::string val = utils::BytesToHexString(szSendData, dwRealRead, ' ');
+								// 超时没有学习,该设备会自动返回数据,其中开头16字节如下.
+								//if (_tcsncmp("fd fd 30 03 88 99 aa 34 ff ff ff ff ff ff ff ff", val.c_str(), 16))
+								if (_tcsncmp("FD FD 30 03 88 99 AA 34 FF FF FF FF FF FF FF FF", val.c_str(), 16))
+								{
+									m_pKeyInfo->strValue2 = val;
+								}
+								else
+								{
+									break;
+								}
+							}
+
+							// 学习成功的,将按钮颜色改成白色以区分未学习的.
+							m_pKeyInfo->pbtnInfo->pBTN->SetFaceColor(RGB(255, 255, 255), TRUE);
+						}
+
+						break;
+					}
+
+					Sleep(200);
+				}
+			}
+		}
+	}
+
+	OutputDebugString(_T("线程结束"));
+	pthis->m_dwThreadId = 0;
+
+	return 0;
 }
 
 // 如果CDockablePane无控件,改变大小时背景会刷新失败;
 // 所以要重载onpaint;
 void CPropertiesWnd::OnPaint()
 {
-    CPaintDC dc(this); // device context for painting
-    // TODO: 在此处添加消息处理程序代码
-    // 不为绘图消息调用 CDockablePane::OnPaint()
-    CRect rc;
-    GetClientRect(rc);
-    CBrush   brush;
-    // 获取office风格主题颜色;
+	CPaintDC dc(this); // device context for painting
+	// TODO: 在此处添加消息处理程序代码
+	// 不为绘图消息调用 CDockablePane::OnPaint()
+	CRect rc;
+	GetClientRect(rc);
+	CBrush   brush;
+	// 获取office风格主题颜色;
 #if _MSC_VER <=1500
-    // CMFCVisualManagerOffice2007继承于CMFCVisualManager,使用CMFCVisualManager的GetInstance获取父对象指针后转换为CMFCVisualManagerOffice2007对象指针;
-    brush.CreateSolidBrush(((CMFCVisualManagerOffice2007*)CMFCVisualManagerOffice2007::GetInstance())->GetRibbonEditBackgroundColor(FALSE,FALSE));
+	// CMFCVisualManagerOffice2007继承于CMFCVisualManager,使用CMFCVisualManager的GetInstance获取父对象指针后转换为CMFCVisualManagerOffice2007对象指针;
+	brush.CreateSolidBrush(((CMFCVisualManagerOffice2007*)CMFCVisualManagerOffice2007::GetInstance())->GetRibbonEditBackgroundColor(FALSE, FALSE));
 #else // VS2010之后,方法有变化;
-    CMainFrame *pMainFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
-    brush.CreateSolidBrush(((CMFCVisualManagerOffice2007*)CMFCVisualManagerOffice2007::GetInstance())->GetRibbonEditBackgroundColor((CMFCRibbonRichEditCtrl*)pMainFrame->GetRibbonStatusBar(), FALSE, FALSE, FALSE));
+	CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
+	brush.CreateSolidBrush(((CMFCVisualManagerOffice2007*)CMFCVisualManagerOffice2007::GetInstance())->GetRibbonEditBackgroundColor((CMFCRibbonRichEditCtrl*)pMainFrame->GetRibbonStatusBar(), FALSE, FALSE, FALSE));
 #endif
-    dc.FillRect(&rc, &brush);
+	dc.FillRect(&rc, &brush);
 }
 
-
 void CPropertiesWnd::OnDestroy()
 {
-    CDockablePane::OnDestroy();
+	CDockablePane::OnDestroy();
 
-    // TODO: 在此处添加消息处理程序代码
-    ClearAllBTNInfo();
+	// TODO: 在此处添加消息处理程序代码
+	ClearAllBTNInfo();
 }
 
-
 BOOL CPropertiesWnd::PreTranslateMessage(MSG* pMsg)
 {
-    // TODO: 在此添加专用代码和/或调用基类
-    if (pMsg->message == WM_KEYDOWN)
-    {
-        if (pMsg->wParam == VK_F5)
-        {
-            Global::g_bLearn = !Global::g_bLearn;
-            if (m_dwThreadId == 0 && Global::g_bLearn)
-                CreateThread(NULL, 0, ThreadLearn, this, 0, &m_dwThreadId);
-
-            // 关闭线程;
-            if (!Global::g_bLearn)
-                PostThreadMessage(m_dwThreadId, TMSG_QUITE_THREAD, 0, 0);
-
-            MessageBox(Global::g_bLearn ? _T("开启学习红外") : _T("关闭红外学习"), _T("提示"), MB_OK);
-
-            return TRUE;
-        }
-    }
-    return CDockablePane::PreTranslateMessage(pMsg);
+	// TODO: 在此添加专用代码和/或调用基类
+	if (pMsg->message == WM_KEYDOWN)
+	{
+		if (pMsg->wParam == VK_F5)
+		{
+			Global::g_bLearn = !Global::g_bLearn;
+			if (m_dwThreadId == 0 && Global::g_bLearn)
+				CreateThread(NULL, 0, ThreadLearn, this, 0, &m_dwThreadId);
+
+			// 关闭线程;
+			if (!Global::g_bLearn)
+				PostThreadMessage(m_dwThreadId, TMSG_QUITE_THREAD, 0, 0);
+
+			MessageBox(Global::g_bLearn ? _T("开启学习红外") : _T("关闭红外学习"), _T("提示"), MB_OK);
+
+			return TRUE;
+		}
+	}
+	return CDockablePane::PreTranslateMessage(pMsg);
 }