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

328 lines
8.3 KiB
C++

// LogView.cpp : implementation file
//
#include "stdafx.h"
#include "Client.h"
#include "LogView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CLogView* g_pLogView;
typedef struct
{
char *title;
int nWidth;
}COLUMNSTRUCT;
COLUMNSTRUCT g_Log_Data[] =
{
{"发生时间", 150 },
{"事件记录", 650 }
};
int g_Log_Width = 0;
int g_Log_Count = (sizeof(g_Log_Data) / 8);
BOOL gLogUpdate = FALSE;
/////////////////////////////////////////////////////////////////////////////
// CLogView
IMPLEMENT_DYNCREATE(CLogView, CListView)
CLogView::CLogView()
{
g_pLogView = this;
}
CLogView::~CLogView()
{
}
BEGIN_MESSAGE_MAP(CLogView, CListView)
//{{AFX_MSG_MAP(CLogView)
ON_WM_SIZE()
ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
ON_COMMAND(IDM_EVENT_DELETE, OnEventDelete)
ON_COMMAND(IDM_ALL_DELETE, OnAllDelete)
ON_COMMAND(IDM_EVENT_SAVE, OnEventSave)
ON_COMMAND(IDM_EVENT_COPY, OnEventCopy)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLogView drawing
void CLogView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CLogView diagnostics
#ifdef _DEBUG
void CLogView::AssertValid() const
{
CListView::AssertValid();
}
void CLogView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLogView message handlers
void CLogView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
m_pLogList = &GetListCtrl();
m_pLogList->SetRedraw(FALSE);
I_LogList.Create(16, 16, ILC_COLOR32|ILC_MASK,10, 0);
HICON hIcon = NULL;//以下为加入3个图标资源
//声明0
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_SHENGMING), IMAGE_ICON, 16, 16, 0);
I_LogList.Add(hIcon);
DestroyIcon(hIcon);
//上线1
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_SHANGXIAN), IMAGE_ICON, 16, 16, 0);
I_LogList.Add(hIcon);
DestroyIcon(hIcon);
//下线2
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_XIAXIAN), IMAGE_ICON, 16, 16, 0);
I_LogList.Add(hIcon);
DestroyIcon(hIcon);
//重复上线3
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_CHONGFUSHANGXIAN), IMAGE_ICON, 16, 16, 0);
I_LogList.Add(hIcon);
DestroyIcon(hIcon);
//监听成功4
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_JIANTINGCHENGGONG), IMAGE_ICON, 16, 16, 0);
I_LogList.Add(hIcon);
DestroyIcon(hIcon);
//监听失败5
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_JIANTINGSHIBAI), IMAGE_ICON, 16, 16, 0);
I_LogList.Add(hIcon);
DestroyIcon(hIcon);
ListView_SetImageList(m_pLogList->m_hWnd, I_LogList, LVSIL_SMALL);
m_pLogList->SetExtendedStyle(/*LVIF_PARAM |*/ LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP|/*LVS_EX_FLATSB|*/
LVS_EX_ONECLICKACTIVATE | LVS_EX_UNDERLINEHOT |LVS_EX_SUBITEMIMAGES/* |LVS_EX_GRIDLINES*/);
for (int i = 0; i < g_Log_Count; i++)
{
m_pLogList->InsertColumn(i, g_Log_Data[i].title);
g_Log_Width += g_Log_Data[i].nWidth; // 总宽度
}
gLogUpdate = TRUE;
HWND hWndHeader = m_pLogList->GetDlgItem(0)->GetSafeHwnd();
m_heades.SubclassWindow(hWndHeader);
// m_heades.SetTheme(new CXTHeaderCtrlThemeOffice2003());
m_pLogList->SetRedraw(TRUE);
//主要调用OnSize函数
CRect rect ;
this->GetWindowRect( rect );
ScreenToClient( rect ) ;
this->OnSize(SIZE_RESTORED,rect.Width(),rect.Height());
}
BOOL CLogView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
cs.style |= LVS_REPORT;
return CListView::PreCreateWindow(cs);
}
void CLogView::OnSize(UINT nType, int cx, int cy)
{
CListView::OnSize(nType, cx, cy);
/*
if(gLogUpdate)
{
m_pLogList->LockWindowUpdate();
double dcx=(double)(cx-5)/g_Log_Width;
if (m_pLogList != NULL)
{
for(int i=0;i<g_Log_Count;i++){ //遍历每一个列
double dd=g_Log_Data[i].nWidth; //得到当前列的宽度
dd = dd*dcx;
m_pLogList->SetColumnWidth(i,(int)dd); //设置当前的宽度
}
}
m_pLogList->UnlockWindowUpdate();
}
*/
if(gLogUpdate)
{
double dcx=cx-5; //对话框的总宽度 g_Column_cx
if (m_pLogList != NULL)
{
for(int i=0;i<g_Log_Count;i++){ //遍历每一个列
double dd=g_Log_Data[i].nWidth; //得到当前列的宽度
dd/=g_Log_Width; //看一看当前宽度占总长度的几分之几
dd*=dcx; //用原来的长度乘以所占的几分之几得到当前的宽度
m_pLogList->SetColumnWidth(i,(int)dd); //设置当前的宽度
}
}
}
}
void CLogView::g_ColumnWidth()
{
}
void CLogView::InsertLogItem(LPCTSTR Text,int Mode, int Flag)
{
char m_Text[512] = {0};
CTime time = CTime::GetCurrentTime(); //构造CTime对象
CString strTime = time.Format(" %Y-%m-%d %H:%M:%S");
m_pLogList->InsertItem(0, strTime, Flag);//int InsertItem( int nItem, LPCTSTR lpszItem, int nImage );
m_pLogList->SetItemText(0, 1, Text); //BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );
//根据列表颜色改变日志颜色
m_pLogList->SetItemData(0, Mode);
}
void CLogView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
*pResult = 0;
CMenu popup;
popup.LoadMenu(IDR_LOG);
CMenu* pM = popup.GetSubMenu(0);
CPoint p;
GetCursorPos(&p);
// pM->TrackPopupMenu(TPM_LEFTALIGN, p.x, p.y, this);
CXTPCommandBars::TrackPopupMenu(pM,TPM_RIGHTBUTTON,p.x,p.y,this);
}
void CLogView::OnEventDelete()
{
// TODO: Add your command handler code here
POSITION pos = m_pLogList->GetFirstSelectedItemPosition();
if (pos == NULL)
{
::MessageBox(NULL,"请先选择要删除的事件记录 ...","提示",MB_ICONINFORMATION);
return;
}
else
{
while (pos)
{
int nItem = m_pLogList->GetNextSelectedItem(pos);
m_pLogList->DeleteItem(nItem);
pos = m_pLogList->GetFirstSelectedItemPosition();
}
}
}
void CLogView::OnAllDelete()
{
// TODO: Add your command handler code here
m_pLogList->DeleteAllItems();
}
void CLogView::OnEventSave()
{
// TODO: Add your command handler code here
POSITION pos = m_pLogList->GetFirstSelectedItemPosition();
if (pos == NULL)
{
::MessageBox(NULL,"请先选择要保存的事件记录 ...","提示",MB_ICONINFORMATION);
return;
}
else
{
CTime time = CTime::GetCurrentTime(); ///构造CTime对象
CString strTime = time.Format("%Y-%m-%d %H-%M-%S");
CFileDialog dlg(FALSE, _T("log"), strTime, OFN_OVERWRITEPROMPT, _T("*.log|*.log|*.txt|*.log"), NULL);
if (dlg.DoModal() != IDOK)
return;
CFile file;
char strip[50] = {0};
if (file.Open(dlg.GetPathName(), CFile::modeCreate | CFile::modeWrite))
{
while (pos)
{
int nItem = m_pLogList->GetNextSelectedItem(pos);
CString strTitle;
strTitle.Format(_T("时间:%s 事件:%s"), m_pLogList->GetItemText(nItem, 0),m_pLogList->GetItemText(nItem, 1));
char *strip = strTitle.GetBuffer(strTitle.GetLength() + 1); //CString转换为char*
strTitle.ReleaseBuffer();
strcat(strip, "\r\n");
file.Write(strip, strlen(strip));
memset(strip, 0, 50);
}
file.Close();
strTime = time.Format("[%Y-%m-%d %H:%M:%S]") + " 日志导出成功 ...";
::MessageBox(0,strTime,"提示",MB_ICONINFORMATION);
}
}
}
void CLogView::OnEventCopy()
{
// TODO: Add your command handler code here
int nItem;
CString strText(_T(""));
POSITION pos = m_pLogList->GetFirstSelectedItemPosition();
if (pos == NULL)
{
::MessageBox(NULL,"请先选择要复制的事件记录 ...","提示",MB_ICONINFORMATION);
return;
}
else
{
//获取所有选中项目的内容。
while (pos)
{
nItem = m_pLogList->GetNextSelectedItem(pos);
strText += m_pLogList->GetItemText(nItem, 0) + " ";
strText += m_pLogList->GetItemText(nItem, 1) + _T("\r\n");
}
//将内容保存到剪贴板。
if (!strText.IsEmpty())
{
if (OpenClipboard())
{
EmptyClipboard();
HGLOBAL hClipboardData = GlobalAlloc(GHND | GMEM_SHARE, (strText.GetLength() + 1) * sizeof(TCHAR));
if (hClipboardData)
{
TCHAR* pszData = (TCHAR *)GlobalLock(hClipboardData);
_tcscpy(pszData, strText);
GlobalUnlock(hClipboardData);
SetClipboardData(CF_TEXT, hClipboardData);
}
CloseClipboard();
}
}
}
}