Bladeren bron

1、ub530对接完成;
2、ribbon完成;

scbc.sat2 5 jaren geleden
bovenliggende
commit
64489daed6

+ 1 - 0
SATHelper/SATHelper/ChildFrm.cpp

@@ -57,6 +57,7 @@ BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
 
 	// 去掉整个菜单(最大化、最小化、关闭……),此时GetSystemMenu(FALSE)返回NULL;
 	cs.style &= ~WS_SYSMENU;
+	cs.style &= ~FWS_ADDTOTITLE;
 
 	return TRUE;
 }

+ 629 - 0
SATHelper/SATHelper/IRControlWnd.cpp

@@ -0,0 +1,629 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+#include "stdafx.h"
+#include "framework.h"
+
+#include "IRControlWnd.h"
+#include "Resource.h"
+#include "MainFrm.h"
+#include "SATHelper.h"
+#include <filehelper.h>
+
+#ifdef _DEBUG
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#define new DEBUG_NEW
+#endif
+
+
+/////////////////////////////////////////////////////////////////////////////
+// CResourceViewBar
+
+unsigned char TwoHexChar2Char(char ch1, char ch2)
+{
+	char Numb1;
+	char Numb2;
+
+	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');
+
+	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]);
+
+	return RGB(r, g, b);
+}
+
+CIRControlWnd::CIRControlWnd() noexcept
+{
+	m_nComboHeight = 0;
+}
+
+CIRControlWnd::~CIRControlWnd()
+{
+	FreeLogLibarary();
+
+	for (std::vector<BtnInfo>::iterator it = m_vtBtnInfo.begin(); it != m_vtBtnInfo.end(); it++)
+	{
+		if (it->pBTN)
+			it->pBTN->DestroyWindow();
+		it->pBTN = NULL;
+	}
+
+	m_vtBtnInfo.clear();
+}
+
+// 重启进程按钮id;
+#define ID_BUTTON_RESTART_PROC 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()
+	ON_COMMAND(ID_EXPAND_ALL, OnExpandAllProperties)
+	ON_UPDATE_COMMAND_UI(ID_EXPAND_ALL, OnUpdateExpandAllProperties)
+	ON_COMMAND(ID_SORTPROPERTIES, OnSortProperties)
+	ON_UPDATE_COMMAND_UI(ID_SORTPROPERTIES, OnUpdateSortProperties)
+	ON_COMMAND(ID_PROPERTIES1, OnProperties1)
+	ON_UPDATE_COMMAND_UI(ID_PROPERTIES1, OnUpdateProperties1)
+	ON_COMMAND(ID_PROPERTIES2, OnProperties2)
+	ON_UPDATE_COMMAND_UI(ID_PROPERTIES2, OnUpdateProperties2)
+	ON_WM_SETFOCUS()
+	ON_WM_SETTINGCHANGE()
+	ON_WM_PAINT()
+	// 信号按钮;
+	ON_COMMAND_RANGE(BTNID, BTNID + 100, OnSignalBtnClick)
+	ON_UPDATE_COMMAND_UI_RANGE(BTNID, BTNID + 100, OnUpdateSignalBtn)
+	// checkbox
+	ON_UPDATE_COMMAND_UI(ID_CHECKBOX_SIGNAL_TYPE, OnUpdateCheckBox)
+	ON_COMMAND(ID_CHECKBOX_SIGNAL_TYPE, OnCheckBoxClicked)
+	//
+	ON_CBN_SELCHANGE(ID_COMBOBOX_SIGNAL_FILE, &CIRControlWnd::OnCbnSelchangeSignal)
+	ON_UPDATE_COMMAND_UI(ID_BUTTON_RESTART_PROC, OnUpdateBtnRestartProc)
+	ON_COMMAND(ID_BUTTON_RESTART_PROC, OnBtnRestartProcClicked)
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CResourceViewBar 消息处理程序
+
+void CIRControlWnd::AdjustLayout()
+{
+	if (GetSafeHwnd() == nullptr || (AfxGetMainWnd() != nullptr && AfxGetMainWnd()->IsIconic()))
+	{
+		return;
+	}
+
+	CRect rectClient;
+	GetClientRect(rectClient);
+
+	m_btnRestart.SetWindowPos(nullptr, rectClient.left + 5, rectClient.top + 5, 120, m_nComboHeight, SWP_NOACTIVATE | SWP_NOZORDER);
+	m_wndSignalCheck.SetWindowPos(nullptr, rectClient.left + 130, rectClient.top + 5, 120, m_nComboHeight, SWP_NOACTIVATE | SWP_NOZORDER);
+
+	m_wndSignalCombo.SetWindowPos(nullptr, rectClient.left + 5, rectClient.top + m_nComboHeight + 10, 245, m_nComboHeight + 210, SWP_NOACTIVATE | SWP_NOZORDER);
+#if __PANE_DLG__
+	m_dlgIRControl.SetWindowPos(nullptr, rectClient.left, rectClient.top + m_nComboHeight + 50, rectClient.Width(), rectClient.Height(), SWP_NOACTIVATE);
+#endif
+}
+
+int CIRControlWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
+{
+	if (CDockablePane::OnCreate(lpCreateStruct) == -1)
+		return -1;
+
+	CRect rectDummy;
+	rectDummy.SetRectEmpty();
+
+	// 创建组合: 
+	const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_BORDER | CBS_SORT | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
+
+	if (!m_btnRestart.Create(_T("重启遥控器服务进程"), WS_CHILD | WS_VISIBLE, rectDummy, this, ID_BUTTON_RESTART_PROC))
+	{
+		TRACE0("未能创建遥控器组合 \n");
+		return -1;      // 未能创建
+	}
+
+	if (!m_wndSignalCheck.Create(_T("通用遥控器选择"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, rectDummy, this, ID_CHECKBOX_SIGNAL_TYPE))
+	{
+		TRACE0("未能创建信号集下拉框 \n");
+		return -1;      // 未能创建
+	}
+	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| WS_VSCROLL, rectDummy, this, ID_COMBOBOX_SIGNAL_FILE))
+	{
+		TRACE0("未能创建信号集下拉框 \n");
+		return -1;      // 未能创建
+	}
+	LoadSignals();
+
+	CRect rectCombo;
+	m_wndSignalCombo.GetClientRect(&rectCombo);
+
+	m_nComboHeight = rectCombo.Height();
+#if __PANE_DLG__
+	if (!m_dlgIRControl.Create(IDD_DLG_IRCONTROL, this))
+	{
+		TRACE0("未能创建遥控器主窗口 \n");
+		return -1;      // 未能创建
+	}
+	m_dlgIRControl.ShowWindow(SW_SHOW);
+#else
+	Loadlayout(m_vtBtnInfo);
+#endif
+	// 设置最小窗体;
+	SetMinSize((530, 260));
+
+	// 校正布局;
+	AdjustLayout();
+
+	//////////////////////////////////////////////////////////////////////////
+	// 启动红老鼠;
+	if (!LoadLogLibarary())
+	{
+		AfxMessageBox("加载遥控dll失败,请检测dll是否正常!");
+	}
+
+	StartIRDevice(FALSE);
+
+	return 0;
+}
+
+void CIRControlWnd::OnSize(UINT nType, int cx, int cy)
+{
+	CDockablePane::OnSize(nType, cx, cy);
+
+	TRACE2("坐标:%d,%d\n", cx, cy);
+
+	AdjustLayout();
+}
+
+void CIRControlWnd::OnExpandAllProperties()
+{
+	//m_wndPropList.ExpandAll();
+}
+
+void CIRControlWnd::OnUpdateExpandAllProperties(CCmdUI* /* pCmdUI */)
+{
+}
+
+void CIRControlWnd::OnSortProperties()
+{
+	//m_wndPropList.SetAlphabeticMode(!m_wndPropList.IsAlphabeticMode());
+}
+
+void CIRControlWnd::OnUpdateSortProperties(CCmdUI* pCmdUI)
+{
+	//pCmdUI->SetCheck(m_wndPropList.IsAlphabeticMode());
+}
+
+void CIRControlWnd::OnProperties1()
+{
+	// TODO: 在此处添加命令处理程序代码
+}
+
+void CIRControlWnd::OnUpdateProperties1(CCmdUI* /*pCmdUI*/)
+{
+	// TODO: 在此处添加命令更新 UI 处理程序代码
+}
+
+void CIRControlWnd::OnProperties2()
+{
+	// TODO: 在此处添加命令处理程序代码
+}
+
+void CIRControlWnd::OnUpdateProperties2(CCmdUI* /*pCmdUI*/)
+{
+	// TODO: 在此处添加命令更新 UI 处理程序代码
+}
+
+void CIRControlWnd::OnSetFocus(CWnd* pOldWnd)
+{
+	CDockablePane::OnSetFocus(pOldWnd);
+}
+
+void CIRControlWnd::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
+{
+	CDockablePane::OnSettingChange(uFlags, lpszSection);
+	//SetPropListFont();
+}
+
+void CIRControlWnd::OnCbnSelchangeSignal()
+{
+	CString strSignal;
+	int nCurSel = m_wndSignalCombo.GetCurSel();
+	if ( nCurSel != CB_ERR )
+	{
+		std::string signalpath;
+		m_wndSignalCombo.GetLBText(nCurSel, strSignal);
+
+		// 保存到配置文件中;
+		Global::g_Config.use_signal = strSignal.GetString();
+		WritePrivateProfileString("ir-device", "use-signal", strSignal.GetString(), Global::g_szConfig);
+	}
+
+	DisableSignalBtn();
+	ReLoadSignalXml();
+}
+
+void CIRControlWnd::SetPropListFont()
+{
+	::DeleteObject(m_fntPropList.Detach());
+
+	LOGFONT lf;
+	afxGlobalData.fontRegular.GetLogFont(&lf);
+
+	NONCLIENTMETRICS info;
+	info.cbSize = sizeof(info);
+
+	afxGlobalData.GetNonClientMetrics(info);
+
+	lf.lfHeight = info.lfMenuFont.lfHeight;
+	lf.lfWeight = info.lfMenuFont.lfWeight;
+	lf.lfItalic = info.lfMenuFont.lfItalic;
+
+	m_fntPropList.CreateFontIndirect(&lf);
+
+	//m_wndObjectCombo.SetFont(&m_fntPropList);
+}
+
+void CIRControlWnd::StartIRDevice(BOOL bReStart)
+{
+	std::thread t([&](BOOL _bReStart_) {
+		// 结束进程;
+		if (_bReStart_ && g_CloseApp)
+			g_CloseApp();
+
+		// 默认加载配置的信号集文件;
+		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 (!PathFileExists(signale.c_str()))
+		{
+			m_wndSignalCombo.SetCurSel(-1);
+			signale = ".\\default.xml";
+		}
+		else
+		{
+			m_wndSignalCombo.SelectString(0, Global::g_Config.use_signal.c_str());
+		}
+
+		if ( !g_IsAppRunning(Global::g_Config.redratpath.c_str()) )
+		{
+			if (g_StartIRApp(Global::g_Config.redratpath.c_str(), signale.c_str(), 40000))
+			{
+				TRACE("启动红老鼠进程启动成功\r");
+			}
+			else
+			{
+				TRACE("启动红老鼠进程启动失败\r");
+				AfxMessageBox("启动红老鼠进程启动失败!");
+				return 0;
+			}
+		}
+
+		BOOL bRet = FALSE;
+		// 连接服务器;
+		for (int i = 0; i < 5; i++)
+		{
+			if ((bRet = g_Connect(_T("127.0.0.1"), 40000)))
+				break;
+			Sleep(1000);
+		}
+
+		if (!bRet)
+			AfxMessageBox("连接红老鼠服务端失败,请重启设备!");
+
+		// 更新按钮状态;
+		UpdateSignalBtnStatus();
+		// 获取设备列表,以逗号分隔;
+		std::string devices = g_getDeviceNames();
+		if (devices.size() == 0)
+		{
+			AfxMessageBox("当前无红老鼠设备连接!");
+		}
+
+		return 1;
+	}, bReStart);
+	t.detach();
+}
+
+void CIRControlWnd::ReLoadSignalXml()
+{
+	std::string signaldir,signalpath;
+	if (Global::g_Config.bGenerics)
+	{
+		signaldir = Global::g_Config.signaldir + "\\general\\";
+	}
+	else
+	{
+		signaldir = Global::g_Config.signaldir + "\\product\\";
+	}
+
+	signalpath = signaldir;
+	signalpath.append(Global::g_Config.use_signal + ".xml");
+	if (!PathFileExists(signalpath.c_str()))
+	{
+		AfxMessageBox(_T("该信号文件不存在!"));
+		// 设置默认的;
+		CString strSignal;
+		m_wndSignalCombo.SetCurSel(0);
+		m_wndSignalCombo.GetLBText(0, strSignal);
+
+		signalpath = signaldir;
+		signalpath.append(strSignal.GetString());
+		signalpath.append(".xml");
+
+		// 保存到配置文件中;
+		Global::g_Config.use_signal = strSignal.GetString();
+		WritePrivateProfileString("ir-device", "use-signal", strSignal.GetString(), Global::g_szConfig);
+	}
+	else // 切换通用类型时用到;
+	{
+		m_wndSignalCombo.SelectString(0, Global::g_Config.use_signal.c_str());
+	}
+
+	// 加载指定目录的xml信号集文件;
+	if (!g_loadSignalDataSet(signalpath.c_str()))
+	{
+		TRACE("加载信号集文件失败\r");
+	}
+	else
+	{
+		TRACE("加载信号集文件成功\r");
+		UpdateSignalBtnStatus();
+	}
+}
+
+void CIRControlWnd::LoadSignals()
+{
+	filehelper fh;
+	fh.getfolderfiles((Global::g_Config.signaldir + "\\general\\").c_str(), NULL, &m_vtsignal_gen);
+	fh.getfolderfiles((Global::g_Config.signaldir + "\\product\\").c_str(), NULL, &m_vtsignal_pro);
+
+	// 添加到combobox中;
+	if (Global::g_Config.bGenerics )
+	{
+		m_wndSignalCombo.ResetContent();
+		for ( auto it : m_vtsignal_gen)
+		{
+			m_wndSignalCombo.AddString(fh.getfilename(it).c_str());
+		}
+	}
+	else
+	{
+		m_wndSignalCombo.ResetContent();
+		for (auto it : m_vtsignal_pro)
+		{
+			m_wndSignalCombo.AddString(fh.getfilename(it).c_str());
+		}
+	}	
+}
+
+void CIRControlWnd::Loadlayout(std::vector<BtnInfo>& vt)
+{
+	// 解析xml;
+	std::string path;
+	path.append(Global::g_szCurModuleDir);
+	path.append("layout.xml");
+	tinyxml2::XMLDocument doc;
+	if (tinyxml2::XML_SUCCESS != doc.LoadFile(path.c_str()))
+	{
+		return;
+	}
+
+	vt.clear();
+	std::string data;
+	tinyxml2::XMLElement* pXmlRoot = NULL;
+	if ((pXmlRoot = doc.RootElement()) != NULL)
+	{
+		if (_tcsicmp(pXmlRoot->Value(), "ButtonList") == 0)
+		{
+			// 子项;
+			tinyxml2::XMLElement* pXmlElent = pXmlRoot->FirstChildElement();
+			while (pXmlElent)
+			{
+				BtnInfo btninfo;
+				if (_tcsicmp(pXmlElent->Value(), _T("ITEM")) == 0)
+				{
+					tinyxml2::XMLElement* pItem = pXmlElent->FirstChildElement();
+					while (pItem)
+					{
+						if (_tcsicmp(pItem->Value(), _T("NAME")) == 0)
+						{
+							btninfo.name = pItem->GetText();
+						}
+						else if (_tcsicmp(pItem->Value(), _T("WIDTH")) == 0)
+						{
+							data = pItem->GetText();
+							btninfo.width = _ttol(data.c_str());
+						}
+						else if (_tcsicmp(pItem->Value(), _T("HEIGHT")) == 0)
+						{
+							data = pItem->GetText();
+							btninfo.height = _ttol(data.c_str());
+						}
+						else if (_tcsicmp(pItem->Value(), _T("COLOR")) == 0)
+						{
+							data = pItem->GetText();
+							btninfo.color = HexColor2RGB(data);
+						}
+
+						btninfo.pBTN = new CMFCButton();
+
+						pItem = pItem->NextSiblingElement();
+					}
+				}
+				vt.push_back(btninfo);
+				pXmlElent = pXmlElent->NextSiblingElement();
+			}
+		}
+	}
+
+	int sx = 0, sy = m_nComboHeight*2+15;
+	int i = 0, id = 10000;
+	DWORD dwStyle = WS_CHILD | WS_VISIBLE;
+	for (std::vector<BtnInfo>::iterator it = vt.begin(); it != vt.end(); it++)
+	{
+		if (i != 0 && i % 4 == 0)
+		{//换行;
+			sy += it->height + 5;
+		}
+
+		sx = (i % 4) * it->width + (i % 4 + 1) * 5;
+
+		it->pBTN->Create(it->name.c_str(), dwStyle, CRect(sx, sy, sx + it->width, sy + it->height), this, BTNID + i);
+		// 设置透明false以显示背景色
+		it->pBTN->m_bTransparent = FALSE;
+		it->pBTN->m_bDontUseWinXPTheme = TRUE;
+		// 设置背景色;
+		it->pBTN->SetFaceColor(it->color, TRUE);
+		// 消除单击时黑色内圈;
+		it->pBTN->m_bDrawFocus = FALSE;
+		// 设置按钮扁平样式;
+		it->pBTN->m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
+		// 设置鼠标形状;
+		it->pBTN->SetMouseCursorHand();
+
+		// 存入map中;
+		m_map_btn.insert(std::pair<UINT, BtnInfo&>(BTNID+i, *it));
+
+		i++;
+	}
+}
+
+// 如果CDockablePane无控件,改变大小时背景会刷新失败;
+// 所以要重载onpaint;
+void CIRControlWnd::OnPaint()
+{
+	CPaintDC dc(this); // device context for painting
+					   // TODO: 在此处添加消息处理程序代码
+					   // 不为绘图消息调用 	CDockablePane::OnPaint();
+	CRect rc;
+	GetClientRect(rc);
+	CBrush   brush;
+	brush.CreateSolidBrush(0xFFEFD5);
+	dc.FillRect(&rc, &brush);
+}
+
+void CIRControlWnd::OnSignalBtnClick(UINT uId) // 发送遥控信号;
+{
+	CWnd* pWnd = GetFocus();
+	int id = pWnd->GetDlgCtrlID();
+	if (id >= BTNID && id <= BTNID + 100)
+	{
+		CString text;
+		pWnd->GetWindowText(text);
+		// 发送单信号;
+		if (g_sendSignal(text.GetString(), 1, 20))
+		{
+			TRACE("发送单信号成功\n");
+		}
+		else
+		{
+			TRACE("发送单信号失败\n");
+		}
+	}
+}
+
+void CIRControlWnd::OnUpdateSignalBtn(CCmdUI* pCmdUI)
+{
+	pCmdUI->Enable(m_map_btn.find(pCmdUI->m_nID)->second.bEnable);
+}
+
+void CIRControlWnd::OnUpdateCheckBox(CCmdUI* pCmdUI)
+{
+	pCmdUI->Enable();
+}
+
+void CIRControlWnd::OnCheckBoxClicked()
+{
+	Global::g_Config.bGenerics = m_wndSignalCheck.IsChecked();
+	// 保存到配置文件中;
+	WritePrivateProfileString("ir-device", "generics", Global::g_Config.bGenerics ? "1" : "0", Global::g_szConfig);
+
+	// 添加到combobox中;
+	if (Global::g_Config.bGenerics)
+	{
+		m_wndSignalCombo.ResetContent();
+		for (auto it : m_vtsignal_gen)
+		{
+			m_wndSignalCombo.AddString(filehelper::getfilename(it).c_str());
+		}
+	}
+	else
+	{
+		m_wndSignalCombo.ResetContent();
+		for (auto it : m_vtsignal_pro)
+		{
+			m_wndSignalCombo.AddString(filehelper::getfilename(it).c_str());
+		}
+	}
+	
+	DisableSignalBtn();
+	ReLoadSignalXml();	
+}
+
+void CIRControlWnd::OnUpdateBtnRestartProc(CCmdUI* pCmdUI)
+{
+	pCmdUI->Enable(TRUE);
+}
+
+void CIRControlWnd::OnBtnRestartProcClicked() // 重启红老鼠;
+{
+	DisableSignalBtn();
+	StartIRDevice();
+}
+
+void CIRControlWnd::UpdateSignalBtnStatus()
+{
+	// 获取信号集;
+	if (g_getSignalsName )
+	{
+		// 获取信号数据集,以\n分隔;
+		std::string data = g_getSignalsName();
+		CString signals = data.append(1, '\n').c_str();
+		signals.MakeUpper();
+		for ( std::vector<BtnInfo>::iterator it = m_vtBtnInfo.begin(); it != m_vtBtnInfo.end(); it++)
+		{
+			if ( signals.Find((it->name+'\n').c_str()) == -1 )
+			{
+				it->bEnable = false;
+			}
+			else
+			{
+				it->bEnable = true;
+			}
+		}
+	}
+}

