1. 程式人生 > >VC++ 列表控制元件應用

VC++ 列表控制元件應用

宣告:該程式的兩個列表控制元件都是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),要不然很容易報錯。