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);
}
點選執行即可