// 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;iSetColumnWidth(i,(int)dd); //设置当前的宽度 } } m_pLogList->UnlockWindowUpdate(); } */ if(gLogUpdate) { double dcx=cx-5; //对话框的总宽度 g_Column_cx if (m_pLogList != NULL) { for(int i=0;iSetColumnWidth(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(); } } } }