MFC学习记录 3.CListCtrl与CImageList

    技术2022-05-11  62

    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(hProcess0sFilenameMAX_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(NMHDRpNMHDRLRESULTpResult) {  NM_LISTVIEWpNMListView = (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


    最新回复(0)