1. 程式人生 > >MFC tab控制元件及list控制元件學習

MFC tab控制元件及list控制元件學習

本文基於上一案例在IDD_PANDALOG對話方塊中新增tab控制元件和兩個對話方塊IDD_JILU和IDD_JISUAN,點選tab中的資料記錄,顯示對話方塊IDD_JILU,點選tab中的加法運算,顯示對話方塊IDD_ JISUAN,對話方塊IDD_JILU中有list控制元件,點選記錄可將滑塊的資料記錄到list中 在這裡插入圖片描述

對話方塊IDD_PANDALOG中的控制元件如下,新增變數CTabCtrl m_tabctrl; 在這裡插入圖片描述

對話方塊IDD_JILU的控制元件如下:新增變數CListCtrl m_list;,list的風格為report,按鈕記錄的ID為IDC_record,按鈕刪除的ID為IDC_delate

在這裡插入圖片描述 初始化表格,在BOOL jilu::OnInitDialog()中新增

 BOOL jilu::OnInitDialog()
{
	CDialogEx::OnInitDialog();

//	page11 = this;

	// TODO:  在此新增額外的初始化
	//擴充套件列表風格
	DWORD dwStyle = m_list.GetExtendedStyle();
	dwStyle |= LVS_EX_FULLROWSELECT;//選中某行高亮顯示
	dwStyle |= LVS_EX_GRIDLINES; //開柵格
	m_list.SetExtendedStyle(dwStyle); 

	//便於理解
	CRect rect;
	m_list.GetWindowRect(&rect);
	m_list.InsertColumn(0,_T("資料"), LVCFMT_CENTER, rect.Width()/3, 0);
	m_list.InsertColumn(1,_T("x1"), LVCFMT_CENTER, rect.Width()/3, 1);
	m_list.InsertColumn(2,_T("x2"), LVCFMT_CENTER, rect.Width()/3, 2);



	return TRUE;  // return TRUE unless you set the focus to a control
	// 異常: OCX 屬性頁應返回 FALSE
}

對話方塊IDD_JISUAN的控制元件如下,此處控制元件隨意,該對話方塊只起點選tab中的加法運算就顯示該對話方塊的作用 在這裡插入圖片描述 在PANDALOG.h標頭檔案中新增IDD_JILU和IDD_JISUAN的標頭檔案及成員變數 #include “jilu.h” #include “jisuan.h” jilu page1; jisuan page2; 在panDALOG.cpp的OnInitDialog()新增以下程式碼:

    page1.DestroyWindow();
	page2.DestroyWindow();



	m_tabctrl.DeleteAllItems();
	TCITEM item;
	item.mask=TCIF_TEXT;
	item.pszText=_T("資料記錄");
	m_tabctrl.InsertItem(0,&item);
	item.pszText=_T("加法運算");
	m_tabctrl.InsertItem(1,&item);

	m_tabctrl.SetCurSel(0);

	page1.Create(IDD_JILU,&m_tabctrl);
	page2.Create(IDD_JISUAN,&m_tabctrl);

	//畫了個矩形框
	CRect rect;
	m_tabctrl.GetClientRect(&rect);//矩形框大小為m_tablectrl的大小

	//在原基礎上把矩形框偏置
	rect.top += 30;
	rect.bottom -= 20;
	rect.left += 20;
	rect.right -= 30;

	page1.MoveWindow(&rect);
	page2.MoveWindow(&rect);	

	page1.ShowWindow(TRUE);


	m_tabctrl.SetCurSel(0);

新增tab控制元件的相應函式,實現點選tab上的按鍵,顯示某對話方塊的功能

void panDALOG::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	*pResult = 0;

	int cursel;
	cursel = m_tabctrl.GetCurSel();
	switch(cursel)
	{
	case 0:
		page1.ShowWindow(TRUE);
		page2.ShowWindow(FALSE);

		break;
	case 1:
		page1.ShowWindow(FALSE);
		page2.ShowWindow(TRUE);

		break;
	}


}

此時執行的效果應如下: 在這裡插入圖片描述 在這裡插入圖片描述 接著要將IDD_PANDALOG對話方塊中的滑塊數值傳遞至IDD_JILU對話方塊中 在jilu.cpp中新增extern panDALOG* pandlg;,表示引用外部的指標,在jilu.cpp中新增標頭檔案panDALOG.h (不要在jilu.h中新增該標頭檔案,否則易引起標頭檔案相互引用而報錯) 對應的,在panDALOG.cpp中新增panDALOG* pandlg;,在初始化位置新增pandlg = this; 在jilu.cpp新增record和delate的響應函式

void jilu::OnBnClickedrecord()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	UpdateData(TRUE);
	/*int i=m_list.GetItemCount()+1;*/

	//獲取行數
	int i=m_list.GetItemCount()+1; //初始時,,沒有項 i= 0+1
	CString n;
	n.Format(_T("%d"),i);//插入資料前必須下開闢一個行,此時n = '1'
	m_list.InsertItem(i-1,n);//初始時在0行 插入序號‘1’

	CString num1;CString num2;
	double number1;
	double number2;
	number1 = pandlg->m_value;
	number2 = pandlg->m_value2;
	num1.Format(_T("%.2f"),number1);
	num2.Format(_T("%.2f"),number2);
	
	//插入表格
	m_list.SetItemText(i-1,1,num1);
	m_list.SetItemText(i-1,2,num2);
	

	UpdateData(FALSE);
}


void jilu::OnBnClickeddelate()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	UpdateData(TRUE);

	//點中後刪除
	while(m_list.GetNextItem(-1,LVNI_ALL | LVNI_SELECTED) != -1)
	{
		int nItem = m_list.GetNextItem(-1,LVNI_ALL | LVNI_SELECTED);
		m_list.DeleteItem(nItem);
	}


	UpdateData(FALSE);
}

點選執行即可