关闭

MFC学习记录 3.CListCtrl与CImageList

标签: mfclistlistviewnullpathvariables
3296人阅读 评论(0) 收藏 举报

MFC学习记录 3.CListCtrl与CImageList

利用MFC中封装好的CListCtrl和CImageList显示运行中的窗口列表
并实现了隐藏显示的功能

准备步骤
a.新建MFC对话框程序
b.在对话框编辑器中添加一个List Control及两个Button
c.在ClassWizard中的Member Variables中添加CListCtrl对应的成员变量m_Tree
d.在对话框头文件中添加私有成员
  private:
  
CImageList m_iml;


代码摘要
1.初始化CImageList、设置图像列表

成员函数:
CImageList::Create
CListCtrl::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::SetExtendedStyle
CListCtrl::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::Replace
CListCtrl::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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:34177次
    • 积分:565
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:0篇
    • 译文:0篇
    • 评论:7条
    文章分类
    最新评论