浏览代码

1、Combobox根据文本宽度自动设置下拉宽度;
2、设备界面完善90%

scbc.sat2 5 年之前
父节点
当前提交
a13dc169db

+ 190 - 0
SATHelper/SATHelper/DeviceView.cpp

@@ -26,11 +26,16 @@ CDeviceView::~CDeviceView()
 void CDeviceView::DoDataExchange(CDataExchange* pDX)
 {
 	CFormView::DoDataExchange(pDX);
+	DDX_Control(pDX, IDC_COMBO1, m_cb_chroma1);
+	DDX_Control(pDX, IDC_COMBO2, m_cb_chroma2);
+	DDX_Control(pDX, IDC_CHECK1, m_ck_chroma1);
+	DDX_Control(pDX, IDC_CHECK2, m_ck_chroma2);
 }
 
 BEGIN_MESSAGE_MAP(CDeviceView, CFormView)
 	ON_WM_PAINT()
 	ON_WM_CTLCOLOR()
+	ON_WM_DEVICECHANGE()
 	ON_COMMAND(ID_CHECK_FULL_CUT, &CDeviceView::OnCheckFullCut)
 	ON_COMMAND(BTN_HAD_SOUND, &CDeviceView::OnHadSound)
 	ON_COMMAND(ID_COMBOX_OCR, &CDeviceView::OnComboxOcr)
@@ -43,6 +48,12 @@ BEGIN_MESSAGE_MAP(CDeviceView, CFormView)
 	ON_COMMAND(BTN_DEF_SOUND, &CDeviceView::OnDefSound)
 	ON_COMMAND(ID_COMBO_PRODUCT, &CDeviceView::OnComboProduct)
 	ON_COMMAND(ID_COMBO_UI, &CDeviceView::OnComboUi)
+	ON_BN_CLICKED(IDC_BUTTON1, &CDeviceView::OnBnClickedButton1)
+	ON_BN_CLICKED(IDC_BUTTON2, &CDeviceView::OnBnClickedButton2)
+	ON_BN_CLICKED(IDC_CHECK1, &CDeviceView::OnBnClickedCheck1)
+	ON_BN_CLICKED(IDC_CHECK2, &CDeviceView::OnBnClickedCheck2)
+	ON_CBN_SELCHANGE(IDC_COMBO1, &CDeviceView::OnCbnSelchangeCombo1)
+	ON_CBN_SELCHANGE(IDC_COMBO2, &CDeviceView::OnCbnSelchangeCombo2)
 END_MESSAGE_MAP()
 
 
@@ -143,6 +154,14 @@ void CDeviceView::ReadRsRunCfg(RsRunCfg& rscfg)
 
 	GetPrivateProfileString(_T("MenuTree"), _T("menutreeselectedchannel"), NULL, szValue, MAX_PATH, m_szRsCfgPath);
 	rscfg.menutree_channel = szValue;
+
+	// SATHelper
+	GetPrivateProfileString(_T("SATHelper"), _T("chroma1"), NULL, szValue, MAX_PATH, m_szRsCfgPath);
+	rscfg.chroma1 = szValue;
+
+	GetPrivateProfileString(_T("SATHelper"), _T("chroma2"), NULL, szValue, MAX_PATH, m_szRsCfgPath);
+	rscfg.chroma2 = szValue;
+
 }
 
 void CDeviceView::ReadTreePath()
@@ -183,10 +202,140 @@ void CDeviceView::ReadTreePath()
 	}
 }
 