+ 129 - 0
SATHelper/SATHelper/IRControlWnd.h

@@ -0,0 +1,129 @@
+// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面
+// (“Fluent UI”)。该示例仅供参考,
+// 用以补充《Microsoft 基础类参考》和
+// MFC C++ 库软件随附的相关电子文档。
+// 复制、使用或分发 Fluent UI 的许可条款是单独提供的。
+// 若要了解有关 Fluent UI 许可计划的详细信息,请访问
+// https://go.microsoft.com/fwlink/?LinkId=238214.
+//
+// 版权所有(C) Microsoft Corporation
+// 保留所有权利。
+
+//#include "DlgIRControl.h"
+#include <map>
+#pragma once
+
+// 按钮id起始值;
+#define BTNID 11000
+
+// layout.xml item;
+typedef struct __BTN_INFO__
+{
+	std::string name;
+	int width;
+	int height;
+	DWORD color;
+	CMFCButton *pBTN;
+	bool bEnable = false;
+}BtnInfo, *pBtnInfo;
+
+class CIRControlToolBar : public CMFCToolBar
+{
+public:
+	virtual void OnUpdateCmdUI(CFrameWnd* /*pTarget*/, BOOL bDisableIfNoHndler)
+	{
+		CMFCToolBar::OnUpdateCmdUI((CFrameWnd*) GetOwner(), bDisableIfNoHndler);
+	}
+
+	virtual BOOL AllowShowOnList() const { return FALSE; }
+};
+
+class CIRControlWnd : public CDockablePane
+{
+// 构造
+public:
+	CIRControlWnd() noexcept;
+
+	void AdjustLayout();
+
+// 特性
+public:
+
+protected:
+	CFont m_fntPropList;
+	// 重启服务端进程;
+	CMFCButton m_btnRestart;
+	// 信号集文件;
+	CComboBox m_wndSignalCombo;
+	// 选择通用遥控器;
+	CMFCButton m_wndSignalCheck;
+#if __PANE_DLG__
+	CDlgIRControl m_dlgIRControl;
+#endif
+	
+// 实现
+public:
+	virtual ~CIRControlWnd();
+	// 去掉关闭按钮;但组合多个pane时无效;
+	virtual BOOL CanBeClosed() const { return FALSE; };
+	// 禁止拖动Pane;
+	virtual BOOL FloatPane(CRect rectFloat, AFX_DOCK_METHOD dockMethod = DM_UNKNOWN, bool bShow = true) { return FALSE; }
+	// 禁用停靠,双击底部无效(不会停靠)
+	virtual BOOL CanFloat() const { return FALSE; };
+	// 禁用大小;//崩溃;
+	//virtual BOOL IsResizable() const {return FALSE;}
+protected:
+	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
+	afx_msg void OnSize(UINT nType, int cx, int cy);
+	afx_msg void OnExpandAllProperties();
+	afx_msg void OnUpdateExpandAllProperties(CCmdUI* pCmdUI);
+	afx_msg void OnSortProperties();
+	afx_msg void OnUpdateSortProperties(CCmdUI* pCmdUI);
+	afx_msg void OnProperties1();
+	afx_msg void OnUpdateProperties1(CCmdUI* pCmdUI);
+	afx_msg void OnProperties2();
+	afx_msg void OnUpdateProperties2(CCmdUI* pCmdUI);
+	afx_msg void OnSetFocus(CWnd* pOldWnd);
+	afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection);
+	// 下拉框选项变化事件;
+	afx_msg void OnCbnSelchangeSignal();
+
+	DECLARE_MESSAGE_MAP()
+
+	void SetPropListFont();
+
+	int m_nComboHeight;
+
+	// 重启红老鼠;
+	void StartIRDevice(BOOL bReStart = TRUE);
+	// 重载信号文件;
+	void ReLoadSignalXml();
+	// 禁用信号按钮;
+	void DisableSignalBtn() {
+		for (std::vector<BtnInfo>::iterator it = m_vtBtnInfo.begin(); it != m_vtBtnInfo.end(); it++)
+		{
+			it->bEnable = false;
+		}
+	}
+public:
+	std::map<UINT, BtnInfo&> m_map_btn;
+	std::vector<std::string> m_vtsignal_gen;
+	std::vector<std::string> m_vtsignal_pro;
+	void LoadSignals();
+	std::vector<BtnInfo> m_vtBtnInfo;
+	void Loadlayout(std::vector<BtnInfo> &vt);
+	afx_msg void OnPaint();
+	// 单击按钮;
+	afx_msg void OnSignalBtnClick(UINT uId);
+	// 更新按钮状态;
+	afx_msg void OnUpdateSignalBtn(CCmdUI* pCmdUI);
+	// 更新checkbox状态;
+	afx_msg void OnUpdateCheckBox(CCmdUI * pCmdUI);
+	afx_msg void OnCheckBoxClicked();
+	// 更新重启按钮状态;
+	afx_msg void OnUpdateBtnRestartProc(CCmdUI* pCmdUI);
+	afx_msg void OnBtnRestartProcClicked();
+	// 更新按钮实际状态;
+	void UpdateSignalBtnStatus();
+};
+

