Kaynağa Gözat

1、CMFCButton使用图标来代替Checkbox;
2、接入dll;

Jeff 5 yıl önce
ebeveyn
işleme
5471e6626b

+ 24 - 57
VideoCapture/VideoCapture/Global.cpp

@@ -15,7 +15,7 @@ namespace Global
 	TCHAR g_szCurModulePath[MAX_PATH] = {0};
 	TCHAR g_szFna[MAX_PATH] = {0};
 	TCHAR g_szConfig[MAX_PATH] = {0};
-	
+	STConfig g_Config;
 	//////////////////////////////////////////////////////////////////////////
 	// 全局函数;
 	/************************************************************************/
@@ -88,62 +88,29 @@ namespace Global
 	// 读取配置文件-预留;
 	void GetConfig()
 	{
-		TCHAR szValue[MAX_PATH] = {0};
-		// config;
-		//g_ini_config.com = GetPrivateProfileInt(_T("config"), _T("COM"), NULL, g_szConfig);
-		//g_ini_config.baudrate = GetPrivateProfileInt(_T("config"), _T("Baudrate"), NULL, g_szConfig);
-		//g_ini_config.chasis = GetPrivateProfileInt(_T("config"), _T("Chasis"), NULL, g_szConfig);
-		//g_ini_config.mode = GetPrivateProfileInt(_T("config"), _T("ModeSelect"), NULL, g_szConfig);
-		//g_ini_config.warncount = GetPrivateProfileInt(_T("config"), _T("WarnCount"), NULL, g_szConfig);
-
-		//GetPrivateProfileString(_T("config"), _T("ChasisList"), NULL, szValue, MAX_PATH, g_szConfig);
-		//g_ini_config.chasislist =  szValue;
-		//memset(szValue, 0, MAX_PATH);
-
-		//GetPrivateProfileString(_T("config"), _T("SiacpCmdFile"), NULL, szValue, MAX_PATH, g_szConfig);
-		//g_ini_config.siacpcmdfile =  szValue;
-		//memset(szValue, 0, MAX_PATH);
-
-		//GetPrivateProfileString(_T("config"), _T("Server_url"), NULL, szValue, MAX_PATH, g_szConfig);
-		//g_ini_config.serverurl =  szValue;
-		//memset(szValue, 0, MAX_PATH);
-
-		//// folder;
-		//GetPrivateProfileString(_T("filefolder"), _T("DIDFolder"), NULL, szValue, MAX_PATH, g_szConfig);
-		//g_ini_folder.DIDFolder =  szValue;
-		//memset(szValue, 0, MAX_PATH);
-
-		//GetPrivateProfileString(_T("filefolder"), _T("MACFolder"), NULL, szValue, MAX_PATH, g_szConfig);
-		//g_ini_folder.MACFolder =  szValue;
-		//memset(szValue, 0, MAX_PATH);
-
-		//GetPrivateProfileString(_T("filefolder"), _T("KEYFolder"), NULL, szValue, MAX_PATH, g_szConfig);
-		//g_ini_folder.KEYFolder =  szValue;
-		//memset(szValue, 0, MAX_PATH);
-
-		//GetPrivateProfileString(_T("filefolder"), _T("ESNFolder"), NULL, szValue, MAX_PATH, g_szConfig);
-		//g_ini_folder.ESNFolder =  szValue;
-		//memset(szValue, 0, MAX_PATH);
-
-		//GetPrivateProfileString(_T("filefolder"), _T("WiDiFolder"), NULL, szValue, MAX_PATH, g_szConfig);
-		//g_ini_folder.WiDiFolder =  szValue;
-		//memset(szValue, 0, MAX_PATH);
-
-		//GetPrivateProfileString(_T("filefolder"), _T("WidevineFolder"), NULL, szValue, MAX_PATH, g_szConfig);
-		//g_ini_folder.WidevineFolder =  szValue;
-		//memset(szValue, 0, MAX_PATH);
-
-		//GetPrivateProfileString(_T("filefolder"), _T("HDCPKEY22Folder"), NULL, szValue, MAX_PATH, g_szConfig);
-		//g_ini_folder.HDCPKEY22Folder =  szValue;
-		//memset(szValue, 0, MAX_PATH);
-
-		//GetPrivateProfileString(_T("filefolder"), _T("CIKeyFolder"), NULL, szValue, MAX_PATH, g_szConfig);
-		//g_ini_folder.CIKeyFolder =  szValue;
-		//memset(szValue, 0, MAX_PATH);
-
-		//GetPrivateProfileString(_T("filefolder"), _T("WBFolder"), NULL, szValue, MAX_PATH, g_szConfig);
-		//g_ini_folder.WBFolder =  szValue;
-		//memset(szValue, 0, MAX_PATH);
+		TCHAR szConfigpath[MAX_PATH] = { 0 };
+		_stprintf_s(szConfigpath, _T("%sConfig.ini"), Global::g_szCurModuleDir);
+
+		TCHAR szValue[MAX_PATH] = { 0 };
+		// 读取配置内容;
+		g_Config.usetype = GetPrivateProfileInt(_T("ir-device"), _T("use-rat"), 0, szConfigpath);
+		g_Config.bGenerics = GetPrivateProfileInt(_T("ir-device"), _T("generics"), 0, szConfigpath);
+
+		GetPrivateProfileString(_T("ir-device"), _T("redrat3"), NULL, szValue, MAX_PATH, szConfigpath);
+		g_Config.redrat3path = szValue;
+		memset(szValue, 0, MAX_PATH);
+
+		GetPrivateProfileString(_T("ir-device"), _T("redrat4"), NULL, szValue, MAX_PATH, szConfigpath);
+		g_Config.redrat4path = szValue;
+		memset(szValue, 0, MAX_PATH);
+
+		GetPrivateProfileString(_T("ir-device"), _T("signal"), NULL, szValue, MAX_PATH, szConfigpath);
+		g_Config.signaldir = szValue;
+		memset(szValue, 0, MAX_PATH);
+
+		GetPrivateProfileString(_T("ir-device"), _T("use-signal"), NULL, szValue, MAX_PATH, szConfigpath);
+		g_Config.use_signal = szValue;
+		memset(szValue, 0, MAX_PATH);
 
 	}
 	

