1。先來介紹REPORT類型的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);
之類的代碼。
獲得CListCtrl中在Report風格下所顯示的數據的內容
Str = m_ListCtrl.GetItemText(Row, Col)
**設置了高亮及選中
UINT flag = LVIS_SELECTED|LVIF_STATE;
m_ListCtrl.SetItemState(iItem, flag,flag);
--------------------------------------------------------------------------------
BOOL CLCDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
m_imagelist.Create(16,16,TRUE,2,2);
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
m_list.SetImageList(&m_imagelist,LVSIL_SMALL);
m_font.CreateFont(16, 0,0,0,FW_NORMAL, 0,0,0,
DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial");
m_list.SetFont(&m_font);
/*-----------------------------------------------------------*/
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_list.SetBkColor(RGB(247,247,255));
m_list.SetTextColor(RGB(0,0,255));
m_list.SetTextBkColor(RGB(247,247,255));
m_list.InsertColumn(0, "學號", LVCFMT_LEFT, 110);
m_list.InsertColumn(1, "姓名", LVCFMT_LEFT, 130);
m_list.InsertColumn(2, "成績", LVCFMT_LEFT, 47);
m_list.InsertItem(0,"2002112105");
m_list.SetItemText(0,1,"程紅秀");
m_list.SetItemText(0,2,"96");
m_list.InsertItem(1,"2002112126");
m_list.SetItemText(1,1,"符中輝");
m_list.SetItemText(1,2,"85");
m_list.InsertItem(2,"2002112125");
m_list.SetItemText(2,1,"王斌年");
m_list.SetItemText(2,2,"95");
m_list.InsertItem(3,"2002112103");
m_list.SetItemText(3,1,"袁浩");
m_list.SetItemText(3,2,"92");
return TRUE; // return TRUE unless you set the focus to a control
}
void CLCDemoDlg::OnClickList(NMHDR* pNMHDR, LRESULT* pResult)
{
POSITION pos = m_list.GetFirstSelectedItemPosition();
m_nIndex = m_list.GetNextSelectedItem(pos); // 得到項目索引
*pResult = 0;
}
void CLCDemoDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult)
{
POSITION pos = m_list.GetFirstSelectedItemPosition();
m_nIndex = m_list.GetNextSelectedItem(pos); // 得到項目索引
CEditDlg ed;
ed.m_strNo=m_list.GetItemText(m_nIndex,0);
ed.m_strName=m_list.GetItemText(m_nIndex,1);
ed.m_strScore=m_list.GetItemText(m_nIndex,2);
if(ed.DoModal()==IDOK)
{
m_list.SetItemText(m_nIndex,0,ed.m_strNo);
m_list.SetItemText(m_nIndex,1,ed.m_strName);
m_list.SetItemText(m_nIndex,2,ed.m_strScore);
}
*pResult = 0;
}
void CLCDemoDlg::OnButtonUp()
{
m_list.SetFocus();
if (m_nIndex == -1) //如果沒有選擇就返回
{
MessageBox("請選擇一項再上移!","提示",MB_ICONINFORMATION);
return;
}
if (m_nIndex == 0) // 判斷所選項是否位於行首
{
MessageBox("已經位於第一行!","提示",MB_ICONINFORMATION);
return;
}
// 提取所選列表項各列類容
CString str1, str2, str3;
str1 = m_list.GetItemText(m_nIndex, 0);
str2 = m_list.GetItemText(m_nIndex, 1);
str3 = m_list.GetItemText(m_nIndex, 2);
// 刪除所選列表項
m_list.DeleteItem(m_nIndex);
// 在m_nIndex-1位置處插入上面所刪列表項的各列類容
m_list.InsertItem(m_nIndex-1, str1);
m_list.SetItemText(m_nIndex-1, 1, str2);
m_list.SetItemText(m_nIndex-1, 2, str3);
m_nIndex--;
// 使得m_nIndex-1位置處項目高亮顯示並獲得焦點
UINT flag = LVIS_SELECTED|LVIS_FOCUSED;
m_list.SetItemState(m_nIndex, flag, flag);
}
void CLCDemoDlg::OnButtonDown()
{
m_list.SetFocus();
if (m_nIndex == -1) //如果沒有選擇就返回
{
MessageBox("請選擇一項再下移!","提示",MB_ICONINFORMATION);
return;
}
if (m_nIndex == m_list.GetItemCount()-1) // 判斷所選項是否位於行尾
{
MessageBox("已經位於最末行!","提示",MB_ICONINFORMATION);
return;
}
CString str1, str2, str3;
str1 = m_list.GetItemText(m_nIndex, 0);
str2 = m_list.GetItemText(m_nIndex, 1);
str3 = m_list.GetItemText(m_nIndex, 2);
m_list.DeleteItem(m_nIndex);
// 在m_nIndex+1位置處插入上面所刪列表項的各列類容
m_list.InsertItem(m_nIndex+1, str1);
m_list.SetItemText(m_nIndex+1, 1, str2);
m_list.SetItemText(m_nIndex+1, 2, str3);
m_nIndex++;
// 使得m_nIndex+1位置處項目高亮顯示並獲得焦點
UINT flag = LVIS_SELECTED|LVIS_FOCUSED;
m_list.SetItemState(m_nIndex, flag, flag);
}
void CLCDemoDlg::OnEdit()
{
POSITION pos = m_list.GetFirstSelectedItemPosition();
m_nIndex = m_list.GetNextSelectedItem(pos); // 得到項目索引
if(m_nIndex==-1)
{
MessageBox("請選擇一項在修改!","提示",MB_ICONINFORMATION);
return;
}
CEditDlg ed;
ed.m_strNo=m_list.GetItemText(m_nIndex,0);
ed.m_strName=m_list.GetItemText(m_nIndex,1);
ed.m_strScore=m_list.GetItemText(m_nIndex,2);
if(ed.DoModal()==IDOK)
{
m_list.SetItemText(m_nIndex,0,ed.m_strNo);
m_list.SetItemText(m_nIndex,1,ed.m_strName);
m_list.SetItemText(m_nIndex,2,ed.m_strScore);
}
}
void CLCDemoDlg::OnAbout()
{
CAboutDlg dlg;
dlg.DoModal();
}
void CLCDemoDlg::OnExit()
{
PostMessage(WM_CLOSE,0,0);
}
void CLCDemoDlg::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult)
{
CPoint pt;
::GetCursorPos(&pt);
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu* pMenu=menu.GetSubMenu(0);
pMenu->TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this,NULL);
*pResult = 0;
}
void CLCDemoDlg::OnAdd()
{
CEditDlg ed;
if(ed.DoModal()==IDOK)
{
int nn=m_list.InsertItem(m_list.GetItemCount(),ed.m_strNo);
m_list.SetItemText(nn,1,ed.m_strName);
m_list.SetItemText(nn,2,ed.m_strScore);
}
}
void CLCDemoDlg::OnDel()
{
POSITION pos = m_list.GetFirstSelectedItemPosition();
m_nIndex = m_list.GetNextSelectedItem(pos); // 得到項目索引
if(m_nIndex==-1)
{
MessageBox("請選擇一項在刪除!","提示",MB_ICONINFORMATION);
return;
}
m_list.DeleteItem(m_nIndex);
UINT flag = LVIS_SELECTED|LVIS_FOCUSED;
m_list.SetItemState(m_nIndex-1, flag, flag);
}
void CLCDemoDlg::OnSave()
{
CStdioFile sf;
if(sf.Open("資料.txt",CFile::modeCreate | CFile::modeWrite))
{
CString strOut;
strOut="\r\n學號\t\t姓名\t\t成績\r\n";
sf.WriteString(strOut);
for(int i=0;i {
strOut=m_list.GetItemText(i,0) + "\t"+m_list.GetItemText(i,1)+"\t "+m_list.GetItemText(i,2) +"\r\n";
sf.WriteString(strOut);
}
sf.Close();
MessageBox("保存成功!","提示",MB_ICONINFORMATION);
}
else
MessageBox("保存失敗!","提示",MB_ICONINFORMATION);
---------------------------------------------------
調用CListCtrl的InsertColumn爲何無效
爲何調用了CListCtrl的InsertColumn卻什麼效果都沒有?MFC經常會讓人費解。依靠網絡史上最傑出的發明:搜索引擎,我找到了答案。那就是要把它的Style指定爲LVS_REPORT。
具體做法如下:
假設你的Dialog中有:
CListCtrl m_listctrl;
在你調用InsertColumn之前,先要輸入如下的代碼:
LONG styles;
styles=GetWindowLong(m_listctrl.m_hWnd,GWL_STYLE);
SetWindowLong(m_listctrl.m_hWnd,GWL_STYLE,styles | LVS_REPORT);
這樣纔能有效。