+void CDeviceView::ParseJson()
+{
+	if ( m_rscfg.chroma1.size() == 0 )
+	{
+		cJSON* pJson = cJSON_Parse(m_rscfg.chroma22293.c_str());
+		if (pJson)
+		{
+			cJSON* pArray = cJSON_GetObjectItem(pJson, "devices");
+			if (pArray)
+			{
+				int nCount = cJSON_GetArraySize(pArray);
+				for ( int i = 0; i < nCount; i++ )
+				{
+					cJSON *pItem = cJSON_GetArrayItem(pArray, i);
+					if ( pItem )
+					{
+						if (i == 0)
+							m_rscfg.chroma1 = cJSON_GetObjectItem(pItem, "port") ? cJSON_GetObjectItem(pItem, "port")->valuestring : _T("");
+						if (i == 1)
+							m_rscfg.chroma2 = cJSON_GetObjectItem(pItem, "port") ? cJSON_GetObjectItem(pItem, "port")->valuestring : _T("");
+					}
+				}
+			}
+		}
+
+		// 保存;
+		WritePrivateProfileString(_T("SATHelper"), _T("chroma1"), m_rscfg.chroma1.c_str(), m_szRsCfgPath);
+		WritePrivateProfileString(_T("SATHelper"), _T("chroma2"), m_rscfg.chroma2.c_str(), m_szRsCfgPath);
+	}	
+}
+
+void CDeviceView::RunDevice()
+{
+	if ( m_rscfg.chroma1.size() )
+	{
+		CDevice* pdev = new CDevice();
+		pdev->m_iBaudrate = 115200;
+		pdev->m_iDatabit = 8;
+		pdev->m_iPort = atoi(m_rscfg.chroma1.substr(3).c_str());
+		pdev->m_iParitybit = 0;
+		pdev->m_iStopbit = 1;
+		pdev->m_iID = 1;
+		pdev->m_strDeviceName = "Chroma22293";
+		pdev->m_iDeviceType = 1;
+		if (pdev->Open())
+		{
+			g_dmap.insert(std::pair<int, CDevice*>(pdev->m_iID, pdev));
+
+		}
+		else
+			delete pdev;
+	}
+	
+	if (m_rscfg.chroma2.size())
+	{
+		CDevice* pdev = new CDevice();
+		pdev->m_iBaudrate = 115200;
+		pdev->m_iDatabit = 8;
+		pdev->m_iPort = atoi(m_rscfg.chroma2.substr(3).c_str());
+		pdev->m_iParitybit = 0;
+		pdev->m_iStopbit = 1;
+		pdev->m_iID = 2;
+		pdev->m_strDeviceName = "Chroma22293";
+		pdev->m_iDeviceType = 1;
+		if (pdev->Open())
+			g_dmap.insert(std::pair<int, CDevice*>(pdev->m_iID, pdev));
+		else
+			delete pdev;
+	}
+}
+
+void CDeviceView::InitCombobox_port()
+{
+	CComboBox* pCommbox1 = ((CComboBox*)GetDlgItem(IDC_COMBO1));
+	CComboBox* pCommbox2 = ((CComboBox*)GetDlgItem(IDC_COMBO2));
+	for (std::vector<std::string>::iterator it = m_vtCOM.begin(); it != m_vtCOM.end(); it++)
+	{
+		if (!IsPortInserted(pCommbox1, it->c_str()))
+			pCommbox1->AddString(it->c_str());
+
+		if (!IsPortInserted(pCommbox2, it->c_str()))
+			pCommbox2->AddString(it->c_str());
+	}
+
+	if ( m_rscfg.chroma1.size())
+		pCommbox1->SelectString(0, m_rscfg.chroma1.c_str());
+	if (m_rscfg.chroma2.size())
+		pCommbox2->SelectString(0, m_rscfg.chroma2.c_str());
+}
+
+BOOL CDeviceView::IsPortInserted(CComboBox* pCommbox, LPCTSTR lpPort)
+{
+	BOOL bInserted = FALSE;
+	CString strCommPort = _T("");
+	int nCount = pCommbox->GetCount();
+	for (int i = 0; i < nCount; i++)
+	{
+		pCommbox->GetLBText(i, strCommPort);
+		if (strCommPort.CompareNoCase(lpPort) == 0)
+		{
+			bInserted = TRUE;
+			break;
+		}
+	}
+
+	return bInserted;
+}
+
+//实现串口热插拔  
+BOOL CDeviceView::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)
+{
+	switch (nEventType)
+	{
+		// 串口拨掉;
+	case DBT_DEVICEREMOVECOMPLETE:
+		break;
+		// 串口插入;
+	case DBT_DEVICEARRIVAL:
+	{
+		Global::GetSysSerialPort(m_vtCOM);
+		InitCombobox_port();
+	}
+		break;
+	default:
+		break;
+	}
+	return TRUE;
+}
+
 void CDeviceView::OnInitialUpdate()
 {
 	CFormView::OnInitialUpdate();
 
+	ParseJson();
 	// Ribbon Combobox添加默认项;
 	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
 	ASSERT_VALID(pRibbon);
@@ -244,6 +393,11 @@ void CDeviceView::OnInitialUpdate()
 		}
 		pStyleCombo->SetEditText(m_rscfg.menutree_style.c_str());
 	}
+
+	// 启动设备;
+	Global::GetSysSerialPort(m_vtCOM);
+	InitCombobox_port();
+	RunDevice();
 }
 
 
@@ -416,3 +570,39 @@ void CDeviceView::OnComboUi()
 		WritePrivateProfileString(_T("MenuTree"), _T("menutreeselectedstyle"), strCurStyle, m_szRsCfgPath);
 	}
 }
+
+
+void CDeviceView::OnBnClickedButton1()
+{
+	// TODO: 在此添加控件通知处理程序代码
+}
+
+
+void CDeviceView::OnBnClickedButton2()
+{
+	// TODO: 在此添加控件通知处理程序代码
+}
+
+
+void CDeviceView::OnBnClickedCheck1()
+{
+	// TODO: 在此添加控件通知处理程序代码
+}
+
+
+void CDeviceView::OnBnClickedCheck2()
+{
+	// TODO: 在此添加控件通知处理程序代码
+}
+
+
+void CDeviceView::OnCbnSelchangeCombo1()
+{
+	// TODO: 在此添加控件通知处理程序代码
+}
+
+
+void CDeviceView::OnCbnSelchangeCombo2()
+{
+	// TODO: 在此添加控件通知处理程序代码
+}

+ 24 - 0
SATHelper/SATHelper/DeviceView.h

@@ -66,6 +66,9 @@ public:
 		std::string menutree_chip;
 		std::string menutree_style;
 		std::string menutree_channel;
+		//...
+		std::string chroma1;
+		std::string chroma2;
 	}RsRunCfg, *pRsRunCfg;
 
 	RsRunCfg m_rscfg;
@@ -76,6 +79,17 @@ public:
 	// 读取menutree目录;
 	std::map<std::string, std::vector<std::string>> m_map_tree;
 	void ReadTreePath();
+
+	// 解析json;
+	void ParseJson();
+
+	// 运行设备;
+	void RunDevice();
+
+	std::vector<std::string> m_vtCOM;
+	void InitCombobox_port();
+	BOOL IsPortInserted(CComboBox* pCommbox, LPCTSTR lpPort);
+	afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD_PTR dwData);
 public:
 	virtual void OnInitialUpdate();
 	virtual void OnDraw(CDC* /*pDC*/);
@@ -93,6 +107,16 @@ public:
 	afx_msg void OnDefSound();
 	afx_msg void OnComboProduct();
 	afx_msg void OnComboUi();
+	CComboBox m_cb_chroma1;
+	CComboBox m_cb_chroma2;
+	CButton m_ck_chroma1;
+	CButton m_ck_chroma2;
+	afx_msg void OnBnClickedButton1();
+	afx_msg void OnBnClickedButton2();
+	afx_msg void OnBnClickedCheck1();
+	afx_msg void OnBnClickedCheck2();
+	afx_msg void OnCbnSelchangeCombo1();
+	afx_msg void OnCbnSelchangeCombo2();
 };
 
 

+ 55 - 0
SATHelper/SATHelper/Global.cpp

@@ -267,6 +267,61 @@ namespace Global
 		return TRUE;
 	}
 
+	// 通过注册表查找系统当前串口信息;
+	BOOL GetSysSerialPort(std::vector<std::string>& vtports)
+	{
+		HKEY hKey;
+		LSTATUS lReg = 0;
+		DWORD dwMaxValLen = 0;
+		DWORD dwValNum = 0;
+		lReg = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_QUERY_VALUE, &hKey);
+		if (lReg != ERROR_SUCCESS)
+		{
+			//LOG4C((LOG_WARN, "Open Registry Error"));
+			return FALSE;
+		}
+
+		lReg = RegQueryInfoKeyA(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwValNum, &dwMaxValLen, NULL, NULL, NULL);
+		if (lReg != ERROR_SUCCESS)
+		{
+			//LOG4C((LOG_WARN, "Getting Key Info Error"));
+			return FALSE;
+		}
+
+		if (vtports.size())
+		{
+			vtports.clear();
+		}
+
+		LPSTR lpValName, lpComNum;
+		DWORD dwValName, dwValSize = 6;
+		for (DWORD i = 0; i < dwValNum; i++)
+		{
+			dwValName = dwMaxValLen + 1;
+			dwValSize = 6;
+			lpValName = (LPSTR)VirtualAlloc(NULL, dwValName, MEM_COMMIT, PAGE_READWRITE);
+			lReg = RegEnumValueA(hKey, i, lpValName, &dwValName, NULL, NULL, NULL, NULL);
+			if ((lReg != ERROR_SUCCESS) && (lReg != ERROR_NO_MORE_ITEMS))
+			{
+				//LOG4C((LOG_WARN, "Enum  Registry  Error or No More Items"));
+				continue;
+			}
+			lpComNum = (LPSTR)VirtualAlloc(NULL, 6, MEM_COMMIT, PAGE_READWRITE);
+			lReg = RegQueryValueExA(hKey, lpValName, NULL, NULL, (LPBYTE)lpComNum, &dwValSize);
+			if (lReg != ERROR_SUCCESS)
+			{
+				//LOG4C((LOG_WARN, "Can not get the name of the port"));
+				continue;
+			}
+
+			vtports.push_back(lpComNum);
+			VirtualFree(lpValName, 0, MEM_RELEASE);
+			VirtualFree(lpComNum, 0, MEM_RELEASE);
+		}
+
+		return TRUE;
+	}
+
 	// 读取配置文件-预留;
 	void GetConfig()
 	{

+ 1 - 0
SATHelper/SATHelper/Global.h

@@ -77,6 +77,7 @@ namespace Global
 	void GetConfig();
 	int ReadReg(char* path, char* key, char* value);
 	BOOL Python27Dir();
+	BOOL GetSysSerialPort(std::vector<std::string>& vtports);
 	void WriteTextLog(const TCHAR* format, ...);
 	BOOL LoadImgFromFile(IN Image** pImg, LPCTSTR lpPath);
 	BOOL LoadImgFromBuffer(IN Image** pImg, IN BYTE* pBuffer, IN CONST INT& nBufLen);

+ 31 - 1
SATHelper/SATHelper/IRControlWnd.cpp

@@ -428,6 +428,8 @@ void CIRControlWnd::LoadSignals()
 			m_wndSignalCombo.AddString(fh.getfilename(it).c_str());
 		}
 	}	
