CListCtrl使用详解
ListCtrl 是MFC编程常用的控件,作为数据库的前台表现形式非常直观,因此得到广泛的使用.
一、对话框里添加CListCtrl控件
如果想要在对话框初始化时生成ListCtrl,那么首先在该对话框的CPP文件对应的头文件(.h)里声明CListCtrl类型的变量m_ListDisplay,并与控件ID关联.(也可以用classwizard,给对应控件添加CListCtrl变量类型实现.)
然后就在以下函数里添加代码:
BOOL CPhoneBookDlg::OnInitDialog()
{
//.........(其它代码)
m_ListDisplay.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_ListDisplay.InsertColumn(0,"Last Name",LVCFMT_LEFT,90);
m_ListDisplay.InsertColumn(1,"First Name",LVCFMT_LEFT,90);
m_ListDisplay.InsertColumn(2,"Number",LVCFMT_LEFT,100);
m_ListDisplay.InsertColumn(3,"AccountIndex",LVCFMT_LEFT,90);
//.......(其它代码)
}
如果想只创建临时的ListCtrl,那么可以在函数的局部内先生成指向该控件的指针.如下:
CListCtrl* m_ListDisplay= (CListCtrl*)GetDlgItem(IDC_LIST);即可
二、在单文档工程里添加CListCtrl控件:
首先在该工程的CxxView类里添加虚函数OnInitialUpdate(),然后在此函数里添加代码
void      CPhoneBookDlg::OnInitialUpdate()   
{ 
CView::OnInitialUpdate(); 
CRect      rect; 
GetClientRect(rect); 
rect.top+=0; 
m_ListDisplay.Create(WS_CHILD ¦WS_VISIBLE ¦WS_BORDER ¦LVS_REPORT,rect,this,1); 
m_ListDisplay.SetBkColor(RGB(255,255,255)); 
m_ListDisplay.SetTextColor(RGB(0,0,0)); 
m_ListDisplay.SetTextBkColor(RGB(117,151,240)); 
m_ListDisplay.SetExtendedStyle(LVS_EX_FULLROWSELECT ¦LVS_EX_GRIDLINES ¦LVS_EX_HEADERDRAGDROP); 
//设置表头 
//}}控件跟随窗口大小变化
int     cxScreen     =     ::GetSystemMetrics(SM_CXSCREEN); //获得屏幕宽 
int     cyScreen     =     ::GetSystemMetrics(SM_CYSCREEN); //获得屏幕高 
rect.top=0;
rect.bottom = cyScreen     ;
rect.left = 0;
rect.right = cyScreen ;
m_ListDisplay.MoveWindow(rect); 
//}}控件跟随窗口大小变化
m_ListDisplay.InsertColumn(0,_T("话机编号"),LVCFMT_LEFT,50); 
m_ListDisplay.InsertColumn(1,_T("话机状态"),LVCFMT_LEFT,100); 
m_ListDisplay.InsertColumn(2,_T("费率"),LVCFMT_LEFT,80); 
m_ListDisplay.InsertColumn(3,_T("通话时间"),LVCFMT_LEFT,80); 
m_ListDisplay.InsertColumn(4,_T("金额"),LVCFMT_LEFT,150); 
                     ...... 
// 
} 
类型的CListCtrl: 
首先使用下面的语句设置CListCtrl的style: 
DWORD SetExtendedStyle( DWORD dwNewStyle ); 
其中 
LVS_EX_CHECKBOXES 表示添加CheckBox 
LVS_EX_FULLROWSELECT 表示选择整行 
LVS_EX_GRIDLINES 表示添加表格线 
如果设置了LVS_EX_CHECKBOXES属性,则可以用 
BOOL GetCheck( int nItem ) const; 
来得到某一行是否Checked。 
可以先用下面的语句来删除以前的东西: 
for(int k=2;k>=0;k--) //注意要从后往前删,否则出错 
         m_ListCtrl.DeleteColumn(k); 
m_ListCtrl.DeleteAllItems(); 
用下面的语句新建列: 
m_ListCtrl.InsertColumn(0,_T("文件名"),LVCFMT_IMAGE|LVCFMT_LEFT); 
m_ListCtrl.InsertColumn(1,_T("仪器类别")); 
m_ListCtrl.InsertColumn(2,_T("项目类别")); 
其中LVCFMT_IMAGE表示可以在第一列加入图标。如果不要图标可以删去。 
然后设置列宽: 
for(j=0;j<3;j++) 
         m_ListCtrl.SetColumnWidth(j ,100); 
以下为列表加入图标,如果不需要图标,可以跳过这一步。注意只在第一次加入,如果多次加入会出错! 
先在头文件中加入声明: 
CImageList m_ImageList; 
这是必要的,如果在cpp的某个函数中加入由于生命期结束,CImageList自动释放,则效果是列表中看不到图标,只看到一个白方块。 
下面生成CImageList,并将其绑定到CListCtrl中,这是CImageList中还没有图标,只是一个容器: 
static int flag=2; 
if(flag==2){//只调用一次SetImageList,否则出错 
         m_ImageList.Create(128, 128, ILC_COLORDDB|ILC_MASK, 20, 1); 
         m_ListCtrl.SetImageList(&m_ImageList,LVSIL_SMALL); 
} 
flag=(flag+1)%2; 
如果CListCtrl已经用过,曾经加过图标进去,这时就要删除上次放进m_ImageList中的Image 
for(int kk=0;kk<m_ImageList.GetImageCount();kk++) 
         m_ImageList.Remove(k); 
下面介绍如何向CListCtrl里面加入行,并同时为每一行动态加入图标: 
假设m_listRowCount为要加入的行数。 
CBitmap* bitmap; 
bitmap=new CBitmap[m_list1rowCount]; 
HBITMAP hbitmap; 
for(int i = 0; i < m_listRowCount; i++) 
{ 
         //为每一行插入相应的缩略图 
         CFile f; 
         CFileException e;   
         if( !f.Open(m_FileName, CFile::modeRead, &e )){ //m_FileName为bmp文件名,由你来定 
          hbitmap = (HBITMAP)LoadImage(NULL,path+"blank.bmp",IMAGE_BITMAP,0,0, 
           LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE); 
         }else{ 
          f.Close(); 
          hbitmap = (HBITMAP)LoadImage(NULL,bmpFile,IMAGE_BITMAP,0,0, 
           LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE); 
         } 
         bitmap[i].Attach(hbitmap); 
         m_ImageList.Add(&bitmap[i], RGB(0, 128, 128)); 
   
         //插入行 
         m_ListCtrl.InsertItem(i,m_FileName,i); 
         m_ListCtrl.SetItemText(i,1,type); 
         m_ListCtrl.SetItemText(i,2,m_Path); 
} 
   
//记得删除已经没用的临时文件 
if(m_list1rowCount!=0) 
         delete[] bitmap; 
2。如果是ICON类型的CListCtrl,则要做一点点改动: 
把绑定图标集的代码由 
SetImageList(&m_ImageList,LVSIL_SMALL); 
改为 
SetImageList(&m_ImageList,LVSIL_NORMAL); 
插入行时只用 
InsertItem(i,mainSet.m_FileName,i); 
不用 
SetItemText(i,1,type); 
之类的代码。 
 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号