1. 程式人生 > >MFC List Control控制元件新增單元格編輯和單元格下拉列表項以適用於資料庫相關操作

MFC List Control控制元件新增單元格編輯和單元格下拉列表項以適用於資料庫相關操作

void CNephoVisionDatabaseDlg::createEdit(NM_LISTVIEW  *pEditCtrl, CEdit *createdit, int &Item, int &SubItem, bool &havecreat)//建立單元格編輯框函式
																				//pEditCtrl為列表物件指標,createdit為編輯框指標物件,
																				//Item為建立單元格在列表中的行,SubItem則為列,havecreat為物件建立標準
{
	Item = pEditCtrl->iItem;//將點中的單元格的行賦值給“剛編輯過的行”以便後期處理
	SubItem = pEditCtrl->iSubItem;//將點中的單元格的行賦值給“剛編輯過的行”以便後期處理
	createdit->Create(ES_AUTOHSCROLL | WS_CHILD | ES_LEFT | ES_WANTRETURN,
		CRect(0, 0, 0, 0), this, IDC_EDIT_CREATEID);//建立編輯框物件,IDC_EDIT_CREATEID為控制元件ID號3000,在文章開頭定義
	havecreat = true;
	createdit->SetFont(this->GetFont(), FALSE);//設定字型,不設定這裡的話上面的字會很突兀的感覺
	createdit->SetParent(&m_list);//將list control設定為父視窗,生成的Edit才能正確定位,這個也很重要
	CRect  EditRect;
	m_list.GetSubItemRect(e_Item, e_SubItem, LVIR_LABEL, EditRect);//獲取單元格的空間位置資訊
	EditRect.SetRect(EditRect.left+1, EditRect.top+1, EditRect.left + m_list.GetColumnWidth(e_SubItem)-1, EditRect.bottom-1);//+1和-1可以讓編輯框不至於擋住列表框中的網格線
	CString strItem = m_list.GetItemText(e_Item, e_SubItem);//獲得相應單元格字元
	createdit->SetWindowText(strItem);//將單元格字元顯示在編輯框上
	createdit->MoveWindow(&EditRect);//將編輯框位置放在相應單元格上
	createdit->ShowWindow(SW_SHOW);//顯示編輯框在單元格上面
	createdit->SetFocus();//設定為焦點 
	createdit->SetSel(-1);//設定游標在文字框文字的最後
}

void CNephoVisionDatabaseDlg::distroyEdit(CListCtrl *list,CEdit* distroyedit, int &Item, int &SubItem)
{
	CString meditdata;
	distroyedit->GetWindowTextW(meditdata);
	list->SetItemText(Item, SubItem, meditdata);//獲得相應單元格字元
	distroyedit->DestroyWindow();//銷燬物件,有建立就要有銷燬,不然會報錯
}

void CNephoVisionDatabaseDlg::createCcombobox(NM_LISTVIEW  *pEditCtrl, CComboBox *createccomboboxobj, int &Item, int &SubItem, bool &havecreat)//建立單元格下拉列表框函式
//pEditCtrl為列表物件指標,createccombobox為下拉列表框指標物件,
//Item為建立單元格在列表中的行,SubItem則為列,havecreat為物件建立標準
{
	Item = pEditCtrl->iItem;//將點中的單元格的行賦值給“剛編輯過的行”以便後期處理
	SubItem = pEditCtrl->iSubItem;//將點中的單元格的行賦值給“剛編輯過的行”以便後期處理
	havecreat = true;
	createccomboboxobj->Create(WS_CHILD | WS_VISIBLE |  CBS_DROPDOWN | CBS_OEMCONVERT, CRect(0, 0, 0, 0), this, IDC_COMBOX_CREATEID);
	createccomboboxobj->SetFont(this->GetFont(), FALSE);//設定字型,不設定這裡的話上面的字會很突兀的感覺
	createccomboboxobj->SetParent(&m_list);//將list control設定為父視窗,生成的Ccombobox才能正確定位,這個也很重要
	CRect  EditRect;
	m_list.GetSubItemRect(e_Item, e_SubItem, LVIR_LABEL, EditRect);//獲取單元格的空間位置資訊
	EditRect.SetRect(EditRect.left + 1, EditRect.top + 1, EditRect.left + m_list.GetColumnWidth(e_SubItem) - 1, EditRect.bottom - 1);//+1和-1可以讓編輯框不至於擋住列表框中的網格線
	CString strItem = m_list.GetItemText(e_Item, e_SubItem);//獲得相應單元格字元
	createccomboboxobj->SetWindowText(strItem);//將單元格字元顯示在編輯框上
	createccomboboxobj->MoveWindow(&EditRect);//將編輯框位置放在相應單元格上
	createccomboboxobj->ShowWindow(SW_SHOW);//顯示編輯框在單元格上面
}

void CNephoVisionDatabaseDlg::distroyCcombobox(CListCtrl *list, CComboBox* distroyccomboboxobj, int &Item, int &SubItem)
{
	CString meditdata;
	distroyccomboboxobj->GetWindowTextW(meditdata);
	list->SetItemText(Item, SubItem, meditdata);//更新相應單元格字元
	distroyccomboboxobj->DestroyWindow();//銷燬物件,有建立就要有銷燬,不然會報錯
}
 OK,到此我們已經實現了新增單元格編輯框和單元格下拉列表框的功能了,點選除性別列外的列表單元格看到以下效果: