MFC中TAB控件使用问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC中TAB控件使用问题相关的知识,希望对你有一定的参考价值。
1.在主对话框内放置了一个tab控件,让他和3个子对话框A、B、C绑定,如何在这三个对话框之间通信,传递数据呢?比如将A对话框中接受的数据传给B,在B中显示? 2.在主对话框下在设置一个弹出对话框D,如何将D的内容传递给A或B,在A或B中显示? 3.tab控件和他附属的对话框是什么关系,和主对话框之间又是什么关系?他们谁是谁的父对话框?使用GetParent()获得的是谁的指针?看了一晚上头都看大了,也没看出个究竟!
1 A对话框有个CEdit 输入完文本后 通过事件 什么事件自己定义例如 BN_CLICKED EN_CHANGED等等 将数据存入成员变量 或者通过MFC的 DDX(动态数据交换)机制 更新到成员变量 然后在B对话框中调用A对话框的成员变量获取2.同上。。一个道理
3.MainDialog是CTabCtrl(你创建的)的父窗口 CTabCtrl是A、B、C的父窗口 GetParent 是获取你当前对话框的上一级的窗口 A->GetParent()获取的就是Tab的指针 tab->GetParent()获取的就是MainDialog的指针
先去看盾WIN32吧 。。。。追问
原理看了,理解不深,不会操作了!!写了一段代码,但是不对,您能帮忙看看么?
void CPara2::OnButton1() //B中函数,将A中数据显示在B中
UpdateData();
m_para2=m_para1->m_edit1;//m_para2是与B中编辑框关联的成员,m_para1是A类型成员,m_edit1是A中编辑框关联的成员
UpdateData(false);
mfc 课堂笔记 day002
table控件的使用
- 创建自定义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] = 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(); }
- 添加按钮切换消息
void CMyTab::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *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*); CDialogEx*pWnd = 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中TAB控件使用问题的主要内容,如果未能解决你的问题,请参考以下文章