浏览代码

DevicesWnd中不嵌入对话框,直接在上面布局控件,原因:要使用DLL做语言包,在CPaneDock中嵌入对话框会出错,原因未明。

sat23 4 年之前
父节点
当前提交
a192c78631
共有 3 个文件被更改,包括 572 次插入8 次删除
  1. 1 0
      README.md
  2. 521 5
      SATHelper/SATHelper/DevicesWnd.cpp
  3. 50 3
      SATHelper/SATHelper/DevicesWnd.h

+ 1 - 0
README.md

@@ -1,2 +1,3 @@
 # scbc_repos
 
+## DLL多国语言问题:SATHelper工程中,如果在CDockablePane中嵌入CDialog的话,这个子窗口在DLL引用资源时会在Create时报错:原因未明

+ 521 - 5
SATHelper/SATHelper/DevicesWnd.cpp

@@ -17,6 +17,8 @@
 #include "MainFrm.h"
 #include "SATHelper.h"
 #include <filehelper.h>
+#include "SATClient.h"
+#include "SVNProc.h"
 
 #ifdef _DEBUG
 #undef THIS_FILE
@@ -37,7 +39,150 @@ extern CMainFrame* g_pMainFrame;
 
 CDevicesWnd::CDevicesWnd() noexcept
 {
-	m_nComboHeight = 0;
+	m_bEnd = FALSE;
+}
+
+int CDevicesWnd::InitCtrl()
+{
+	CRect rectDummy(0, 0, 50, 23);
+	m_lb_Actuator.Create(_T("执行器:"), SS_CENTER | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE, rectDummy, this, IDC_STATIC);
+	m_lb_IP.Create(_T("电视IP:"), SS_CENTER | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE, rectDummy, this, IDC_STATIC);
+	m_lb_TaskId.Create(_T("任务ID:"), SS_CENTER | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE, rectDummy, this, IDC_STATIC);
+	m_lb_TaskStatus.Create(_T("任务状态"), SS_CENTER | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE, rectDummy, this, IDC_STATIC);
+
+	if (!m_edit_TaskId.Create(WS_BORDER | WS_CHILD | WS_VISIBLE | ES_READONLY | WS_TABSTOP, rectDummy, this, TX_TASKID))
+	{
+		return -1;
+	}
+
+	if (!m_edit_Actuator.Create(WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, rectDummy, this, IDC_EDIT_RUNNER_NAME))
+	{
+		return -1;
+	}
+
+	if (!m_edit_TVIP.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP, CRect(0,0,135,23), this, LABLE_IP))
+	{
+		return -1;
+	}
+
+	if (!m_btnModify.Create(_T("修改"), WS_CHILD | WS_VISIBLE | WS_TABSTOP, rectDummy, this, BTN_MODIFY_RUNNER_NAME))
+	{
+		return -1;
+	}
+	
+	if (!m_btnAddAndroid.Create(_T("添加"), WS_CHILD | WS_VISIBLE | WS_TABSTOP, rectDummy, this, BTN_ADD_ANDROID))
+	{
+		return -1;
+	}
+
+	if (!m_btnMIInit.Create(_T("mi Init"), WS_CHILD | WS_VISIBLE | WS_TABSTOP, rectDummy, this, BTN_MI_INIT))
+	{
+		return -1;
+	}
+
+	if (!m_btnSCBCInit.Create(_T("scbc Init"), WS_CHILD | WS_VISIBLE | WS_TABSTOP, rectDummy, this, BTN_SCBC_INIT))
+	{
+		return -1;
+	}
+
+	if (!m_btnSVNUpdate.Create(_T("SAT Update"), WS_CHILD | WS_VISIBLE | WS_TABSTOP, rectDummy, this, BTN_SVN_UPDATE))
+	{
+		return -1;
+	}
+
+	if (!m_listDevices.Create(WS_CHILD | WS_VISIBLE| LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP, rectDummy, this, IDC_LIST_DEVICES))
+	{
+		return -1;
+	}
+
+	if (!m_listTask.Create(WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP, rectDummy, this, IDC_LIST_TASK))
+	{
+		return -1;
+	}
+
+	SetDlgItemText(IDC_EDIT_RUNNER_NAME, Global::g_Config.strActuator.c_str());
+
+	int nIndex = 0;
+	// 初始化设备列表;
+	m_listDevices.InsertColumn(nIndex, "类型");
+	m_listDevices.SetColumnWidth(nIndex++, 38);
+	m_listDevices.InsertColumn(nIndex, "TV名称");
+	m_listDevices.SetColumnWidth(nIndex++, 115);
+	m_listDevices.InsertColumn(nIndex, "状态");
+	m_listDevices.SetColumnWidth(nIndex++, 38);
+	m_listDevices.SetExtendedStyle(m_listDevices.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
+
+	// 初始化任务列表;
+	m_listTask.InsertColumn(0, "No");
+	m_listTask.SetColumnWidth(0, 25);
+	m_listTask.InsertColumn(1, "脚本名称");
+	m_listTask.SetColumnWidth(1, 130);
+	m_listTask.InsertColumn(2, "执行状态");
+	m_listTask.SetColumnWidth(2, 60);
+	m_listTask.InsertColumn(3, "结果状态");
+	m_listTask.SetColumnWidth(3, 60);
+	m_listTask.InsertColumn(4, "日志");
+	m_listTask.SetColumnWidth(4, 55);
+	m_listTask.SetExtendedStyle(m_listTask.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
+
+	COLORREF color = RGB(0x87, 0xCE, 0xFA);
+	// 修改按钮默认样式;
+	m_btnModify.m_bTransparent = FALSE;
+	m_btnModify.m_bDontUseWinXPTheme = TRUE;
+	// 设置背景色;
+	m_btnModify.SetFaceColor(color, TRUE);
+	// 消除单击时黑色内圈;
+	m_btnModify.m_bDrawFocus = FALSE;
+	// 设置按钮扁平样式;
+	m_btnModify.m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
+	// 设置鼠标形状;
+	m_btnModify.SetMouseCursorHand();
+
+	m_btnAddAndroid.m_bTransparent = FALSE;
+	m_btnAddAndroid.m_bDontUseWinXPTheme = TRUE;
+	// 设置背景色;
+	m_btnAddAndroid.SetFaceColor(color, TRUE);
+	// 消除单击时黑色内圈;
+	m_btnAddAndroid.m_bDrawFocus = FALSE;
+	// 设置按钮扁平样式;
+	m_btnAddAndroid.m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
+	// 设置鼠标形状;
+	m_btnAddAndroid.SetMouseCursorHand();
+
+	//color = RGB(0x87, 0xCE, 0xFA);
+	m_btnMIInit.m_bTransparent = FALSE;
+	m_btnMIInit.m_bDontUseWinXPTheme = TRUE;
+	// 设置背景色;
+	m_btnMIInit.SetFaceColor(color, TRUE);
+	// 消除单击时黑色内圈;
+	m_btnMIInit.m_bDrawFocus = FALSE;
+	// 设置按钮扁平样式;
+	m_btnMIInit.m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
+	// 设置鼠标形状;
+	m_btnMIInit.SetMouseCursorHand();
+
+	m_btnSCBCInit.m_bTransparent = FALSE;
+	m_btnSCBCInit.m_bDontUseWinXPTheme = TRUE;
+	// 设置背景色;
+	m_btnSCBCInit.SetFaceColor(color, TRUE);
+	// 消除单击时黑色内圈;
+	m_btnSCBCInit.m_bDrawFocus = FALSE;
+	// 设置按钮扁平样式;
+	m_btnSCBCInit.m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
+	// 设置鼠标形状;
+	m_btnSCBCInit.SetMouseCursorHand();
+
+	color = RGB(237, 28, 36);
+	m_btnSVNUpdate.m_bTransparent = FALSE;
+	m_btnSVNUpdate.m_bDontUseWinXPTheme = TRUE;
+	// 设置背景色;
+	m_btnSVNUpdate.SetFaceColor(color, TRUE);
+	// 消除单击时黑色内圈;
+	m_btnSVNUpdate.m_bDrawFocus = FALSE;
+	// 设置按钮扁平样式;
+	m_btnSVNUpdate.m_nFlatStyle = CMFCButton::FlatStyle::BUTTONSTYLE_FLAT;
+	// 设置鼠标形状;
+	m_btnSVNUpdate.SetMouseCursorHand();
 }
 
 CDevicesWnd::~CDevicesWnd()
@@ -49,6 +194,18 @@ CDevicesWnd::~CDevicesWnd()
 BEGIN_MESSAGE_MAP(CDevicesWnd, CDockablePane)
 	ON_WM_CREATE()
 	ON_WM_SIZE()
+	// 按钮;
+	ON_COMMAND(BTN_MODIFY_RUNNER_NAME, OnBtnActuatorClick)
+	ON_UPDATE_COMMAND_UI(BTN_MODIFY_RUNNER_NAME, OnUpdateBtnActuator)
+	ON_COMMAND(BTN_ADD_ANDROID, OnBtnAddTVIPClick)
+	ON_UPDATE_COMMAND_UI(BTN_ADD_ANDROID, OnUpdateBtnAddTVIP)
+	ON_COMMAND(BTN_MI_INIT, OnBtnMiInitClick)
+	ON_UPDATE_COMMAND_UI(BTN_MI_INIT, OnUpdateBtnMiInit)
+	ON_COMMAND(BTN_SCBC_INIT, OnBtnScbcInitClick)
+	ON_UPDATE_COMMAND_UI(BTN_SCBC_INIT, OnUpdateBtnScbcInit)
+	ON_COMMAND(BTN_SVN_UPDATE, OnBtnSATUpdateClick)
+	ON_UPDATE_COMMAND_UI(BTN_SVN_UPDATE, OnUpdateBtnSATUpdate)
+	// end
 	ON_COMMAND(ID_EXPAND_ALL, OnExpandAllProperties)
 	ON_UPDATE_COMMAND_UI(ID_EXPAND_ALL, OnUpdateExpandAllProperties)
 	ON_COMMAND(ID_SORTPROPERTIES, OnSortProperties)
@@ -60,8 +217,11 @@ BEGIN_MESSAGE_MAP(CDevicesWnd, CDockablePane)
 	ON_WM_SETFOCUS()
 	ON_WM_SETTINGCHANGE()
 	ON_WM_PAINT()
-	
+	ON_WM_CTLCOLOR()
 	ON_WM_CONTEXTMENU()
+	ON_COMMAND(ID_DEVICES_DEL, &CDevicesWnd::OnDevicesDel)
+	ON_NOTIFY(NM_DBLCLK, IDC_LIST_TASK, &CDevicesWnd::OnNMDblclkListTask)
+	ON_NOTIFY(NM_RCLICK, IDC_LIST_DEVICES, &CDlgService::OnNMRClickListDevices)
 END_MESSAGE_MAP()
 
 /////////////////////////////////////////////////////////////////////////////
@@ -73,11 +233,93 @@ void CDevicesWnd::AdjustLayout()
 	{
 		return;
 	}
-
+#if 0
 	CRect rectClient;
 	GetClientRect(rectClient);
 	m_dlgService.SetWindowPos(nullptr, rectClient.left, rectClient.top, rectClient.Width() - 5, rectClient.Height(), SWP_NOACTIVATE);
-
+#else
+	CRect rcCtrl;
+	// 获取窗口大小;
+	CRect rectClient;
+	// 控件;
+	GetClientRect(&rectClient);
+
+	int nWidth = 0;
+	const int dr = 3;		// 行间距
+	const int dc = 5; 		// 列间距;
+	const int top = 10;		// 离顶部距离;
+	const int margin = 6;
+	int nHeight = top;
+
+	// 第一行;
+	m_lb_Actuator.GetWindowRect(rcCtrl);
+	ScreenToClient(&rcCtrl);
+	m_lb_Actuator.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + top, rcCtrl.Width(), m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
+	nWidth = rcCtrl.Width() + margin + dc;
+
+	m_edit_Actuator.SetWindowPos(nullptr, nWidth, rectClient.top + top, (rectClient.Width() - nWidth - dc - margin) * 5 / 7, m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
+	m_edit_Actuator.GetWindowRect(rcCtrl);
+	nWidth += rcCtrl.Width() + dc;
+
+	m_btnModify.GetWindowRect(rcCtrl);
+	ScreenToClient(&rcCtrl);
+	m_btnModify.SetWindowPos(nullptr, nWidth, rectClient.top + top, rectClient.Width() - nWidth - margin, m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
+	nHeight += m_nNormalHeight + dr;
+
+	// 第二行;
+	m_lb_IP.GetWindowRect(rcCtrl);
+	ScreenToClient(&rcCtrl);
+	m_lb_IP.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + nHeight, rcCtrl.Width(), m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
+	nWidth = rcCtrl.Width() + margin + dc;
+
+	m_edit_TVIP.SetWindowPos(nullptr, nWidth, rectClient.top + nHeight, (rectClient.Width() - nWidth - dc - margin) * 5 / 7, m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
+	m_edit_TVIP.GetWindowRect(rcCtrl);
+	nWidth += rcCtrl.Width() + dc;
+
+	m_btnAddAndroid.GetWindowRect(rcCtrl);
+	ScreenToClient(&rcCtrl);
+	m_btnAddAndroid.SetWindowPos(nullptr, nWidth, rectClient.top + nHeight, rectClient.Width() - nWidth - margin, m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
+	nHeight += m_nNormalHeight + dr;
+
+	// 第三行;
+	m_listDevices.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + nHeight, rectClient.Width() - margin*2, 120, SWP_NOACTIVATE | SWP_NOZORDER);
+	m_listDevices.GetWindowRect(rcCtrl);
+	nHeight += 120 + dr;
+
+	// 第四行;
+	nWidth = (rectClient.Width() - margin * 2 - dc * 2) / 3;
+	m_btnMIInit.GetWindowRect(rcCtrl);
+	ScreenToClient(&rcCtrl);
+	m_btnMIInit.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + nHeight, nWidth, rcCtrl.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
+
+	m_btnMIInit.GetWindowRect(rcCtrl);
+	ScreenToClient(&rcCtrl);
+	m_btnSCBCInit.SetWindowPos(nullptr, rectClient.left + margin + nWidth + dc, rectClient.top + nHeight, nWidth, rcCtrl.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
+
+	m_btnSCBCInit.GetWindowRect(rcCtrl);
+	ScreenToClient(&rcCtrl);
+	m_btnSVNUpdate.SetWindowPos(nullptr, rectClient.left + margin + nWidth * 2 + dc * 2, rectClient.top + nHeight, nWidth, rcCtrl.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
+	nHeight += rcCtrl.Height() + 30;
+
+	// 第五行;
+	m_lb_TaskId.GetWindowRect(rcCtrl);
+	ScreenToClient(&rcCtrl);
+	nWidth = rcCtrl.Width();
+	m_lb_TaskId.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + nHeight, rcCtrl.Width(), m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
+
+
+	m_edit_TaskId.SetWindowPos(nullptr, rcCtrl.right + dc, rectClient.top + nHeight, rectClient.Width() - 2 * nWidth - margin * 2 - dc * 2, m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
+	m_edit_TaskId.GetWindowRect(rcCtrl);
+	ScreenToClient(&rcCtrl);
+
+	m_lb_TaskStatus.SetWindowPos(nullptr, rcCtrl.right + dc, rectClient.top + nHeight, nWidth, m_nNormalHeight, SWP_NOACTIVATE | SWP_NOZORDER);
+	nHeight += rcCtrl.Height() + dr;
+
+	// 第六行;
+	m_listTask.GetWindowRect(rcCtrl);
+	ScreenToClient(&rcCtrl);
+	m_listTask.SetWindowPos(nullptr, rectClient.left + margin, rectClient.top + nHeight, rectClient.Width() - margin*2, rectClient.Height() - nHeight - 10, SWP_NOACTIVATE | SWP_NOZORDER);
+#endif
 }
 
 int CDevicesWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
@@ -91,12 +333,15 @@ int CDevicesWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 	// 创建组合: 
 	const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_BORDER | CBS_SORT | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
 
+#if 0
 	if (!m_dlgService.Create(IDD_DLG_SERVICE, this))
 	{
 		TRACE0("未能创建遥控器主窗口 \n");
 		return -1;      // 未能创建
 	}
 	m_dlgService.ShowWindow(SW_SHOW);
+#endif
+	InitCtrl();
 
 	// 设置最小窗体;
 	SetMinSize((530, 260));
@@ -104,6 +349,91 @@ int CDevicesWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 	// 校正布局;
 	AdjustLayout();
 
+	SetCtrlFont();
+
+
+	std::thread t([](CDevicesWnd* p) {
+		while (!p->m_bEnd)
+		{
+			std::this_thread::sleep_for(std::chrono::milliseconds(2500));
+			{
+				CSATClient::GetInstance()->TCPQueryDevices(FALSE);
+				int nIndex = 0;
+				TCHAR szValue[MAX_PATH] = { 0 };
+				p->m_listDevices.DeleteAllItems();
+				for (std::vector<SATPROTO::Device>::iterator it = SATData::devices.begin(); it != SATData::devices.end(); it++) {
+					_itoa_s(nIndex, szValue, 10);
+					p->m_listDevices.InsertItem(nIndex, szValue);
+					if (it->nType == 0)
+						p->m_listDevices.SetItemText(nIndex, 0, "虚拟");
+					else if (it->nType == 1)
+						p->m_listDevices.SetItemText(nIndex, 0, "USB");
+					else if (it->nType == 2)
+						p->m_listDevices.SetItemText(nIndex, 0, "网络");
+					// 名称;
+					p->m_listDevices.SetItemText(nIndex, 1, it->szName);
+
+					if (it->nStatus == 0)
+						p->m_listDevices.SetItemText(nIndex, 2, "在线");
+					else if (it->nStatus == 1)
+						p->m_listDevices.SetItemText(nIndex, 2, "离线");
+					else if (it->nStatus == 2)
+						p->m_listDevices.SetItemText(nIndex, 2, "掉线");
+					else if (it->nStatus == 3)
+						p->m_listDevices.SetItemText(nIndex, 2, "未认证");
+					nIndex++;
+				}
+			}
+		}
+		OutputDebugString("退出刷新设备线程\n");
+		}, this);
+	t.detach();
+
+	std::thread t2([](CDevicesWnd* p) {
+		while (!p->m_bEnd)
+		{
+			std::this_thread::sleep_for(std::chrono::milliseconds(10000));
+			{
+				CSATClient::GetInstance()->TCPQueryTasks(FALSE);
+				int nIndex = 0;
+				p->m_listTask.DeleteAllItems();
+				TCHAR szValue[MAX_PATH] = { 0 };
+
+				for (int i = 0; i < SATData::task_resp.nSize; i++) {
+					// 任务编号;
+					p->m_edit_TaskId.SetWindowText(_T(""));
+					p->m_edit_TaskId.SetWindowText(SATData::task_resp.ssTasks[i].szTaskNo);
+					// 任务状态;
+					p->m_lb_TaskStatus.SetWindowText(_T(""));
+					p->m_lb_TaskStatus.SetWindowText(SATData::task_resp.ssTasks[i].szStatus);
+
+					if (SATData::task_resp.ssTasks[i].nCaseSize) {
+						// 遍历出所有用例;
+						TCHAR szIndex[8] = { 0 };
+						// 脚本数量;
+						int nSize = SATData::task_resp.ssTasks[i].nCaseSize;
+						if (nSize > SATPROTO::MAX_CASES)
+							nSize = SATPROTO::MAX_CASES;
+						for (int k = 0; k < nSize; k++) {
+							_itoa_s(k, szIndex, 10);
+							SATPROTO::CaseInfo& caseInfo = SATData::task_resp.ssTasks[i].ssCases[k];
+							p->m_listTask.InsertItem(nIndex, szIndex);
+							p->m_listTask.SetItemText(nIndex, 1, caseInfo.szCaseName);
+							p->m_listTask.SetItemText(nIndex, 2, caseInfo.szExecStatus);
+							p->m_listTask.SetItemText(nIndex, 3, caseInfo.szResultStatus);
+							p->m_listTask.SetItemText(nIndex, 4, caseInfo.szCaseLogPath);
+						}
+					}
+
+					nIndex++;
+				}
+			}
+		}
+
+		OutputDebugString("退出刷新任务线程\n");
+		}, this);
+	t2.detach();
+
 	return 0;
 }
 
@@ -166,7 +496,7 @@ void CDevicesWnd::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
 	//SetPropListFont();
 }
 
-void CDevicesWnd::SetPropListFont()
+void CDevicesWnd::SetCtrlFont()
 {
 	::DeleteObject(m_fntPropList.Detach());
 
@@ -185,6 +515,21 @@ void CDevicesWnd::SetPropListFont()
 	m_fntPropList.CreateFontIndirect(&lf);
 
 	//m_wndObjectCombo.SetFont(&m_fntPropList);
+	m_lb_Actuator.SetFont(&m_fntPropList);
+	m_lb_IP.SetFont(&m_fntPropList);
+	m_edit_Actuator.SetFont(&m_fntPropList);
+	m_edit_TVIP.SetFont(&m_fntPropList);
+	m_btnModify.SetFont(&m_fntPropList);
+	m_btnAddAndroid.SetFont(&m_fntPropList);
+	m_listDevices.SetFont(&m_fntPropList);
+	m_btnMIInit.SetFont(&m_fntPropList);
+	m_btnSCBCInit.SetFont(&m_fntPropList);
+	m_btnSVNUpdate.SetFont(&m_fntPropList);
+	m_listTask.SetFont(&m_fntPropList);
+
+	m_lb_TaskId.SetFont(&m_fntPropList);
+	m_edit_TaskId.SetFont(&m_fntPropList);
+	m_lb_TaskStatus.SetFont(&m_fntPropList);
 }
 
 // 如果CDockablePane无控件,改变大小时背景会刷新失败;
@@ -206,3 +551,174 @@ void CDevicesWnd::OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/)
 {
 	// TODO: 在此处添加消息处理程序代码
 }
+
+
+HBRUSH CDevicesWnd::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
+{
+	HBRUSH hbr = CDockablePane::OnCtlColor(pDC, pWnd, nCtlColor);
+
+	// TODO:  在此更改 DC 的任何特性
+	if (nCtlColor == CTLCOLOR_STATIC || pWnd->GetDlgCtrlID() == IDC_STATIC) //静态文本颜色,并且指定控件ID号    && pWnd->GetDlgCtrlID() == IDC_STATIC   
+	{
+		pDC->SetTextColor(RGB(255, 0, 0));
+		//pDC->SetBkColor(RGB(191,219,255));     //静态控件的背景颜色设置,红字蓝底。          
+		pDC->SetBkMode(TRANSPARENT);  //静态文本框背景设置为透明
+		HBRUSH brush;
+		brush = CreateSolidBrush(0xFFEFD5);//对话框的RGB值
+		hbr = (HBRUSH)brush;
+	}
+
+	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
+	return hbr;
+}
+
+void CDevicesWnd::OnBtnActuatorClick()
+{
+	CString strActuator;
+	GetDlgItemText(IDC_EDIT_RUNNER_NAME, strActuator);
+
+	Global::g_Config.strActuator = strActuator.GetString();
+	WritePrivateProfileString(_T("SATService"), _T("Actuator"), strActuator, Global::g_szConfig);
+	CSATClient::GetInstance()->TCPLogin(Global::g_Config.strSATUserName, Global::g_Config.strSATPassword, Global::g_Config.strActuator);
+}
+
+void CDevicesWnd::OnUpdateBtnActuator(CCmdUI* pCmdUI)
+{
+}
+
+void CDevicesWnd::OnBtnAddTVIPClick()
+{
+	// 获取IP地址;
+	BYTE nf1, nf2, nf3, nf4;
+	m_edit_TVIP.GetAddress(nf1, nf2, nf3, nf4);
+	CString str;
+	str.Format("%d.%d.%d.%d", nf1, nf2, nf3, nf4);//这里的nf得到的值是IP值了
+	if (str.IsEmpty())
+		return;
+
+	CSATClient::GetInstance()->TCPAddDevice(str.GetString());
+}
+
+void CDevicesWnd::OnUpdateBtnAddTVIP(CCmdUI* pCmdUI)
+{
+}
+
+void CDevicesWnd::OnBtnMiInitClick()
+{
+	if (Global::g_Config.strMIInitBat.size())
+	{
+		//WinExec(Global::g_Config.strMIInitBat.c_str(), SW_HIDE);
+		ShellExecute(NULL, _T("open"), Global::g_Config.strMIInitBat.c_str(), NULL, NULL, SW_SHOW);
+	}
+}
+
+void CDevicesWnd::OnUpdateBtnMiInit(CCmdUI* pCmdUI)
+{
+
+}
+
+void CDevicesWnd::OnBtnScbcInitClick()
+{
+	if (Global::g_Config.strSCBCInitBat.size())
+	{
+		// TODO: 在此添加控件通知处理程序代码
+		//WinExec(Global::g_Config.strMIInitBat.c_str(), SW_HIDE);
+		ShellExecute(NULL, _T("open"), Global::g_Config.strSCBCInitBat.c_str(), NULL, NULL, SW_SHOW);
+	}
+}
+
+void CDevicesWnd::OnUpdateBtnScbcInit(CCmdUI* pCmdUI)
+{
+}
+
+void CDevicesWnd::OnBtnSATUpdateClick()
+{
+	CSVNMgr::GetInstance()->Update();
+	if (CSVNMgr::GetInstance()->HasNewVersion())
+	{
+		// 还要更新,则表示失败;
+		MessageBox(_T("更新失败"), _T("更新结果:"), MB_OK | MB_ICONWARNING);
+	}
+	else
+	{
+		MessageBox(_T("更新成功,版本号为 ") + CSVNMgr::GetInstance()->GetVersion(), _T("更新结果:"), MB_OK);
+		CString strVersionInfo;
+		strVersionInfo.Format(_T("SATHelper 版本 %s, SAT 版本 %s"), Global::g_szVersion, CSVNMgr::GetInstance()->GetVersion());
+		AfxGetMainWnd()->SetWindowText(strVersionInfo);
+		CSVNMgr::GetInstance()->Store();
+	}
+}
+
+void CDevicesWnd::OnUpdateBtnSATUpdate(CCmdUI* pCmdUI)
+{
+}
+
+
+void CDevicesWnd::OnNMRClickListDevices(NMHDR* pNMHDR, LRESULT* pResult)
+{
+	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
+	// TODO: 在此添加控件通知处理程序代码
+	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
+	if (pNMListView->iItem != -1)
+	{
+		CString strType = m_listDevices.GetItemText(pNMListView->iItem, 0);
+		// 过滤掉虚拟设备;
+		if (!strType.CompareNoCase(_T("虚拟")))
+			return;
+
+		DWORD dwPos = GetMessagePos();
+		CPoint point(LOWORD(dwPos), HIWORD(dwPos));
+		CMenu menu;
+		//添加线程操作
+		if (!menu.LoadMenu(IDR_POPUP_DEVICES))			//这里是我们在1中定义的MENU的文件名称
+			return;
+		CMenu* popup = menu.GetSubMenu(0);
+		ASSERT(popup != NULL);
+		popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
+	}
+
+	*pResult = 0;
+}
+
+
+void CDevicesWnd::OnNMDblclkListTask(NMHDR* pNMHDR, LRESULT* pResult)
+{
+	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
+	// TODO: 在此添加控件通知处理程序代码
+	*pResult = 0;
+
+	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
+	if (pNMListView->iItem != -1)
+	{
+		CString strLogPath = m_listTask.GetItemText(pNMListView->iItem, 4);
+		// 路径不存在,退出;
+		if (!PathFileExists(strLogPath))
+			return;
+
+		ShellExecute(NULL, _T("open"), strLogPath.GetString(), NULL, NULL, SW_SHOW);
+	}
+}
+
+
+void CDevicesWnd::OnDevicesDel()
+{
+	// TODO: 在此添加命令处理程序代码
+	// 获取选中的设备;
+	POSITION pos = m_listDevices.GetFirstSelectedItemPosition();
+	if (pos != NULL)
+	{
+		int nSelCur = m_listDevices.GetNextSelectedItem(pos);
+		if (nSelCur != -1)
+		{
+			CString strDeviceType = m_listDevices.GetItemText(nSelCur, 0);
+			CString strDeviceName = m_listDevices.GetItemText(nSelCur, 1);
+			if (!strDeviceName.IsEmpty() && strDeviceType.CompareNoCase(_T("虚拟")))
+			{
+				MessageBox(_T("即将删除设备:") + strDeviceName, _T("温馨提示!"), MB_ICONWARNING);
+				CSATClient::GetInstance()->TCPDelDevice(strDeviceName.GetString());
+				// 同时删除该项;
+				m_listDevices.DeleteItem(nSelCur);
+			}
+		}
+	}
+}

+ 50 - 3
SATHelper/SATHelper/DevicesWnd.h

@@ -36,10 +36,34 @@ public:
 public:
 
 protected:
+	BOOL m_bEnd;
 	CFont m_fntPropList;
 	// 对话框;
+#if 1
 	CDlgService m_dlgService;
-	
+#endif
+
+	// 控件;
+	CStatic m_lb_Actuator;
+	CStatic m_lb_IP;
+	CEdit m_edit_Actuator;
+	CIPAddressCtrl m_edit_TVIP;
+	CMFCButton m_btnModify;
+	CMFCButton m_btnAddAndroid;
+
+	CListCtrl m_listDevices;
+	CMFCButton m_btnMIInit;
+	CMFCButton m_btnSCBCInit;
+	CMFCButton m_btnSVNUpdate;
+
+	CListCtrl m_listTask;
+
+	CStatic m_lb_TaskId;
+	CEdit m_edit_TaskId;
+	CStatic m_lb_TaskStatus;
+
+	// 初始化控件;
+	int InitCtrl();
 // 实现
 public:
 	virtual ~CDevicesWnd();
@@ -51,6 +75,7 @@ public:
 	//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);
@@ -67,13 +92,35 @@ protected:
 
 	DECLARE_MESSAGE_MAP()
 
-	void SetPropListFont();
+	void SetCtrlFont();
 
-	int m_nComboHeight;
+	int m_nNormalHeight = 23;
 
 public:
 	afx_msg void OnPaint();
 	// 重载(禁用面板自带菜单)
 	afx_msg void OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/);
+	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
+
+	// 控件事件;
+	afx_msg void OnBtnActuatorClick();
+	afx_msg void OnUpdateBtnActuator(CCmdUI* pCmdUI);
+
+	afx_msg void OnBtnAddTVIPClick();
+	afx_msg void OnUpdateBtnAddTVIP(CCmdUI* pCmdUI);
+
+	afx_msg void OnBtnMiInitClick();
+	afx_msg void OnUpdateBtnMiInit(CCmdUI* pCmdUI);
+
+	afx_msg void OnBtnScbcInitClick();
+	afx_msg void OnUpdateBtnScbcInit(CCmdUI* pCmdUI);
+
+	afx_msg void OnBtnSATUpdateClick();
+	afx_msg void OnUpdateBtnSATUpdate(CCmdUI* pCmdUI);
+
+	// list事件;
+	afx_msg void OnNMDblclkListTask(NMHDR* pNMHDR, LRESULT* pResult);
+	afx_msg void OnNMRClickListDevices(NMHDR* pNMHDR, LRESULT* pResult);
+	afx_msg void OnDevicesDel();
 };