+ 5 - 5
SATHelper/SATHelper/MainFrm.cpp

@@ -242,8 +242,8 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
 	m_wndOutput.EnableDocking(CBRS_ALIGN_ANY);
 	DockPane(&m_wndOutput);
 #endif
-	m_wndProperties.EnableDocking(CBRS_ALIGN_ANY);
-	DockPane(&m_wndProperties);
+	m_wndIRControl.EnableDocking(CBRS_ALIGN_ANY);
+	DockPane(&m_wndIRControl);
 #endif
 
 	// 基于持久值设置视觉管理器和样式
@@ -269,7 +269,7 @@ BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
 	//  CREATESTRUCT cs 来修改窗口类或样式
 
 	//不把子框架标题添加到主框架标题(主框架中就不会再处理WM_SETTEXT消息)
-	cs.style &= ~FWS_ADDTOTITLE;
+	//cs.style &= ~FWS_ADDTOTITLE;
 
 	return TRUE;
 }
@@ -317,7 +317,7 @@ BOOL CMainFrame::CreateDockingWindows()
 	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))
+	if (!m_wndIRControl.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; // 未能创建
@@ -343,7 +343,7 @@ void CMainFrame::SetDockingWindowIcons(BOOL bHiColorIcons)
 #endif
 
 	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);