+ 12 - 2
VideoCapture/VideoCapture/Global.h

@@ -23,14 +23,24 @@ typedef wstring TString;
 
 namespace Global
 {
+	typedef struct __ST_CONFIG__
+	{
+		int usetype;
+		std::string redrat3path;
+		std::string redrat4path;
+		bool bGenerics;
+		std::string signaldir;
+		std::string use_signal;
+	}STConfig, * pSTConfig;
+
 	//////////////////////////////////////////////////////////////////////////
 	// È«¾Ö±äÁ¿;
 	extern TCHAR g_szCurModuleDir[MAX_PATH];
 	extern TCHAR g_szCurModulePath[MAX_PATH];
 	extern TCHAR g_szFna[MAX_PATH];
 	extern TCHAR g_szConfig[MAX_PATH];
-
-
+	extern STConfig g_Config;
+	
 	//////////////////////////////////////////////////////////////////////////
 	// È«¾Öº¯Êý;
 	void GetConfig();

+ 279 - 26
VideoCapture/VideoCapture/IRControlWnd.cpp

@@ -19,10 +19,138 @@
 
 #ifdef _DEBUG
 #undef THIS_FILE
-static char THIS_FILE[]=__FILE__;
+static char THIS_FILE[] = __FILE__;
 #define new DEBUG_NEW
 #endif
 
+//////////////////////////////////////////////////////////////////////////
+// dll相关;
+HMODULE g_hdll = NULL;
+irc_IsAppRunning g_IsAppRunning = NULL;
+irc_StartIRApp g_StartIRApp = NULL;
+irc_CloseApp g_CloseApp = NULL;
+irc_Connect g_Connect = NULL;
+irc_loadSignalDataSet g_loadSignalDataSet = NULL;
+irc_getDeviceNames g_getDeviceNames = NULL;
+irc_getSignalsName g_getSignalsName = NULL;
+irc_sendSignal g_sendSignal = NULL;
+irc_sendSignals g_sendSignals = NULL;
+irc_sendRepeatsSignal g_sendRepeatsSignal = NULL;
+int g_nIRControl = 0;
+
+BOOL LoadLogLibarary()
+{
+	if (g_hdll == NULL)
+	{
+		g_hdll = (HMODULE)LoadLibrary(_T("IRControl.dll"));
+		if (!g_hdll)
+			return FALSE;
+	}
+
+	g_sendRepeatsSignal = (irc_sendRepeatsSignal)GetProcAddress(g_hdll, "sendRepeatsSignal");
+	if (!g_sendRepeatsSignal)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_sendSignals = (irc_sendSignals)GetProcAddress(g_hdll, "sendSignals");
+	if (!g_sendSignals)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_sendSignal = (irc_sendSignal)GetProcAddress(g_hdll, "sendSignal");
+	if (!g_sendSignal)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_loadSignalDataSet = (irc_loadSignalDataSet)GetProcAddress(g_hdll, "loadSignalDataSet");
+	if (!g_loadSignalDataSet)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_IsAppRunning = (irc_IsAppRunning)GetProcAddress(g_hdll, "IsAppRunning");
+	if (!g_IsAppRunning)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_StartIRApp = (irc_StartIRApp)GetProcAddress(g_hdll, "StartIRApp");
+	if (!g_StartIRApp)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_CloseApp = (irc_CloseApp)GetProcAddress(g_hdll, "CloseApp");
+	if (!g_CloseApp)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_getDeviceNames = (irc_getDeviceNames)GetProcAddress(g_hdll, "getDeviceNames");
+	if (!g_getDeviceNames)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_Connect = (irc_Connect)GetProcAddress(g_hdll, "Connect");
+	if (!g_Connect)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_getSignalsName = (irc_getSignalsName)GetProcAddress(g_hdll, "getSignalsName");
+	if (!g_getSignalsName)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	// 导出全局变量;
+	g_nIRControl = *(int*)GetProcAddress(g_hdll, "nIRControl");
+	if (!g_CloseApp)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+
+	return TRUE;
+}
+
+void FreeLogLibarary()
+{
+	if (g_hdll)
+	{
+		if (FreeLibrary(g_hdll))
+		{
+			g_hdll = NULL;
+			g_IsAppRunning = NULL;
+			g_StartIRApp = NULL;
+			g_CloseApp = NULL;
+			g_Connect = NULL;
+			g_getDeviceNames = NULL;
+			g_getSignalsName = NULL;
+			g_loadSignalDataSet = NULL;
+			g_sendSignal = NULL;
+			g_sendSignals = NULL;
+			g_sendRepeatsSignal = NULL;
+		}
+	}
+}
+//////////////////////////////////////////////////////////////////////////
+
 /////////////////////////////////////////////////////////////////////////////
 // CResourceViewBar
 
@@ -60,14 +188,25 @@ CIRControlWnd::CIRControlWnd() noexcept
 
 CIRControlWnd::~CIRControlWnd()
 {
-	for (std::vector<BtnInfo>::iterator it = m_vtBtnInfo.begin(); it != m_vtBtnInfo.end(); it++ )
+	FreeLogLibarary();
+
+	for (std::vector<BtnInfo>::iterator it = m_vtBtnInfo.begin(); it != m_vtBtnInfo.end(); it++)
 	{
 		if (it->pBTN)
-			delete it->pBTN;
+			it->pBTN->DestroyWindow();
 		it->pBTN = NULL;
 	}
+
+	m_vtBtnInfo.clear();
 }
 
+// 下拉框控件id;
+#define ID_COMBOBOX_DEVICE_TYPE 1
+// 复制框控件id;
+#define ID_CHECKBOX_SIGNAL_TYPE 2
+// 下拉框控件id;
+#define ID_COMBOBOX_SIGNAL_FILE 3
+
 BEGIN_MESSAGE_MAP(CIRControlWnd, CDockablePane)
 	ON_WM_CREATE()
 	ON_WM_SIZE()
@@ -83,8 +222,9 @@ BEGIN_MESSAGE_MAP(CIRControlWnd, CDockablePane)
 	ON_WM_SETTINGCHANGE()
 	ON_WM_PAINT()
 	ON_COMMAND_RANGE(BTNID, BTNID + 100, OnBtnClick)
-	ON_UPDATE_COMMAND_UI_RANGE(BTNID, BTNID+100, OnBtnUpdate)
-	ON_UPDATE_COMMAND_UI(2, OnUpdateCheckBox)
+	ON_UPDATE_COMMAND_UI_RANGE(BTNID, BTNID + 100, OnBtnUpdate)
+	ON_UPDATE_COMMAND_UI(ID_CHECKBOX_SIGNAL_TYPE, OnUpdateCheckBox)
+	ON_CBN_SELCHANGE(ID_COMBOBOX_DEVICE_TYPE, &CIRControlWnd::OnCbnSelchangeDeivceType)
 END_MESSAGE_MAP()
 
 /////////////////////////////////////////////////////////////////////////////
@@ -92,7 +232,7 @@ END_MESSAGE_MAP()
 
 void CIRControlWnd::AdjustLayout()
 {
-	if (GetSafeHwnd () == nullptr || (AfxGetMainWnd() != nullptr && AfxGetMainWnd()->IsIconic()))
+	if (GetSafeHwnd() == nullptr || (AfxGetMainWnd() != nullptr && AfxGetMainWnd()->IsIconic()))
 	{
 		return;
 	}
@@ -100,8 +240,8 @@ void CIRControlWnd::AdjustLayout()
 	CRect rectClient;
 	GetClientRect(rectClient);
 
-	m_wndObjectCombo.SetWindowPos(nullptr, rectClient.left, rectClient.top + 5, rectClient.Width() - 300, m_nComboHeight + 210, SWP_NOACTIVATE | SWP_NOZORDER);
-	m_wndSignalCheck.SetWindowPos(nullptr, rectClient.left + 125, rectClient.top + 5, rectClient.Width()-250, m_nComboHeight, SWP_NOACTIVATE | SWP_NOZORDER);
+	m_wndObjectCombo.SetWindowPos(nullptr, rectClient.left, rectClient.top + 5, 120, m_nComboHeight + 210, SWP_NOACTIVATE | SWP_NOZORDER);
+	m_wndSignalCheck.SetWindowPos(nullptr, rectClient.left + 125, rectClient.top + 5, 150, m_nComboHeight, SWP_NOACTIVATE | SWP_NOZORDER);
 	m_wndSignalCombo.SetWindowPos(nullptr, rectClient.left, rectClient.top + m_nComboHeight + 10, rectClient.Width(), m_nComboHeight + 210, SWP_NOACTIVATE | SWP_NOZORDER);
 #if __PANE_DLG__
 	m_dlgIRControl.SetWindowPos(nullptr, rectClient.left, rectClient.top + m_nComboHeight, rectClient.Width(), rectClient.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
@@ -119,34 +259,36 @@ int CIRControlWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 	// 创建组合: 
 	const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_BORDER | CBS_SORT | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
 
-	if (!m_wndObjectCombo.Create(dwViewStyle, rectDummy, this, 1))
+	if (!m_wndObjectCombo.Create(dwViewStyle, rectDummy, this, ID_COMBOBOX_DEVICE_TYPE))
 	{
 		TRACE0("未能创建遥控器组合 \n");
 		return -1;      // 未能创建
 	}
 
-	if (!m_wndSignalCheck.Create(_T("通用遥控器选择"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX , rectDummy, this, 2))
+	if (!m_wndSignalCheck.Create(_T("通用遥控器选择"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, rectDummy, this, ID_CHECKBOX_SIGNAL_TYPE))
 	{
 		TRACE0("未能创建信号集下拉框 \n");
 		return -1;      // 未能创建
 	}
-	m_wndSignalCheck.SetCheck(BST_CHECKED);
-	//m_wndSignalCheck.m_bDontUseWinXPTheme = TRUE;
-
-	if ( !m_wndSignalCombo.Create(dwViewStyle, rectDummy, this, 3))
+	m_wndSignalCheck.SetCheck(Global::g_Config.bGenerics ? BST_CHECKED : BST_UNCHECKED);
+	m_wndSignalCheck.m_bHighlightChecked = TRUE;
+	// CMFCButton只能用图标来显示check;
+	m_wndSignalCheck.SetImage(IDB_UNCHECKED);
+	m_wndSignalCheck.SetCheckedImage(IDB_CHECKED);
+	m_wndSignalCheck.m_bTransparent = FALSE;
+	m_wndSignalCheck.m_bDrawFocus = FALSE;
+	m_wndSignalCheck.m_nFlatStyle = CMFCButton::BUTTONSTYLE_FLAT;
+	m_wndSignalCheck.SizeToContent();
+
+	if (!m_wndSignalCombo.Create(dwViewStyle, rectDummy, this, ID_COMBOBOX_SIGNAL_FILE))
 	{
 		TRACE0("未能创建信号集下拉框 \n");
 		return -1;      // 未能创建
 	}
 
-#ifdef _DEBUG
-	m_wndSignalCombo.AddString(_T("红老鼠 3.0"));
-	m_wndSignalCombo.AddString(_T("红老鼠 4.0"));
-#endif
-
 	m_wndObjectCombo.AddString(_T("红老鼠 3.0"));
 	m_wndObjectCombo.AddString(_T("红老鼠 4.0"));
-	m_wndObjectCombo.SetCurSel(0);
+	m_wndObjectCombo.SetCurSel(Global::g_Config.usetype);
 
 	CRect rectCombo;
 	m_wndObjectCombo.GetClientRect(&rectCombo);
@@ -168,6 +310,57 @@ int CIRControlWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 	// 校正布局;
 	AdjustLayout();
 
+	//////////////////////////////////////////////////////////////////////////
+	// 启动红老鼠;
+	if (!LoadLogLibarary())
+	{
+		AfxMessageBox("加载遥控dll失败,请检测dll是否正常!");
+	}
+
+	// 启动服务;
+	if (g_IsAppRunning(Global::g_Config.usetype ? Global::g_Config.redrat4path.c_str() : Global::g_Config.redrat3path.c_str()))
+	{
+		TRACE("启动红老鼠进程已运行\r");
+	}
+	else
+	{
+		TRACE("启动红老鼠进程未运行\r");
+		if (g_StartIRApp(Global::g_Config.usetype ? Global::g_Config.redrat4path.c_str() : Global::g_Config.redrat3path.c_str(), (Global::g_Config.signaldir + "\\defualt.xml").c_str(), 40000))
+		{
+			TRACE("启动红老鼠进程启动成功\r");
+		}
+		else
+		{
+			TRACE("启动红老鼠进程启动失败\r");
+			AfxMessageBox("启动红老鼠进程启动失败!");
+		}
+	}
+
+	Sleep(1500); // 等待进程启动完全;
+	// 连接服务器;
+	if (!g_Connect(_T("127.0.0.1"), 40000))
+		AfxMessageBox("连接红老鼠服务端失败,请重启设备!");
+
+	// 获取设备列表,以逗号分隔;
+	std::string devices = g_getDeviceNames();
+	if (devices.size() == 0)
+	{
+		AfxMessageBox("当前无红老鼠设备连接!");
+	}
+
+	std::string signale = Global::g_Config.bGenerics ? Global::g_Config.signaldir + "\\general\\" : Global::g_Config.signaldir + "\\product\\";
+	signale.append(Global::g_Config.use_signal);
+	// 加载指定目录的xml信号集文件;
+	if (!g_loadSignalDataSet(signale.c_str()))
+	{
+		TRACE("加载信号集文件失败\r");
+		AfxMessageBox("加载信号集文件失败!");
+	}
+	else
+	{
+		TRACE("加载信号集文件成功\r");
+	}
+
 	return 0;
 }
 
@@ -230,6 +423,57 @@ void CIRControlWnd::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
 	//SetPropListFont();
 }
 
+void CIRControlWnd::OnCbnSelchangeDeivceType()
+{
+	int nCurSel = m_wndObjectCombo.GetCurSel();
+	if (nCurSel != Global::g_Config.usetype)
+	{
+		Global::g_Config.usetype = nCurSel;
+		// 关闭旧类型进程;
+		if (g_CloseApp)
+			g_CloseApp();
+
+		// 新启动类型进程;
+		if (g_StartIRApp)
+		{
+			if (g_StartIRApp(Global::g_Config.usetype ? Global::g_Config.redrat4path.c_str() : Global::g_Config.redrat3path.c_str(), (Global::g_Config.signaldir + "\\defualt.xml").c_str(), 40000))
+			{
+				TRACE("启动红老鼠进程启动成功\r");
+			}
+			else
+			{
+				TRACE("启动红老鼠进程启动失败\r");
+				AfxMessageBox("启动红老鼠进程启动失败!");
+			}
+		}
+
+		Sleep(1500); // 等待进程启动完全;
+		// 连接服务器;
+		if (!g_Connect(_T("127.0.0.1"), 40000))
+			AfxMessageBox("连接红老鼠服务端失败,请重启设备!");
+
+		// 获取设备列表,以逗号分隔;
+		std::string devices = g_getDeviceNames();
+		if (devices.size() == 0)
+		{
+			AfxMessageBox("当前无红老鼠设备连接!");
+		}
+
+		std::string signale = Global::g_Config.bGenerics ? Global::g_Config.signaldir.append("\\general\\") : Global::g_Config.signaldir.append("\\product\\");
+		signale.append(Global::g_Config.use_signal);
+		// 加载指定目录的xml信号集文件;
+		if (!g_loadSignalDataSet(signale.c_str()))
+		{
+			TRACE("加载信号集文件失败\r");
+			AfxMessageBox("加载信号集文件失败!");
+		}
+		else
+		{
+			TRACE("加载信号集文件成功\r");
+		}
+	}
+}
+
 void CIRControlWnd::SetPropListFont()
 {
 	::DeleteObject(m_fntPropList.Detach());
@@ -264,7 +508,7 @@ void CIRControlWnd::Loadlayout(std::vector<BtnInfo>& vt)
 	}
 
 	vt.clear();
-	std::string data;	
+	std::string data;
 	tinyxml2::XMLElement* pXmlRoot = NULL;
 	if ((pXmlRoot = doc.RootElement()) != NULL)
 	{
@@ -298,10 +542,10 @@ void CIRControlWnd::Loadlayout(std::vector<BtnInfo>& vt)
 						{
 							data = pItem->GetText();
 							btninfo.color = HexColor2RGB(data);
-						}		
+						}
 
 						btninfo.pBTN = new CMFCButton();
-	
+
 						pItem = pItem->NextSiblingElement();
 					}
 				}
@@ -313,7 +557,7 @@ void CIRControlWnd::Loadlayout(std::vector<BtnInfo>& vt)
 
 	int sx = 0, sy = 80;
 	int i = 0, id = 10000;
-	DWORD dwStyle = WS_CHILD | WS_VISIBLE  ;
+	DWORD dwStyle = WS_CHILD | WS_VISIBLE;
 	for (auto it : vt)
 	{
 		if (i != 0 && i % 4 == 0)
@@ -359,11 +603,20 @@ void CIRControlWnd::OnBtnClick(UINT uId)
 {
 	CWnd* pWnd = GetFocus();
 	int id = pWnd->GetDlgCtrlID();
-	if ( id >= BTNID && id <= BTNID+100)
+	if (id >= BTNID && id <= BTNID + 100)
 	{
 		CString text;
 		pWnd->GetWindowText(text);
-		AfxMessageBox(text);
+		//AfxMessageBox(text);
+		// 发送单信号;
+		if (g_sendSignal(text.GetString(), 1, 100))
+		{
+			TRACE("发送单信号成功\n");
+		}
+		else
+		{
+			TRACE("发送单信号失败\n");
+		}
 	}
 }
 

+ 39 - 0
VideoCapture/VideoCapture/IRControlWnd.h

@@ -12,7 +12,40 @@
 #include "DlgIRControl.h"
 #pragma once
 
+//////////////////////////////////////////////////////////////////////////
+// dll相关;
+extern HMODULE g_hdll;
+extern BOOL LoadLogLibarary();
+extern void FreeLogLibarary();
+
+typedef DWORD(*irc_IsAppRunning)(LPCTSTR lpszAppDir);
+typedef bool (*irc_StartIRApp)(LPCTSTR lpszAppDir, LPCTSTR lpSignalXml, DWORD dwPort);
+typedef bool (*irc_CloseApp)();
+typedef bool (*irc_Connect)(LPCTSTR lpServer, int port);
+typedef bool (*irc_loadSignalDataSet)(LPCTSTR lpDatasetXml);
+typedef LPCTSTR(*irc_getDeviceNames)();
+typedef LPCTSTR(*irc_getSignalsName)();
+typedef bool (*irc_sendSignal)(LPCTSTR lpSignal, int send_times, int sleep_time);
+typedef bool (*irc_sendSignals)(LPCTSTR lpSignals, int sleep_time);
+typedef bool (*irc_sendRepeatsSignal)(LPCTSTR lpSignal, int repeat_time);
+
+extern int g_nIRControl;
+extern irc_IsAppRunning g_IsAppRunning;
+extern irc_StartIRApp g_StartIRApp;
+extern irc_CloseApp g_CloseApp;
+extern irc_Connect g_Connect;
+extern irc_getDeviceNames g_getDeviceNames;
+extern irc_getSignalsName g_getSignalsName;
+extern irc_loadSignalDataSet g_loadSignalDataSet;
+extern irc_sendSignal g_sendSignal;
+extern irc_sendSignals g_sendSignals;
+extern irc_sendRepeatsSignal g_sendRepeatsSignal;
+//////////////////////////////////////////////////////////////////////////
+
+// 按钮id起始值;
 #define BTNID 11000
+
+// layout.xml item;
 typedef struct __BTN_INFO__
 {
 	std::string name;
@@ -55,6 +88,7 @@ protected:
 #if __PANE_DLG__
 	CDlgIRControl m_dlgIRControl;
 #endif
+	
 // 实现
 public:
 	virtual ~CIRControlWnd();
@@ -79,6 +113,8 @@ protected:
 	afx_msg void OnUpdateProperties2(CCmdUI* pCmdUI);
 	afx_msg void OnSetFocus(CWnd* pOldWnd);
 	afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection);
+	// 下拉框选项变化事件;
+	afx_msg void OnCbnSelchangeDeivceType();
 
 	DECLARE_MESSAGE_MAP()
 
@@ -89,8 +125,11 @@ public:
 	std::vector<BtnInfo> m_vtBtnInfo;
 	void Loadlayout(std::vector<BtnInfo> &vt);
 	afx_msg void OnPaint();
+	// 单击按钮;
 	afx_msg void OnBtnClick(UINT uId);
+	// 更新按钮状态;
 	afx_msg void OnBtnUpdate(CCmdUI* pCmdUI);
+	// 更新checkbox状态;
 	afx_msg void OnUpdateCheckBox(CCmdUI * pCmdUI);
 };
 

+ 1 - 1
VideoCapture/VideoCapture/MainFrm.cpp

@@ -660,7 +660,7 @@ void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
 // 	lpMMI->ptMinTrackSize.x = 640;
 // 	lpMMI->ptMinTrackSize.y = 480;
 	lpMMI->ptMinTrackSize.x = 860;
-	lpMMI->ptMinTrackSize.y = 640;
+	lpMMI->ptMinTrackSize.y = 830;
 
 	CFrameWndEx::OnGetMinMaxInfo(lpMMI);
 }