+
+	AutoSetDroppedWidth();
 }
 
 void CIRControlWnd::Loadlayout(std::vector<BtnInfo>& vt)
@@ -589,7 +591,7 @@ void CIRControlWnd::OnCheckBoxClicked()
 			m_wndSignalCombo.AddString(filehelper::getfilename(it).c_str());
 		}
 	}
-	
+	AutoSetDroppedWidth();
 	DisableSignalBtn();
 	ReLoadSignalXml();	
 }
@@ -627,3 +629,31 @@ void CIRControlWnd::UpdateSignalBtnStatus()
 		}
 	}
 }
+
+void CIRControlWnd::AutoSetDroppedWidth()
+{
+	// Set the height of every item so the item
+   // is completely visible.
+	CString str;
+	CSize   sz;
+	int     dx = 0;
+	CDC* pDC = m_wndSignalCombo.GetDC();
+	for (int i = 0; i < m_wndSignalCombo.GetCount(); i++)
+	{
+		m_wndSignalCombo.GetLBText(i, str);
+		sz = pDC->GetTextExtent(str);
+
+		// Only want to set the item height if the current height
+		// is not big enough.
+		if (m_wndSignalCombo.GetItemHeight(i) < sz.cy)
+			m_wndSignalCombo.SetItemHeight(i, sz.cy);
+
+		// Only want to set the item width if the current width
+		// is not big enough.
+		if (m_wndSignalCombo.GetDroppedWidth() < sz.cx)
+		{
+			m_wndSignalCombo.SetDroppedWidth(sz.cx + 50);
+		}
+	}
+	m_wndSignalCombo.ReleaseDC(pDC);
+}

+ 2 - 0
SATHelper/SATHelper/IRControlWnd.h

@@ -125,5 +125,7 @@ public:
 	afx_msg void OnBtnRestartProcClicked();
 	// 更新按钮实际状态;
 	void UpdateSignalBtnStatus();
+	// 自动根据Combobox选项长度设置宽度;
+	void AutoSetDroppedWidth();
 };
 

+ 0 - 13
SATHelper/SATHelper/SATHelper.cpp

@@ -136,19 +136,6 @@ BOOL CSATHelperApp::InitInstance()
 	Global::GetConfig();
 	Global::WriteTextLog("程序启动");
 
-	CDevice* pdev = new CDevice();
-	pdev->m_iBaudrate = 115200;
-	pdev->m_iDatabit = 8;
-	pdev->m_iPort = 3;
-	pdev->m_iParitybit = 0;
-	pdev->m_iStopbit = 1;
-	pdev->m_iID = 1;
-	pdev->m_strDeviceName = "Chroma22293";
-	pdev->m_iDeviceType = 1;
-	pdev->Open();
-
-	g_dmap.insert(std::pair<int, CDevice*>(pdev->m_iID, pdev));
-
 	g_iocp.LoadSocketLib();
 	g_iocp.Start(5566);
 #endif

+ 2 - 2
SATHelper/SATHelper/SATHelper.rc

@@ -447,9 +447,9 @@ FONT 8, "MS Shell Dlg", 400, 0, 0x1
 BEGIN
     GROUPBOX        "设备列表",IDC_STATIC,7,7,299,65
     LTEXT           "信号仪1:",IDC_STATIC,17,26,37,8
-    COMBOBOX        IDC_COMBO1,58,24,60,58,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_COMBO1,58,24,60,58,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
     LTEXT           "信号仪2:",IDC_STATIC,18,41,37,8
-    COMBOBOX        IDC_COMBO2,58,40,60,58,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_COMBO2,58,40,60,58,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
     CONTROL         "启动",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,126,26,32,10
     CONTROL         "启动",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,126,41,32,10
     PUSHBUTTON      "调试",IDC_BUTTON1,159,23,50,14

+ 2 - 0
SATHelper/SATHelper/stdafx.h

@@ -83,4 +83,6 @@ typedef struct __CAPTURE_INFO__
 #include <afxext.h>
 #include <afxext.h>
 
+#include <Dbt.h>	// 设备头文件;
+
 #endif //PCH_H