+	m_wndIRControl.SetIcon(hPropertiesBarIcon, FALSE);
 
 #if __TAB_BAR__
 	UpdateMDITabbedBarsIcons();

+ 2 - 2
SATHelper/SATHelper/MainFrm.h

@@ -16,7 +16,7 @@
 #include "FileView.h"
 #include "ClassView.h"
 #include "OutputWnd.h"
-#include "PropertiesWnd.h"
+#include "IRControlWnd.h"
 #include "CalendarBar.h"
 #include "Resource.h"
 //////////////////////////////////////////////////////////////////////////
@@ -68,7 +68,7 @@ protected:  // 控件条嵌入成员
 #if __OUT_PUT_WIN__
 	COutputWnd        m_wndOutput;
 #endif
-	CPropertiesWnd    m_wndProperties;
+	CIRControlWnd     m_wndIRControl;
 #endif
 
 #if __OUTLOOKBAR__

+ 22 - 3
SATHelper/SATHelper/Resource.h

@@ -110,16 +110,35 @@
 #define IDS_EXPLORER                    305
 #define IDS_EDIT_MENU                   306
 #define IDR_RIBBON                      307
+#define IDB_CHECKED                     310
+#define IDB_UNCHECKED                   311
 #define ID_WRITE_PASTEASHYPERLINK       32770
