一个一个showwindow太慢也不方便。
我想把所有的Dialog添加到某个容器中再用for循环隐藏。不知道这样是否可以?
请给一些其他的好的建议
和简单的代码实现。3Q。

解决方案 »

  1.   

    CTypedPtrArray<CDialog*, CDialog*> m_arrayDlgs;
      

  2.   

    CTypedPtrArray<CDialog*, CDialog*> m_arrayDlgs;
    新建一个CDialog类CTestdlg。
    CTestdlg tdlg;
    m_arrayDlgs.add(tdlg);
    这样不行啊,好几个错误。求用法3Q
      

  3.   

    首先,CTypedPtrArray<CDialog*, CDialog*> m_arrayDlgs;
    应该换成你自己的对话框类吧
    另外,既然是指针数组,当然要加指针啊
    m_arrayDlgs.add(&tdlg);有多个错误,具体错误具体分析
      

  4.   

    都是从CDialog继承来的。应该没问题吧?
    &tdlg也错误直接用CDialog也不行啊。
    CTypedPtrArray<CDialog*, CDialog*> m_arrayDlgs;
    CDialog* dlg;
    m_arrayDlgs.Add(dlg);---------------
     error C2516: 'BASE_CLASS' : is not a legal base class
    1>          test_myaddDlg.cpp(196) : see declaration of 'BASE_CLASS'
    1>          test_myaddDlg.cpp(196) : see reference to class template instantiation 'CTypedPtrArray<BASE_CLASS,TYPE>' being compiled
      

  5.   

    不好意思,昨天我没试过就回答问题了。以前没用过CTypedPtrArray...
    CTypedPtrArray<CDialog*, CDialog*> m_arrayDlgs;
    改成CTypedPtrArray <CPtrArray,CMyDlg *> m_arrayDlgs;就可以了
    CTypedPtrArray的第一个参数是说Array本身的基类,而不是它要存储的元素的基类
      

  6.   

    CArray < CDialog*, CMyDlg*> m_arrayDlgs;这种简单的用法就熟悉一点,
    CTypedPtrArray <CPtrArray,CMyDlg *> m_arrayDlgs;这种用法不懂
    等高手解答哈
      

  7.   

    你说的是tab页么?
    tab最合理的机制隐藏上一个
    显示当前的
    不会出现你说的把所有的都显示和隐藏的情况啊
      

  8.   

    To xianglitian,
    3Q...这个方法好啊..
     怎样得到当前tab页的CDialog对象呢?
      

  9.   


    弄一变量,当某tab页激活,就保存到该变量
      

  10.   


    一般都是重载CTabCtrl
    然后tab的TCITEM结构有一个lParam
    在添加页面的时候将页面的指针保存在这个参数里
    然后处理TCN_SELCHANGE和TCN_SELCHANGING消息
    OnTcnSelchanging里隐藏
    OnTcnSelchange显示
      

  11.   

    OnInitDialog中
    mdlg1.Create(IDD_DIALOG1,&m_tab);
    mdlg2.Create(IDD_DIALOG2,&m_tab); tcItem[1].mask = TCIF_TEXT | TCIF_PARAM;
    tcItem[1].lParam = (LPARAM)&mdlg1;
    tcItem[1].pszText = "11111";
    m_tab.InsertItem(0,&tcItem[1]);
    tcItem[2].mask = TCIF_TEXT | TCIF_PARAM;
    tcItem[2].lParam = (LPARAM)&mdlg2;
    tcItem[2].pszText = "2222";
    m_tab.InsertItem(1,&tcItem[2]);OnTcnSelchangeTab中 TCITEM *t=new TCITEM;
    m_tab.GetItem(cursel,t);
    CDialog* d = (CDialog*)(t->lParam);
    d->ShowWindow(false);
    switch(cursel)
    {
    case 0:
    m_tab.GetItem(0,t);
    break;
    case 1:
    m_tab.GetItem(1,t);
    break;
    } d = (CDialog*)(t->lParam);
    d->ShowWindow(true);
            
    我没找出有什么问题.求解决或者请给一可用模板.3Q
      

  12.   

    我一般是这么用的头文件#pragma once// CPageTab
    class CPageTab : public CTabCtrl
    {
    DECLARE_DYNAMIC(CPageTab) int m_nItemCount; //页数public:
    CPageTab();
    virtual ~CPageTab(); void AddItem(CWnd *pWnd,LPTSTR name); //添加选项卡
    void ShowCurrentPage(int nShowState); //显示当前页面public:
    afx_msg void OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult);
    afx_msg void OnTcnSelchanging(NMHDR *pNMHDR, LRESULT *pResult); DECLARE_MESSAGE_MAP()
    };
    实现文件#include "stdafx.h"
    #include "PageTab.h"// CPageTab
    IMPLEMENT_DYNAMIC(CPageTab, CTabCtrl)CPageTab::CPageTab()
    {
    m_nItemCount=0;
    }CPageTab::~CPageTab()
    {
    }void CPageTab::AddItem(CWnd *pWnd, LPTSTR name)
    {
    TCITEM item; item.mask = TCIF_TEXT|TCIF_PARAM;
    item.lParam = (LPARAM) pWnd;
    item.pszText = name;
    InsertItem(m_nItemCount, &item); if(m_nItemCount==0)
    {
    pWnd->ShowWindow(SW_SHOW);//显示第一个子窗体
    }
    else
    {
    pWnd->ShowWindow(SW_HIDE);
    } m_nItemCount++;
    }void CPageTab::ShowCurrentPage(int nShowState)
    {
    int nCurItem = GetCurSel();
    TCITEM itemCurrent;
    CWnd* pWnd; itemCurrent.mask = TCIF_PARAM;
    GetItem(nCurItem, &itemCurrent);
    pWnd = reinterpret_cast<CWnd*> (itemCurrent.lParam);
    ASSERT_VALID(pWnd); pWnd->ShowWindow(nShowState);
    }
    BEGIN_MESSAGE_MAP(CPageTab, CTabCtrl)
    ON_NOTIFY_REFLECT(TCN_SELCHANGE, &CPageTab::OnTcnSelchange)
    ON_NOTIFY_REFLECT(TCN_SELCHANGING, &CPageTab::OnTcnSelchanging)
    END_MESSAGE_MAP()// CPageTab 消息处理程序void CPageTab::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult)
    {
    ShowCurrentPage(SW_SHOW); *pResult = 0;
    }void CPageTab::OnTcnSelchanging(NMHDR *pNMHDR, LRESULT *pResult)
    {
    ShowCurrentPage(SW_HIDE); *pResult = 0;
    }
      

  13.   

    头文件中 CPageTab m_tab;
    CDialog *mdlg1;
    CDialog *mdlg2;实现文件中
    CtestaDlg::OnInitDialog()下 mdlg1->Create(IDD_DIALOG1);
    mdlg2->Create(IDD_DIALOG2); m_tab.AddItem(mdlg1,"test1");
    m_tab.AddItem(mdlg2,"test2");一运行就错误.然后就关闭了?
    m_tab.AddItem((CWnd*)mdlg1,"test1");
    m_tab.AddItem((CWnd*)mdlg2,"test2"); //这样也不行- -
      

  14.   

    给你的文件就是我在项目里用的
    CDialog *mdlg1;
    CDialog *mdlg2
    你分配空间了吗
      

  15.   


    3Q.是没分配空间引起的问题.分配后好了.现在创建出来的窗口不在tab控件的位置.
    我以前用的现在加在了AddItem最前面.想在添加窗口时完成移动,但是不起作用.
    GetClientRect(rect);
    rect.InflateRect(-1,-30,-2,-2);
    pWnd->MoveWindow(rect);
      

  16.   

    搞定了.多谢xianglitian.原来是控件用GetClientRect,
    现在算窗口应该用GetWindowRect了.已经好了..再次感谢.