tab control 中的不同对象怎么通信?

来源:百度知道 编辑:UC知道 时间:2024/05/25 02:48:54
void CMyTabCtrl::Init()
{
m_tabCurrent=0;

m_tabPages[0]->Create(IDD_TAB_ONE, this);
m_tabPages[1]->Create(IDD_TAB_TWO, this);
m_tabPages[2]->Create(IDD_TAB_THREE, this);

m_tabPages[0]->ShowWindow(SW_SHOW);
m_tabPages[1]->ShowWindow(SW_HIDE);
m_tabPages[2]->ShowWindow(SW_HIDE);

SetRectangle();
}
------------------------------------------------------

class CTabOne : public CDialog
{
// Construction
public:
CTabOne(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CTabOne)
enum { IDD = IDD_TAB_ONE };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTabOne)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

请问楼主你说的“通信”具体是需要什么效果?获取/设置另外一个tab page上控件的状态?

______
补充:
方法一:既然你的所有子Tab对话框都在父tabctrl的Init时一次性创建出来的,那么只要这个tabctrl没有被销毁,那么这些子对话框应该都是始终有效且可以被访问到的。此外,因为每个子tab对话框初始化时,你都把这个父tabctrl的指针(CWnd*)传进去了,那么就可以通过这个CWnd*的指针经过类型转换得到CMyTabCtrl*,进一步就能访问到CMyTabCtrl的成员m_tabPages数组,再进一步就能存取任何一个子tab对话框的成员变量或其上面的编辑框。

方法二:其实个人不是太喜欢方法一,指针传来传去不好,还要做类型转换,而且还存在数据冗余(a和b),此外数据校验的时机也不好掌握,等等。实在不是一个好办法。所以我还是建议使用OnSetActive和OnKillActive的模式。这里有几个点需要处理:
(1)设计一个数据结构(让我们把它叫做GlobaData),用来存放一些可供各个子tab对话框公用的数据,如你提到的tabOne上的a和tabTow上的b,实际上就可以对应这个公共结构的一个成员变量;
(2)父tabctrl拥有GlobalData的一份实例作为成员变量,每个子tab拥有指向这份实例的指针pGlobalData(父tabctrl在每个子tab初始化时传入);
(3)每个子tab需要响应并处理OnKillActive事件(这个事件发生在当前tab正要失去焦点并准备切换到另外一个tab之前),校验并收集当前tab上的控件数据,根据需要去设置pGlobalData的成员变量;
(4)同时,每个之tab还需要响应并处理OnSetActive事件(这个事件发生在当前tab刚刚被激活之后),并根据pGlobalData的成员变量,刷新当前tab上控件数据。

方法二克服了方法一的种种缺点,代码比较干净清晰。每个子tab对外的出口入口单一,便于统一作数据更新和数据校验等。

不知我有没有说清楚,如果还有不明白的地方可以补充提问。