+ 4 - 1
VideoCapture/VideoCapture/Resource.h

@@ -111,6 +111,9 @@
 #define IDS_EDIT_MENU                   306
 #define IDR_RIBBON                      307
 #define IDD_DLG_IRCONTROL               311
+#define IDB_CHECKED                     313
+#define IDB_BITMAP2                     315
+#define IDB_UNCHECKED                   315
 #define IDC_STATIC_VER                  1000
 #define IDC_BUTTON1                     1001
 #define IDC_BUTTON2                     1002
@@ -214,7 +217,7 @@
 // 
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        313
+#define _APS_NEXT_RESOURCE_VALUE        316
 #define _APS_NEXT_COMMAND_VALUE         32806
 #define _APS_NEXT_CONTROL_VALUE         1002
 #define _APS_NEXT_SYMED_VALUE           310

+ 4 - 3
VideoCapture/VideoCapture/VideoCapture.cpp

@@ -102,13 +102,13 @@ BOOL CVideoCaptureApp::InitInstance()
 	TCHAR szDir[MAX_PATH] = { 0 };
 	TCHAR szExt[MAX_PATH] = { 0 };
 	::GetModuleFileName(NULL, Global::g_szCurModulePath, sizeof(Global::g_szCurModulePath) / sizeof(TCHAR));
