MFC——table控件的使用
阿新 • • 發佈:2018-03-17
MFC;table控件;table控件的使用
創建自定義table類,繼承自CTabCtrl
類向導,添加MFC類
m_child[2] = new CMyDlgC;
m_child[2]->Create(IDD_DIALOG3,this);
// 把子窗口移動到和客戶區一樣大
CRect rt = {};
GetClientRect(&rt);
rt.DeflateRect(0, 25, 0, 0);
m_child[0]->MoveWindow(&rt);
m_child[0]->ShowWindow(SW_SHOW);
CTabCtrl::PreSubclassWindow();
}
添加按鈕切換消息 pResult)
{
// TODO: 在此添加控件通知處理程序代碼
pResult = 0;
int nSel = GetCurSel();
// 隱藏之前的窗口,只顯示現在點擊的這個標簽所在的窗口
for (int i=0;i<3;i++)
{
m_child[i]->ShowWindow(SW_HIDE);
}
// 把子窗口移動到和客戶區一樣大
CRect rt = {};
GetClientRect(&rt);
rt.DeflateRect(0, 25, 0, 0);
m_child[nSel]->MoveWindow(&rt);
m_child[nSel]->ShowWindow(SW_SHOW);
}
變參函數
void Fun(int nCount, ...) {
va_list va;
va_start(va, nCount);
// 循環讀取變參參數
for (int i=0;i<nCount;i++)
{
// 取int數
int n = va_arg(va, int);
char p = va_arg(va, char);
printf("%d%s\n", n, p);
}
va_end(va);
}
int main()
{
Fun(3, 12, "12", 34, "34", 56, "12345");
Fun(2, 88,"34", 56, "12345");
return 0;
}
TABLE控件的封裝
前面幾步:添加table控件,自定義table類,綁定table變量,準備子窗口,和前面的table控件使用一樣
提供一個變參接口給使用該table控件的人用
// 標題 對話框 對話框ID
void CMyTab01::MyInsertItem(DWORD dwCount, ...)
{
va_list va;
va_start(va, dwCount);
m_dwCount = dwCount;
for (DWORD i = 0 ; i< dwCount;i++)
{
TCHAR pHeader = va_arg(va, TCHAR);
CDialogExpWnd = va_arg(va, CDialogEx*);
UINT uID = va_arg(va, UINT);
InsertItem(i, pHeader);
pWnd->Create(uID, this);
m_child[i] = pWnd;
}
va_end(va);
// 把子窗口移動到和客戶區一樣大
CRect rt = {};
GetClientRect(&rt);
rt.DeflateRect(0, 25, 0, 0);
m_child[0]->MoveWindow(&rt);
m_child[0]->ShowWindow(SW_SHOW);
}
對話框調用該接口,實現table控件的子窗口個數動態增加
m_tab.MyInsertItem(3,
L"我是1號", new CMyDlgA01, IDD_DIALOG1,
L"我是2號", new CMyDlgB01, IDD_DIALOG2,
L"我是3號", new CMyDlgC01, IDD_DIALOG3);
創建自定義table類,繼承自CTabCtrl
類向導,添加MFC類
創建CMyTab類
給tab控件添加變量,變量類型為剛才創建的自定義類
給tab控件添加標簽
void CMyTab::PreSubclassWindow()
{
// TODO: 在此添加專用代碼和/或調用基類
InsertItem(0, L"A");
InsertItem(1, L"B");
InsertItem(2, L"C");
CTabCtrl::PreSubclassWindow();
}
準備3個子窗口資源
設置窗口屬性為子窗口口,無邊框
添加類
重復以上操作3次
把以上子窗口作為tab控件的子窗口->定義成員變量,並初始化
void CMyTab::PreSubclassWindow()
{
// TODO: 在此添加專用代碼和/或調用基類
InsertItem(0, L"A");
InsertItem(1, L"B");
InsertItem(2, L"C");
m_child[0] = new CMyDlgA;
m_child[0]->Create(IDD_DIALOG1,this);
m_child[1] = new CMyDlgB;
m_child[1]->Create(IDD_DIALOG2,this);
m_child[2]->Create(IDD_DIALOG3,this);
// 把子窗口移動到和客戶區一樣大
CRect rt = {};
GetClientRect(&rt);
rt.DeflateRect(0, 25, 0, 0);
m_child[0]->MoveWindow(&rt);
m_child[0]->ShowWindow(SW_SHOW);
CTabCtrl::PreSubclassWindow();
}
添加按鈕切換消息
void CMyTab::OnTcnSelchange(NMHDR pNMHDR, LRESULT
{
// TODO: 在此添加控件通知處理程序代碼
pResult = 0;
int nSel = GetCurSel();
// 隱藏之前的窗口,只顯示現在點擊的這個標簽所在的窗口
for (int i=0;i<3;i++)
{
m_child[i]->ShowWindow(SW_HIDE);
}
// 把子窗口移動到和客戶區一樣大
CRect rt = {};
GetClientRect(&rt);
rt.DeflateRect(0, 25, 0, 0);
m_child[nSel]->MoveWindow(&rt);
m_child[nSel]->ShowWindow(SW_SHOW);
}
變參函數
void Fun(int nCount, ...) {
va_list va;
va_start(va, nCount);
// 循環讀取變參參數
for (int i=0;i<nCount;i++)
{
// 取int數
int n = va_arg(va, int);
char p = va_arg(va, char);
printf("%d%s\n", n, p);
}
va_end(va);
}
int main()
{
Fun(3, 12, "12", 34, "34", 56, "12345");
Fun(2, 88,"34", 56, "12345");
return 0;
}
TABLE控件的封裝
前面幾步:添加table控件,自定義table類,綁定table變量,準備子窗口,和前面的table控件使用一樣
提供一個變參接口給使用該table控件的人用
// 標題 對話框 對話框ID
void CMyTab01::MyInsertItem(DWORD dwCount, ...)
{
va_list va;
va_start(va, dwCount);
m_dwCount = dwCount;
for (DWORD i = 0 ; i< dwCount;i++)
{
TCHAR pHeader = va_arg(va, TCHAR);
CDialogExpWnd = va_arg(va, CDialogEx*);
UINT uID = va_arg(va, UINT);
InsertItem(i, pHeader);
pWnd->Create(uID, this);
m_child[i] = pWnd;
}
va_end(va);
// 把子窗口移動到和客戶區一樣大
CRect rt = {};
GetClientRect(&rt);
rt.DeflateRect(0, 25, 0, 0);
m_child[0]->MoveWindow(&rt);
m_child[0]->ShowWindow(SW_SHOW);
}
對話框調用該接口,實現table控件的子窗口個數動態增加
m_tab.MyInsertItem(3,
L"我是1號", new CMyDlgA01, IDD_DIALOG1,
L"我是2號", new CMyDlgB01, IDD_DIALOG2,
L"我是3號", new CMyDlgC01, IDD_DIALOG3);
MFC——table控件的使用