// ProcessesDialog.cpp : implementation file // #include "stdafx.h" #include "systemstateinfo.h" #include "ProcessesDialog.h" #include "OXSysInfo.h" #include "OXProcess.h" #include "UTBStrOp.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CProcessesDialog dialog CProcessesDialog::CProcessesDialog() : CPageDialog() { //{{AFX_DATA_INIT(CProcessesDialog) m_nExpandLevel = 0; m_nExpandType = 1; //}}AFX_DATA_INIT } void CProcessesDialog::DoDataExchange(CDataExchange* pDX) { CPageDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CProcessesDialog) DDX_Control(pDX, IDC_SPIN_EXPANDLEVEL, m_spinExpandLevel); DDX_Control(pDX, IDC_EDIT_EXPANDLEVEL, m_editExpandLevel); DDX_Control(pDX, IDC_TREE_PROCESSES, m_tree); DDX_Text(pDX, IDC_EDIT_EXPANDLEVEL, m_nExpandLevel); DDX_Radio(pDX, IDC_RADIO_EXPANDLEVEL, m_nExpandType); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CProcessesDialog, CPageDialog) //{{AFX_MSG_MAP(CProcessesDialog) ON_BN_CLICKED(IDC_RADIO_EXPANDALL, OnRadioExpandall) ON_BN_CLICKED(IDC_RADIO_EXPANDLEVEL, OnRadioExpandlevel) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CProcessesDialog message handlers void CProcessesDialog::OnInitDialog() { CPageDialog::OnInitDialog(); // TODO: Add your specialized creation code here m_ilTree.Create(IDB_PROCESSES_TREE_IMAGE,16,1,RGB(255,0,255)); m_tree.SetImageList(&m_ilTree,TVSIL_NORMAL); LV_COLUMN lvc={ sizeof(lvc) }; lvc.fmt=LVCFMT_LEFT; lvc.cx=237; lvc.pszText=_T("Process image name"); lvc.mask = LVCF_FMT|LVCF_WIDTH|LVCF_TEXT; m_tree.SetColumn(0,&lvc); m_tree.InsertColumn(1,_T("Process ID"),LVCFMT_LEFT,200,1); // set COXTreeCtrl styles m_tree.ModifyExStyle(0,TVOXS_PICKANYWHERE|TVOXS_ROWSEL); m_tree.ModifyStyle(0,TVS_SHOWSELALWAYS|TVS_HASBUTTONS| TVS_HASLINES|TVS_LINESATROOT); // spin control m_spinExpandLevel.SetRange(0,1); m_spinExpandLevel.SetPos(0); // layout manager // m_LayoutManager.Attach(this); // tree control m_LayoutManager.TieChild(IDC_TREE_PROCESSES,OX_LMS_ANY,OX_LMT_SAME); ////////////////// // radio buttons and expand level edit control m_LayoutManager.TieChild(IDC_RADIO_EXPANDALL, OX_LMS_LEFT|OX_LMS_BOTTOM,OX_LMT_SAME); m_LayoutManager.TieChild(IDC_RADIO_EXPANDLEVEL, OX_LMS_LEFT|OX_LMS_BOTTOM,OX_LMT_SAME); m_LayoutManager.TieChild(IDC_EDIT_EXPANDLEVEL,OX_LMS_LEFT, OX_LMT_OPPOSITE,IDC_RADIO_EXPANDLEVEL); m_LayoutManager.TieChild(IDC_EDIT_EXPANDLEVEL,OX_LMS_BOTTOM,OX_LMT_SAME); m_LayoutManager.TieChild(IDC_SPIN_EXPANDLEVEL,OX_LMS_LEFT, OX_LMT_OPPOSITE,IDC_EDIT_EXPANDLEVEL); m_LayoutManager.TieChild(IDC_SPIN_EXPANDLEVEL,OX_LMS_BOTTOM,OX_LMT_SAME); ////////////////// ////////////////////////////////////// PopulateTree(); ShowControls(); } void CProcessesDialog::Refresh() { PopulateTree(); } void CProcessesDialog::PopulateTree() { if(!UpdateData()) return; CWaitCursor waitCursor; COXProcessIterator processIterator; if(!processIterator.MakeSnapshot()) return; m_tree.SetRedraw(FALSE); m_tree.DeleteAllItems(); // create fonts to customize tree items appearance LOGFONT lf; CFont fontRoot; CFont fontSubRoot; CFont* pFontRoot=GetFont(); if(pFontRoot->GetLogFont(&lf)) { lf.lfHeight=-14; UTBStr::tcsncpy(lf.lfFaceName,LF_FACESIZE,_T("Arial"),LF_FACESIZE); fontRoot.CreateFontIndirect(&lf); lf.lfHeight=-12; lf.lfWeight=FW_BOLD; UTBStr::tcsncpy(lf.lfFaceName,LF_FACESIZE,_T("Times New Roman"),LF_FACESIZE); fontSubRoot.CreateFontIndirect(&lf); } pFontRoot=((HFONT)fontRoot!=NULL) ? &fontRoot : NULL; CFont* pFontSubRoot=((HFONT)fontSubRoot!=NULL) ? &fontSubRoot : NULL; CString sValue; HTREEITEM htiRoot; HTREEITEM htiItem; COLORREF clrTopic=RGB(0,0,255); COLORREF clrValue=RGB(0,128,0); COXSysInfo m_SysInfo; HTREEITEM htiSelectItem=NULL; /////////////////////////////////////////////////// // for(int nIndex=0; nIndex0) { htiItem=InsertItem(_T("Version"),htiRoot); sValue.Format(_T("%d.%d"),HIWORD(dwVersion),LOWORD(dwVersion)); VERIFY(m_tree.SetSubItem(htiItem,1,OX_SUBITEM_TEXT|OX_SUBITEM_COLOR, sValue,0,NULL,clrValue)); } // priority boost BOOL bDisabled; if(processIterator.IsPriorityBoostDisabled(bDisabled)) { htiItem=InsertItem(_T("Priority Boost"),htiRoot); sValue=(bDisabled ? _T("Disabled") : _T("Enabled")); VERIFY(m_tree.SetSubItem(htiItem,1,OX_SUBITEM_TEXT|OX_SUBITEM_COLOR, sValue,0,NULL,clrValue)); } // creation time COleDateTime oleDateTime; if(processIterator.GetCreationTime(oleDateTime)) { htiItem=InsertItem(_T("Creation Time"),htiRoot); sValue=oleDateTime.Format(); VERIFY(m_tree.SetSubItem(htiItem,1,OX_SUBITEM_TEXT|OX_SUBITEM_COLOR, sValue,0,NULL,clrValue)); } // kernel time DWORDLONG timeSpent; if(processIterator.GetKernelTime(timeSpent) && timeSpent>0) { htiItem=InsertItem(_T("Kernel Time"),htiRoot); sValue.Format(_T("%d ms"),timeSpent/10000); VERIFY(m_tree.SetSubItem(htiItem,1,OX_SUBITEM_TEXT|OX_SUBITEM_COLOR, sValue,0,NULL,clrValue)); } // user time if(processIterator.GetUserTime(timeSpent) && timeSpent>0) { htiItem=InsertItem(_T("User Time"),htiRoot); sValue.Format(_T("%d ms"),timeSpent/10000); VERIFY(m_tree.SetSubItem(htiItem,1,OX_SUBITEM_TEXT|OX_SUBITEM_COLOR, sValue,0,NULL,clrValue)); } } ++processIterator; } // //////////////////////////////////////////////// ExpandTree((m_nExpandType==0 ? m_nExpandLevel : -1)); m_tree.SetFocus(); m_tree.SelectItem(htiSelectItem); m_tree.SetRedraw(TRUE); } void CProcessesDialog::ExpandTree(int nExpandLevel/*=-1*/, HTREEITEM htiParent/*=NULL*/) { if(nExpandLevel==0) return; if(htiParent==NULL) { htiParent=m_tree.GetRootItem(); ASSERT(htiParent!=NULL); } HTREEITEM hti=m_tree.GetNextItem(htiParent,TVGN_CHILD); while(hti!=NULL) { m_tree.Expand(hti,TVE_EXPAND); COXTreeItem* xti=m_tree.GetXItem(hti); ASSERT(xti!=NULL); if(xti->ItemHasChildren()) ExpandTree((nExpandLevel==-1 ? -1 : nExpandLevel-1),hti); hti=m_tree.GetNextItem(hti,TVGN_NEXT); } } HTREEITEM CProcessesDialog::InsertItem(CString sItem, HTREEITEM htiParent/*=NULL*/, int nImage/*=-1*/, CFont* pFont/*=NULL*/, COLORREF clr/*=CLR_NONE*/) { HTREEITEM hti=m_tree.InsertItem(sItem,htiParent); ASSERT(hti!=NULL); // associate new font if(pFont!=NULL) VERIFY(m_tree.SetItemFont(hti,pFont)); // and new color if(clr!=CLR_NONE) VERIFY(m_tree.SetItemColor(hti,clr)); m_tree.SetItemImage(hti,nImage,nImage); return hti; } void CProcessesDialog::ShowControls() { if(UpdateData()) { CWnd* pDlgItem=GetDlgItem(IDC_EDIT_EXPANDLEVEL); ASSERT(pDlgItem!=NULL); pDlgItem->EnableWindow((m_nExpandType==0)); pDlgItem=GetDlgItem(IDC_SPIN_EXPANDLEVEL); ASSERT(pDlgItem!=NULL); pDlgItem->EnableWindow((m_nExpandType==0)); } } void CProcessesDialog::OnRadioExpandall() { // TODO: Add your control notification handler code here ShowControls(); } void CProcessesDialog::OnRadioExpandlevel() { // TODO: Add your control notification handler code here ShowControls(); }