-// 	_tsplitpath_s(Global::g_szCurModulePath, szDrive, szDir, Global::g_szFna, szExt);
-// 	_tcscpy_s(Global::g_szCurModuleDir, szDrive);
-// 	_tcscat_s(Global::g_szCurModuleDir, szDir);
+ 	_tsplitpath_s(Global::g_szCurModulePath, szDrive, szDir, Global::g_szFna, szExt);
 	::GetCurrentDirectory(MAX_PATH, Global::g_szCurModuleDir);
 	_tcscat_s(Global::g_szCurModuleDir, _T("\\"));
 #endif
 
+	Global::GetConfig();
+
 	Global::WriteTextLog("程序启动");
 
 	// 初始化 OLE 库
@@ -182,6 +182,7 @@ int CVideoCaptureApp::ExitInstance()
 	//TODO: 处理可能已添加的附加资源
 	AfxOleTerm(FALSE);
 	Gdiplus::GdiplusShutdown(m_gdiplusToken);
+	//CMFCVisualManagerWindows::DestroyInstance();
 	return CWinAppEx::ExitInstance();
 }
 

+ 12 - 8
VideoCapture/VideoCapture/VideoCapture.rc

@@ -53,11 +53,11 @@ BEGIN
     "\r\n"
     "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)\r\n"
     "LANGUAGE 4, 2\r\n"
-    "#include ""res\\VideoCapture.rc2""  // 非 Microsoft Visual C++ 编辑的资源\r\n"
-    "#include ""l.CHS\\afxres.rc""      // 标准组件\r\n"
-    "#include ""l.CHS\\afxprint.rc""    // 打印/打印预览资源\r\n"
+    "#include ""res\\VideoCapture.rc2""  // 闈?Microsoft Visual C++ 缂栬緫鐨勮祫婧?\n"
+    "#include ""l.CHS\\afxres.rc""      // 鏍囧噯缁勪欢\r\n"
+    "#include ""l.CHS\\afxprint.rc""    // 鎵撳嵃/鎵撳嵃棰勮璧勬簮\r\n"
     "#if !defined(_AFXDLL)\r\n"
-    "#include ""l.CHS\\afxribbon.rc""        // MFC 功能区和控制条资源\r\n"
+    "#include ""l.CHS\\afxribbon.rc""        // MFC 鍔熻兘鍖哄拰鎺у埗鏉¤祫婧?\n"
     "#endif\r\n"
     "#endif\r\n"
     "\0"
@@ -153,6 +153,10 @@ IDB_PAGES_SMALL_HC      BITMAP                  "res\\pages_small_hc.bmp"
 
 IDB_INFO                BITMAP                  "res\\info.bmp"
 
+IDB_CHECKED             BITMAP                  "res\\checked.bmp"
+
+IDB_UNCHECKED           BITMAP                  "res\\unchecked.bmp"
+
 
 /////////////////////////////////////////////////////////////////////////////
 //
@@ -751,11 +755,11 @@ END
 
 #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
 LANGUAGE 4, 2
-#include "res\VideoCapture.rc2"  // 非 Microsoft Visual C++ 编辑的资源
-#include "l.CHS\afxres.rc"      // 标准组件
-#include "l.CHS\afxprint.rc"    // 打印/打印预览资源
+#include "res\VideoCapture.rc2"  // 闈?Microsoft Visual C++ 缂栬緫鐨勮祫婧?
+#include "l.CHS\afxres.rc"      // 鏍囧噯缁勪欢
+#include "l.CHS\afxprint.rc"    // 鎵撳嵃/鎵撳嵃棰勮璧勬簮
 #if !defined(_AFXDLL)
-#include "l.CHS\afxribbon.rc"        // MFC 功能区和控制条资源
+#include "l.CHS\afxribbon.rc"        // MFC 鍔熻兘鍖哄拰鎺у埗鏉¤祫婧?
 #endif
 #endif
 

+ 5 - 0
VideoCapture/VideoCapture/VideoCapture.vcxproj