-#define ID_TRAYMENU_RECONNECT			32771
+#define ID_TRAYMENU_RECONNECT           32771
 #define ID_TRAYMENU_EXIT                32772
+#define ID_CHECK_HDMI                   32773
+#define ID_CHECK_YCBCR                  32773
+#define ID_CHECK_DVID                   32774
+#define ID_CHECK_DVIA                   32774
+#define ID_CHECK_COMPOSITE              32775
+#define ID_CHECK_SVIDEO                 32776
+#define ID_CHECK_SDI                    32777
+#define ID_CHECK_AUTO                   32778
+#define ID_CHECK_FORMAT_MP4             32786
+#define ID_CUT_BMP                      32790
+#define ID_CUT_JPG                      32791
+#define ID_START_RECORD                 32792
+#define ID_STOP_RECORD                  32793
+#define ID_CHECK_VERTICALLY             32796
+#define ID_CHECK_HORIONTAL              32797
+#define ID_CHECK_SUPORT_GPU             32804
+#define ID_CHECK_FORMAT_AVI             32805
 
 // Next default values for new objects
 // 
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        310
-#define _APS_NEXT_COMMAND_VALUE         32773
+#define _APS_NEXT_RESOURCE_VALUE        312
+#define _APS_NEXT_COMMAND_VALUE         32775
 #define _APS_NEXT_CONTROL_VALUE         1000
 #define _APS_NEXT_SYMED_VALUE           310
 #endif

