MFC学习记录 3.CListCtrl与CImageList

原创 2007年09月29日 13:51:00

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

MFC ADO用CListCtrl CImageList显示图片

这些天在弄MFC下的ADO图片保存到数据库的工作,确实MFC比较复杂,但功能也很多。此方法应该适用于大多数VC,未经证实! 1.图片如何保存到数据库中?     新建access数据库中,对表进行...

MFC重绘CListCtrl时DrawItem中绘制CimageList图片

这几天一直为ClistCtrl重绘后图片空

CListCtrl和CImageList配合显示缩略图

#pragma once #include "afxcmn.h" #define  THUMBNAIL_WIDTH 50 #define  THUMBNAIL_HEIGHT 50 // CDial...

在分割的视图内实现CListCtrl控件 结合CImageList实现图片的自动排列显示

先上一个效果图:   1.建立单文档视图工程 2.

MFC CListCtrl的学习

图标视图 每个项显示为一个大型图标(32 x 32像素)与标签在其下方。 用户可以通过拖动项添加到列表视图窗口中的任意位置。 小图标视图 每个项显示为一个小图标(16 x 16像素)与标签在右...

mfc中CImageList的使用

图像列表控件(CImageList)是相同大小图像的一个集合,每个集合中均以0为图像的索引序号基数,(可以把这些图标看成是以数组方式存储的),图像列表通常由大图标或位图构成,其中包含透明位图模式(实际...

MFC学习(11)MFC CListCtrl 使用介绍

列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值。MFC中使用CListCtrl类来封装列表控件的各种操作。通过调用 BOOL Create( DWORD...

MFC总结之CListCtrl用法及技巧

主要包括以下十三点内容:基本操作、获取选中行的行号、复选框操作、动态设置选中行的字体颜色、设置选中行的背景颜色、禁止拖动表头、让第一列居中显示、设置行高与字体、虚拟列表技术、点击表头时进行归类、向上与...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)