@@ -72,6 +72,7 @@
     <Link>
       <SubSystem>Windows</SubSystem>
       <AdditionalDependencies>QCAP.X86.lib;VFW32.LIB;legacy_stdio_definitions.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <UACExecutionLevel>RequireAdministrator</UACExecutionLevel>
     </Link>
     <Midl>
       <MkTypLibCompatible>false</MkTypLibCompatible>
@@ -106,6 +107,7 @@ copy "$(SolutionDir)AMESDK.DLL" "$(TargetDir)AMESDK.dll" /y/a</Command>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <AdditionalDependencies>QCAP.X86.lib;VFW32.LIB;legacy_stdio_definitions.lib</AdditionalDependencies>
+      <UACExecutionLevel>RequireAdministrator</UACExecutionLevel>
     </Link>
     <Midl>
       <MkTypLibCompatible>false</MkTypLibCompatible>
@@ -212,6 +214,8 @@ copy "$(SolutionDir)AMESDK.DLL" "$(TargetDir)AMESDK.dll" /y/a</Command>
   </ItemGroup>
   <ItemGroup>
     <Image Include="res\buttons.bmp" />
+    <Image Include="res\checked.bmp" />
+    <Image Include="res\checked.png" />
     <Image Include="res\classview.bmp" />
     <Image Include="res\classview_hc.bmp" />
     <Image Include="res\class_view.ico" />