+ 14 - 10
SATHelper/SATHelper/SATHelper.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\\SATHelper.rc2""  // 闈?Microsoft Visual C++ 缂栬緫鐨勮祫婧?\n"
-    "#include ""l.CHS\\afxres.rc""      // 鏍囧噯缁勪欢\r\n"
-    "#include ""l.CHS\\afxprint.rc""    // 鎵撳嵃/鎵撳嵃棰勮璧勬簮\r\n"
+    "#include ""res\\SATHelper.rc2""  // 闂?Microsoft Visual C++ 缂傚倹鐗炵欢顐︽儍閸曨喚銈繝?\n"
+    "#include ""l.CHS\\afxres.rc""      // 闁哄秴娲ら崳顖滅磼閸曨亝顐?\n"
+    "#include ""l.CHS\\afxprint.rc""    // 闁瑰灚鎸稿畵?闁瑰灚鎸稿畵鍐╋紣閸曨噮娼旈悹褍瀚花?\n"
     "#if !defined(_AFXDLL)\r\n"
-    "#include ""l.CHS\\afxribbon.rc""        // MFC 鍔熻兘鍖哄拰鎺у埗鏉¤祫婧?\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"
+
 
 /////////////////////////////////////////////////////////////////////////////
 //
@@ -266,8 +270,8 @@ BEGIN
     END
     POPUP "TrayMenu"
     BEGIN
-        MENUITEM "重连",						  ID_TRAYMENU_RECONNECT
-        MENUITEM "退出",						  ID_TRAYMENU_EXIT
+        MENUITEM "重连",                          ID_TRAYMENU_RECONNECT
+        MENUITEM "退出",                          ID_TRAYMENU_EXIT
     END
 END
 
@@ -707,11 +711,11 @@ END
 
 #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
 LANGUAGE 4, 2
-#include "res\SATHelper.rc2"  // 闈?Microsoft Visual C++ 缂栬緫鐨勮祫婧?
-#include "l.CHS\afxres.rc"      // 鏍囧噯缁勪欢
-#include "l.CHS\afxprint.rc"    // 鎵撳嵃/鎵撳嵃棰勮璧勬簮
+#include "res\SATHelper.rc2"  // 闂?Microsoft Visual C++ 缂傛牞绶惃鍕カ濠?
+#include "l.CHS\afxres.rc"      // 閺嶅洤鍣紒鍕
+#include "l.CHS\afxprint.rc"    // 閹垫挸宓?閹垫挸宓冩0鍕潔鐠у嫭绨?
 #if !defined(_AFXDLL)
-#include "l.CHS\afxribbon.rc"        // MFC 鍔熻兘鍖哄拰鎺у埗鏉¤祫婧?
+#include "l.CHS\afxribbon.rc"        // MFC 閸旂喕鍏橀崠鍝勬嫲閹貉冨煑閺壜ょカ濠?
 #endif
 #endif
 

+ 4 - 0
SATHelper/SATHelper/SATHelper.vcxproj

@@ -214,6 +214,7 @@
     <ClInclude Include="framework.h" />
     <ClInclude Include="Global.h" />
     <ClInclude Include="IOCPModel.h" />
+    <ClInclude Include="IRControlWnd.h" />
     <ClInclude Include="MainFrm.h" />
     <ClInclude Include="MemoryClient.h" />
     <ClInclude Include="MemoryComm.h" />
@@ -255,6 +256,7 @@
     <ClCompile Include="FileView.cpp" />
     <ClCompile Include="Global.cpp" />
     <ClCompile Include="IOCPModel.cpp" />
+    <ClCompile Include="IRControlWnd.cpp" />
     <ClCompile Include="MainFrm.cpp" />
     <ClCompile Include="MemoryClient.cpp" />
     <ClCompile Include="MemoryComm.cpp" />
@@ -282,6 +284,7 @@
   </ItemGroup>
   <ItemGroup>
     <Image Include="res\buttons.bmp" />
+    <Image Include="res\checked.bmp" />
     <Image Include="res\classview.bmp" />
     <Image Include="res\classview_hc.bmp" />
     <Image Include="res\class_view.ico" />
@@ -316,6 +319,7 @@
     <Image Include="res\sort_hc.bmp" />
     <Image Include="res\Toolbar.bmp" />
     <Image Include="res\Toolbar256.bmp" />
+    <Image Include="res\unchecked.bmp" />
     <Image Include="res\writelarge.bmp" />
     <Image Include="res\writesmall.bmp" />
   </ItemGroup>

+ 12 - 0
SATHelper/SATHelper/SATHelper.vcxproj.filters

@@ -144,6 +144,9 @@
     <ClInclude Include="IOCPModel.h">
       <Filter>iocp</Filter>
     </ClInclude>
+    <ClInclude Include="IRControlWnd.h">
+      <Filter>DockPane</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="SATHelper.cpp">
@@ -239,6 +242,9 @@
     <ClCompile Include="IOCPModel.cpp">
       <Filter>iocp</Filter>
     </ClCompile>
+    <ClCompile Include="IRControlWnd.cpp">
+      <Filter>DockPane</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="SATHelper.rc">
@@ -357,6 +363,12 @@
     <Image Include="res\Toolbar256.bmp">
       <Filter>资源文件</Filter>
     </Image>
+    <Image Include="res\checked.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\unchecked.bmp">
+      <Filter>资源文件</Filter>
+    </Image>
   </ItemGroup>
   <ItemGroup>
     <None Include="res\ribbon.mfcribbon-ms">

+ 242 - 0
SATHelper/SATHelper/SATHelperView.cpp

@@ -251,6 +251,25 @@ BEGIN_MESSAGE_MAP(CSATHelperView, CView)
 	ON_WM_CONTEXTMENU()
 	ON_WM_RBUTTONUP()
 	ON_WM_CREATE()
