VC++ 列表控制元件應用
阿新 • • 發佈:2019-02-12
宣告:該程式的兩個列表控制元件都是list樣式,由於自己的需要,只有一列。
1.建立一個基於對話方塊的MFC應用程式,設定介面如下:
左邊列表控制元件ID為IDC_LIST1,右邊為IDC_LIST2,四個按鈕ID從上到下依次是IDC_BUTTON1,IDC_BUTTON2,IDC_BUTTON3,IDC_BUTTON4;
2.分別為兩個列表控制元件關聯成員變數,效果如下:
DDX_Control(pDX, IDC_LIST1, m_list1);
DDX_Control(pDX, IDC_LIST2, m_list2);
3.在標頭檔案中宣告兩個int型變數,分別表示兩個列表控制元件的索引,並在原始檔的建構函式中對這兩個變數進行初始化:
int m_indexLeft;//標頭檔案中宣告
int m_indexRight;//標頭檔案中宣告
BOOL m_flag;//再宣告一個bool型變數
m_indexLeft = -1;
m_indexRight = -1;
m_flag = TRUE;//對該bool型變數初始化為TRUE
4.在原始檔的OnInitDialog()函式中新增如下程式碼:
((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertItem(0,"zhangsan");//向IDC_LIST1列表控制元件中新增"zhangsan",第一個引數是索引
((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertItem(1,"lisi");
((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertItem(2,"wangwu");
((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertItem(3,"zhaoliu");
5.為該程式新增一個成員函式DeleteAll(),無引數,返回型別為void,並且函式實現程式碼如下:
/*DeleteAll()
函式功能:清空右邊列表框中的所有記錄
函式引數:無
*/
void Clistcontrol左移右移Dlg::DeleteAll()
{
// TODO: 在此新增控制元件通知處理程式程式碼
// 逆序判斷,主要是因為在刪除的時候表項的數量是會變動的
for(int i = m_list2.GetItemCount(); i > -1; i--)
{
if (LVIS_SELECTED == m_list2.GetItemState(i, LVIS_SELECTED))
{
m_list2.DeleteItem(i);
m_indexRight--;
}
}
}
6.為四個按鈕分別新增事件處理程式,新增程式碼如下:
void Clistcontrol左移右移Dlg::OnBnClickedButton1()
{
// TODO: 在此新增控制元件通知處理程式程式碼
TCHAR szBuf[100];
/* memset(szBuf, 0, sizeof(szBuf));*/
// LVITEM 資料結構, 用來獲取CListCtrl的列表項的值
LVITEM lvi;
lvi.pszText = szBuf; //存放item的文字內容
lvi.iItem = -1; //索引下標
lvi.iSubItem = 0;
lvi.mask = LVIF_TEXT;
lvi.cchTextMax = 1024;
CString str;
for (int i=0;i<m_list1.GetItemCount();i++)
{
if (LVIS_SELECTED==m_list1.GetItemState(i,LVIS_SELECTED))
{
lvi.iItem=i;
m_list1.GetItem(&lvi);
TCHAR szBuf2[100];
// 增加一個查重的功能, 同樣需要一個LVITEM的結構用來從右邊的m_listCtrlRight取值進行比較
LVITEM lvi2;
lvi2.pszText = szBuf2; //存放item的文字內容
lvi2.iItem = -1; //索引下標
lvi2.iSubItem = 0;
lvi2.mask = LVIF_TEXT;
lvi2.cchTextMax = 1024;
for (int j=0;j<m_list2.GetItemCount();j++)
{
lvi2.iItem=j;
m_list2.GetItem(&lvi2);
if (!strcmp(lvi.pszText,lvi2.pszText))
{
m_flag=FALSE;
break;
}
}
if (m_flag)
{
m_indexRight++;
m_list2.InsertItem(m_indexRight,szBuf);
m_list2.SetItemText(m_indexRight,1,m_list1.GetItemText(i,1));
}
m_flag=TRUE;
}
}
}
void Clistcontrol左移右移Dlg::OnBnClickedButton2()
{
// TODO: 在此新增控制元件通知處理程式程式碼
for(int i = m_list2.GetItemCount(); i > -1; i--)
{
if (LVIS_SELECTED == m_list2.GetItemState(i, LVIS_SELECTED))
{
m_list2.DeleteItem(i);
m_indexRight--;
}
}
}
void Clistcontrol左移右移Dlg::OnBnClickedButton3()
{
// TODO: 在此新增控制元件通知處理程式程式碼
//有兩種方式實現
// m_listCtrlRight.DeleteAllItems(); //刪除全部項
// m_indexRight = -1; // 重置下標
DeleteAll(); // 呼叫後面的函式刪除全部項
TCHAR szBuf[100];
LVITEM lvi;
lvi.pszText = szBuf; //存放item的文字內容
lvi.iItem = -1; //索引下標
lvi.iSubItem = 0;
lvi.mask = LVIF_TEXT;
lvi.cchTextMax = 1024;
CString str;
for(int i = 0; i < m_list1.GetItemCount(); i++)
{
lvi.iItem = i;
m_list1.GetItem(&lvi);
m_indexRight++;
m_list2.InsertItem(m_indexRight, szBuf);
m_list2.SetItemText(m_indexRight, 1, m_list1.GetItemText(i, 1));
}
}
void Clistcontrol左移右移Dlg::OnBnClickedButton4()
{
// TODO: 在此新增控制元件通知處理程式程式碼
m_list2.DeleteAllItems(); // 刪除全部項
m_indexRight = -1;
}
7.最終效果如下:
可能出現的錯誤:
1.錯誤1error C2664: “int CListCtrl::InsertItem(int,LPCTSTR)”: 不能將引數 2 從“const char [9]”轉換為“LPCTSTR”
解決辦法:選中解決方案資源管理器下的listcontrol左移右移工程,右鍵->屬性->配置屬性->常規->字符集->將字符集設定為未設定。
2.並且選中解決方案資源管理器下的listcontrol左移右移工程,右鍵->屬性->配置屬性->C/C++->程式碼生成->執行庫->要改為多執行緒DLL(/MD),要不然很容易報錯。