@@ -244,6 +248,7 @@ copy "$(SolutionDir)AMESDK.DLL" "$(TargetDir)AMESDK.dll" /y/a</Command>
     <Image Include="res\sort_hc.bmp" />
     <Image Include="res\Toolbar.bmp" />
     <Image Include="res\Toolbar256.bmp" />
+    <Image Include="res\unchecked.bmp" />
     <Image Include="res\VideoCapture.ico" />
     <Image Include="res\VideoCaptureDoc.ico" />
     <Image Include="res\writelarge.bmp" />

+ 9 - 0
VideoCapture/VideoCapture/VideoCapture.vcxproj.filters

@@ -321,6 +321,15 @@
     <Image Include="res\Toolbar256.bmp">
       <Filter>资源文件</Filter>
     </Image>
+    <Image Include="res\checked.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\checked.png">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\unchecked.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
   </ItemGroup>
   <ItemGroup>
     <None Include="res\ribbon.mfcribbon-ms">

+ 18 - 0
VideoCapture/VideoCapture/config.ini

@@ -0,0 +1,18 @@
+[ir-device]
+;当前使用类型;
+use-rat=1
+
+;3.0路径
+redrat3=C:\Python27\Tools\redhathub\RedRatHubCmd.exe
+
+;4.0路径
+redrat4=C:\Python27\Tools\RedRatHub-V4.28\RedRatHubCmd.exe
+
+;是否使用通用遥控信号
+generics=0
+
+;信号集路径
+signal=D:\SAT\resource\RCU
+
+;使用的信号集;
+use-signal=ARTEL_WZ_RC311_2841.xml

+ 9 - 9
VideoCapture/VideoCapture/layout.xml

@@ -119,7 +119,7 @@
 		<NAME>RETURN</NAME>
 		<WIDTH>98</WIDTH>
 		<HEIGHT>28</HEIGHT>
-		<COLOR name="ivory">87CEFA</COLOR>
+		<COLOR name="ivory">FF6666</COLOR>
 	</ITEM>
 	<ITEM>
 		<NAME>V-</NAME>
@@ -143,19 +143,19 @@
 		<NAME>EXIT</NAME>
 		<WIDTH>98</WIDTH>
 		<HEIGHT>28</HEIGHT>
-		<COLOR name="ivory">87CEFA</COLOR>
+		<COLOR name="ivory">FF6666</COLOR>
 	</ITEM>
 	<ITEM>
 		<NAME>SETTING</NAME>
 		<WIDTH>98</WIDTH>
 		<HEIGHT>28</HEIGHT>
-		<COLOR name="ivory">87CEFA</COLOR>
+		<COLOR name="ivory">EE82EE</COLOR>
 	</ITEM>
 	<ITEM>
 		<NAME>MENU</NAME>
 		<WIDTH>98</WIDTH>
 		<HEIGHT>28</HEIGHT>
-		<COLOR name="ivory">87CEFA</COLOR>
+		<COLOR name="ivory">EE82EE</COLOR>
 	</ITEM>
 	<ITEM>
 		<NAME>TV</NAME>
@@ -167,7 +167,7 @@
 		<NAME>SOURCE</NAME>
 		<WIDTH>98</WIDTH>
 		<HEIGHT>28</HEIGHT>
-		<COLOR name="ivory">87CEFA</COLOR>
+		<COLOR name="ivory">EE82EE</COLOR>
 	</ITEM>
 	<ITEM>
 		<NAME>FAV</NAME>
@@ -245,25 +245,25 @@
 		<NAME>RED</NAME>
 		<WIDTH>98</WIDTH>
 		<HEIGHT>28</HEIGHT>
-		<COLOR name="ivory">87CEFA</COLOR>
+		<COLOR name="ivory">FF0000</COLOR>
 	</ITEM>
 	<ITEM>
 		<NAME>GREEN</NAME>
 		<WIDTH>98</WIDTH>
 		<HEIGHT>28</HEIGHT>
-		<COLOR name="ivory">87CEFA</COLOR>
+		<COLOR name="ivory">00DD00</COLOR>
 	</ITEM>
 	<ITEM>
 		<NAME>BLUE</NAME>
 		<WIDTH>98</WIDTH>
 		<HEIGHT>28</HEIGHT>
-		<COLOR name="ivory">87CEFA</COLOR>
+		<COLOR name="ivory">0066FF</COLOR>
 	</ITEM>
 	<ITEM>
 		<NAME>YELLOW</NAME>
 		<WIDTH>98</WIDTH>
 		<HEIGHT>28</HEIGHT>
-		<COLOR name="ivory">87CEFA</COLOR>
+		<COLOR name="ivory">EEEE00</COLOR>
 	</ITEM>
 	<ITEM>
 		<NAME>PLAY</NAME>

BIN
VideoCapture/VideoCapture/res/checked.bmp


BIN
VideoCapture/VideoCapture/res/unchecked.bmp