+	///////////////////////////////////
+	ON_WM_TIMER()
+	ON_COMMAND(ID_CUT_BMP, &CSATHelperView::OnCutBmp)
+	ON_COMMAND(ID_CUT_JPG, &CSATHelperView::OnCutJpg)
+	ON_COMMAND(ID_START_RECORD, &CSATHelperView::OnStartRecord)
+	ON_COMMAND(ID_STOP_RECORD, &CSATHelperView::OnStopRecord)
+	ON_COMMAND(ID_CHECK_VERTICALLY, &CSATHelperView::OnCheckVertically)
+	ON_COMMAND(ID_CHECK_HORIONTAL, &CSATHelperView::OnCheckHoriontal)
+	ON_UPDATE_COMMAND_UI(ID_CHECK_VERTICALLY, &CSATHelperView::OnUpdateCheckVertically)
+	ON_UPDATE_COMMAND_UI(ID_CHECK_HORIONTAL, &CSATHelperView::OnUpdateCheckHoriontal)
+	ON_COMMAND(ID_TRAYMENU_RECONNECT, &CSATHelperView::OnTraymenuReconnect)
+	ON_COMMAND(ID_CHECK_SUPORT_GPU, &CSATHelperView::OnCheckSuportGpu)
+	ON_COMMAND(ID_CHECK_FORMAT_MP4, &CSATHelperView::OnCheckFormatMp4)
+	ON_COMMAND(ID_CHECK_FORMAT_AVI, &CSATHelperView::OnCheckFormatAvi)
+	ON_UPDATE_COMMAND_UI(ID_CHECK_SUPORT_GPU, &CSATHelperView::OnUpdateCheckSuportGpu)
+	ON_UPDATE_COMMAND_UI(ID_CHECK_FORMAT_MP4, &CSATHelperView::OnUpdateCheckFormatMp4)
+	ON_UPDATE_COMMAND_UI(ID_CHECK_FORMAT_AVI, &CSATHelperView::OnUpdateCheckFormatAvi)
+	ON_UPDATE_COMMAND_UI(ID_START_RECORD, &CSATHelperView::OnUpdateStartRecord)
+	ON_UPDATE_COMMAND_UI(ID_STOP_RECORD, &CSATHelperView::OnUpdateStopRecord)
 END_MESSAGE_MAP()
 
 // CSATHelperView 构造/析构
@@ -980,3 +999,226 @@ int CSATHelperView::OnCreate(LPCREATESTRUCT lpCreateStruct)
 
 	return 0;
 }
