MFC学习记录 3.CListCtrl与CImageList
利用MFC中封装好的CListCtrl和CImageList显示运行中的窗口列表并实现了隐藏显示的功能
准备步骤a.新建MFC对话框程序b.在对话框编辑器中添加一个List Control及两个Buttonc.在ClassWizard中的Member Variables中添加CListCtrl对应的成员变量m_Treed.在对话框头文件中添加私有成员 private: CImageList m_iml;
代码摘要1.初始化CImageList、设置图像列表成员函数:CImageList::CreateCListCtrl::SetImageList示例:BOOL CMfc2Dlg::OnInitDialog(){ //... m_iml.Create(16,16,ILC_COLOR32 | ILC_MASK,20,20); m_List.ModifyStyle(NULL,LVS_REPORT); m_List.SetImageList(&m_iml,LVSIL_SMALL);}
2.设置视图的扩展风格、添加列表头成员函数:CListCtrl::SetExtendedStyleCListCtrl::InsertColumn示例:BOOL CMfc2Dlg::OnInitDialog(){ //... m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES); m_List.InsertColumn(COLUMN_TITLE,"Title",LVCFMT_LEFT,180); m_List.InsertColumn(COLUMN_CLASS,"Class",LVCFMT_LEFT,100); m_List.InsertColumn(COLUMN_HWND,"hwnd",LVCFMT_LEFT,70); m_List.InsertColumn(COLUMN_FILE,"File",LVCFMT_LEFT,220);}
3.向列表视图中添加窗口列表成员函数:CImageList::ReplaceCListCtrl::InsertItem示例:
int i=0; HWND hDesktop=::GetDesktopWindow(); HWND hWnd=::GetWindow(hDesktop,GW_CHILD); TCHAR sTitle[MAX_PATH]; HICON hIcon; BOOL bShow=TRUE; LONG idx; TCHAR sFilename[MAX_PATH]; TCHAR sClass[MAX_PATH]; CString sHwnd; BOOL bVisible; m_iml.SetImageCount(0); m_List.DeleteAllItems(); while ( i<1000 && hWnd!=NULL ) { bShow=TRUE; if (!::GetWindowTextLength(hWnd)) bShow=FALSE; if (!::IsWindowEnabled(hWnd)) bShow=FALSE; if (!::GetWindow(hWnd,GW_CHILD)) bShow=FALSE; if (bShow) { ::GetWindowText(hWnd,sTitle,MAX_PATH); ::GetClassName(hWnd,sClass,MAX_PATH); ULONG pid; HANDLE hProcess; ::GetWindowThreadProcessId(hWnd,&pid); hProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); ::GetModuleFileNameEx(hProcess, 0, sFilename, MAX_PATH); ::CloseHandle(hProcess); hIcon=(HICON)::SendMessage(hWnd,WM_GETICON,ICON_SMALL,NULL); if ((LONG)hIcon==NULL) hIcon=(HICON)::SendMessage(hWnd,WM_GETICON,ICON_BIG,NULL); if ((LONG)hIcon==NULL) { hIcon=::ExtractIcon(NULL,sFilename,0); } if ((LONG)hIcon==NULL) hIcon=m_hIcon; idx=m_iml.Replace(-1,hIcon); sHwnd.Format("%d",(ULONG)hWnd); m_List.InsertItem(idx,sTitle,idx); m_List.SetItemText(idx,1,sClass); m_List.SetItemText(idx,2,sHwnd); m_List.SetItemText(idx,3,sFilename); bVisible=::IsWindowVisible(hWnd); m_List.SetCheck(idx,bVisible); } hWnd=::GetWindow(hWnd,GW_HWNDNEXT); ++i; }
4.响应列表视图中改变Check的消息在ClassWizard中为IDC_LIST1添加LVN_ITEMCHANGED消息响应示例:void CMfc2Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here if (pNMListView->uOldState == 0 && pNMListView->uNewState == 0) return; // No change BOOL bPrevState = (BOOL)(((pNMListView->uOldState & LVIS_STATEIMAGEMASK)>>12)-1); // Old check box state if (bPrevState < 0) // On startup there's no previous state bPrevState = 0; // so assign as false (unchecked) // New check box state BOOL bChecked=(BOOL)(((pNMListView->uNewState & LVIS_STATEIMAGEMASK)>>12)-1); if (bChecked < 0) // On non-checkbox notifications assume false bChecked = 0; if (bPrevState == bChecked) // No change in check box return; //……bChecked即是现在的选中状态,处理之,示例代码如下: CString sHwnd; UINT uItem=pNMListView->iItem; HWND hWndChecked; sHwnd=m_List.GetItemText(uItem,COLUMN_HWND); hWndChecked=(HWND)atoi(sHwnd); if(bChecked) ::ShowWindow(hWndChecked,SW_SHOW); else ::ShowWindow(hWndChecked,SW_HIDE); *pResult = 0;}
源代码mfc_study_3.zip(37KB)http://atlab.cn/down/mfc_study_3.zip