+
+void CSATHelperView::SetRibbonStatusBarText(CString strText, int uId)
+{
+	if (g_pMainFrame)
+	{
+		g_pMainFrame->SetRibbonStatusBarText(strText, uId);
+	}
+}
+
+
+void CSATHelperView::OnTimer(UINT_PTR nIDEvent)
+{
+	// TODO: 在此添加消息处理程序代码和/或调用默认值
+	if (nIDEvent == 0)
+	{
+		KillTimer(0);
+
+		if (m_bNoSignal)
+		{
+			if (m_bIsRecord)
+			{
+				QCAP_STOP_RECORD(m_hVideoDevice, 0);
+				m_bIsRecord = FALSE;
+			}
+		}
+		else
+		{
+
+		}
+	}
+
+	CView::OnTimer(nIDEvent);
+}
+
+
+void CSATHelperView::OnCutBmp()
+{
+	// TODO: 在此添加命令处理程序代码
+	CaptureSingleImageAutoName(NULL, FALSE);
+}
+
+
+void CSATHelperView::OnCutJpg()
+{
+	// TODO: 在此添加命令处理程序代码
+	CaptureSingleImageAutoName(NULL, TRUE);
+}
+
+
+void CSATHelperView::OnStartRecord()
+{
+	// TODO: 在此添加命令处理程序代码
+	TCHAR szPath[MAX_PATH] = { 0 };
+	// 毫秒级;
+	time_point<system_clock, ::chrono::milliseconds> tp = time_point_cast<std::chrono::milliseconds>(system_clock::now());
+	auto tt = std::chrono::system_clock::to_time_t(tp);
+	std::tm now = { 0 };
+	localtime_s(&now, &tt); // 时间戳转成本地时间;
+	int msc = tp.time_since_epoch().count() % 1000;
+
+	_stprintf_s(szPath, _T("%s%04d%02d%02d%02d%02d%02d%03d"),
+#ifdef _DEBUG
+		_T("D:\\bin\\VideoCapture\\"),
+#else
+		Global::g_szCurModuleDir,
+#endif
+		now.tm_year + 1990,
+		now.tm_mon + 1,
+		now.tm_mday,
+		now.tm_hour,
+		now.tm_min,
+		now.tm_sec,
+		msc);
+
+	QRESULT QRet = QCAP_RS_SUCCESSFUL;
+	if (!m_bIsMp4) // 音频格式;
+	{
+		QRet = QCAP_SET_AUDIO_RECORD_PROPERTY(m_hVideoDevice, 0, QCAP_ENCODER_TYPE_SOFTWARE, QCAP_ENCODER_FORMAT_PCM);
+		_tcscat_s(szPath, _T(".avi"));
+	}
+	else
+	{
+		QRet = QCAP_SET_AUDIO_RECORD_PROPERTY(m_hVideoDevice, 0, QCAP_ENCODER_TYPE_SOFTWARE, QCAP_ENCODER_FORMAT_AAC);
+		_tcscat_s(szPath, _T(".mp4"));
+	}
+
+	// 设置视频属性;
+	QRet = QCAP_SET_VIDEO_RECORD_PROPERTY(
+		m_hVideoDevice,
+		0,
+		m_bSupportGPU ? QCAP_ENCODER_TYPE_INTEL_MEDIA_SDK : QCAP_ENCODER_TYPE_SOFTWARE,
+		QCAP_ENCODER_FORMAT_H264,
+		QCAP_RECORD_MODE_CBR,
+		8000,
+		16 * 1024 * 1024, // 16最高质量;
+		30, // 每秒多少帧
+		0,
+		0,
+		QCAP_DOWNSCALE_MODE_OFF);
+
+
+	// 开始录屏;
+	QRet = QCAP_START_RECORD(m_hVideoDevice, 0, szPath, QCAP_RECORD_FLAG_FULL, 0.0, 0.0, 0.0, 0, NULL);
+
+	m_bIsRecord = TRUE;
+}
+
+
+void CSATHelperView::OnStopRecord()
+{
+	// TODO: 在此添加命令处理程序代码
+	QCAP_STOP_RECORD(m_hVideoDevice, 0);
+	m_bIsRecord = FALSE;
+}
+
+
+void CSATHelperView::OnCheckVertically()
+{
+	// TODO: 在此添加命令处理程序代码
+	CMainFrame* pMain = (CMainFrame*)AfxGetMainWnd();
+	CMFCRibbonButton* pCheckbox = pMain->GetRibbonButton(ID_CHECK_VERTICALLY);
+	m_bVertically = !pCheckbox->IsChecked();
+	if (m_hVideoDevice)
+	{
+		QCAP_SET_VIDEO_MIRROR(m_hVideoDevice, m_bHoriontal, m_bVertically);
+	}
+}
+
+
+void CSATHelperView::OnCheckHoriontal()
+{
+	// TODO: 在此添加命令处理程序代码
+	CMainFrame* pMain = (CMainFrame*)AfxGetMainWnd();
+	CMFCRibbonButton* pCheckbox = pMain->GetRibbonButton(ID_CHECK_HORIONTAL);
+	m_bHoriontal = !pCheckbox->IsChecked();
+	if (m_hVideoDevice)
+	{
+		QCAP_SET_VIDEO_MIRROR(m_hVideoDevice, m_bHoriontal, m_bVertically);
+	}
+}
+
+
+void CSATHelperView::OnUpdateCheckVertically(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+	pCmdUI->SetCheck(m_bVertically);
+}
+
+
+void CSATHelperView::OnUpdateCheckHoriontal(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+	pCmdUI->SetCheck(m_bHoriontal);
+}
+
+
+void CSATHelperView::OnTraymenuReconnect()
+{
+	// TODO: 在此添加命令处理程序代码
+	HwUninitialize();// 断开;
+	Invalidate();
+	HwInitialize();// 重连;
+}
+
+
+void CSATHelperView::OnCheckSuportGpu()
+{
+	// TODO: 在此添加命令处理程序代码
+	CMainFrame* pMain = (CMainFrame*)AfxGetMainWnd();
+	CMFCRibbonButton* pCheckbox = pMain->GetRibbonButton(ID_CHECK_SUPORT_GPU);
+	m_bSupportGPU = !pCheckbox->IsChecked();
+}
+
+
+void CSATHelperView::OnCheckFormatMp4()
+{
+	CMainFrame* pMain = (CMainFrame*)AfxGetMainWnd();
+	CMFCRibbonButton* pCheckbox = pMain->GetRibbonButton(ID_CHECK_FORMAT_MP4);
+	m_bIsMp4 = !pCheckbox->IsChecked();
+}
+
+
+void CSATHelperView::OnCheckFormatAvi()
+{
+	CMainFrame* pMain = (CMainFrame*)AfxGetMainWnd();
+	CMFCRibbonButton* pCheckbox = pMain->GetRibbonButton(ID_CHECK_FORMAT_AVI);
+	m_bIsMp4 = pCheckbox->IsChecked();
+}
+
+
+void CSATHelperView::OnUpdateCheckSuportGpu(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+	pCmdUI->SetCheck(m_bSupportGPU);
+}
+
+
+void CSATHelperView::OnUpdateCheckFormatMp4(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+	pCmdUI->SetCheck(m_bIsMp4);
+}
+
+
+void CSATHelperView::OnUpdateCheckFormatAvi(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+	pCmdUI->SetCheck(!m_bIsMp4);
+}
+
+
+void CSATHelperView::OnUpdateStartRecord(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+	pCmdUI->Enable(!m_bIsRecord);
+}
+
+
+void CSATHelperView::OnUpdateStopRecord(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+	pCmdUI->Enable(m_bIsRecord);
+}

+ 22 - 0
SATHelper/SATHelper/SATHelperView.h

@@ -172,6 +172,28 @@ public:
 	void StartRecord(DWORD dwDuration, LPCTSTR lpSavePath);
 	void StopRecord();
 	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
+
+public:
+	void SetRibbonStatusBarText(CString strText, int uId);
+	friend class CMemoryClient;
+	afx_msg void OnTimer(UINT_PTR nIDEvent);
+	afx_msg void OnCutBmp();
+	afx_msg void OnCutJpg();
+	afx_msg void OnStartRecord();
+	afx_msg void OnStopRecord();
+	afx_msg void OnCheckVertically();
+	afx_msg void OnCheckHoriontal();
+	afx_msg void OnUpdateCheckVertically(CCmdUI* pCmdUI);
+	afx_msg void OnUpdateCheckHoriontal(CCmdUI* pCmdUI);
+	afx_msg void OnTraymenuReconnect();
+	afx_msg void OnCheckSuportGpu();
+	afx_msg void OnCheckFormatMp4();
+	afx_msg void OnCheckFormatAvi();
+	afx_msg void OnUpdateCheckSuportGpu(CCmdUI* pCmdUI);
+	afx_msg void OnUpdateCheckFormatMp4(CCmdUI* pCmdUI);
+	afx_msg void OnUpdateCheckFormatAvi(CCmdUI* pCmdUI);
+	afx_msg void OnUpdateStartRecord(CCmdUI* pCmdUI);
+	afx_msg void OnUpdateStopRecord(CCmdUI* pCmdUI);
 };
 
 #ifndef _DEBUG  // SATHelperView.cpp 中的调试版本

+ 12 - 0
SATHelper/SATHelper/config.ini

@@ -0,0 +1,12 @@
+[ir-device]
+;4.0路径
+redratpath=C:\Python27\Tools\RedRatHub-V4.28\RedRatHubCmd.exe
+
+;是否使用通用遥控信号
+generics=0
+
+;信号集路径
+signal=D:\SAT\resource\RCU
+
+;使用的信号集;
+use-signal=ARTEL_WZ_RC311_2841

File diff suppressed because it is too large
+ 0 - 0
SATHelper/SATHelper/res/ribbon.mfcribbon-ms


Some files were not shown because too many files changed in this diff