在最近的一个项目中使用视觉框架中,我需要一个对话框,总是存在重叠,其内容(子控件和布局)是变化的根据当前选择的视图或选项卡。而不是创建几个独立对话框,选择哪一个是可见的,我设计了一个所谓的卡片对话框。 卡对话框是一个空的标准对话框。它包含一个卡片列表(子对话框)。这取决于应用程序,一个卡片是可见的和启用。此外,卡对话框将调整大小的卡片。几个虚拟函数使程序员能够创建时初始化卡/销毁或(de)时激活。 步骤1: 创建一个空的对话框资源(这将是一个卡对话框)。大小并不重要。应该是空的(没有控制)以来客户区将会覆盖着一个卡片。使用ClassWizard创建相应的类。如果你打算使用它作为一个模态对话框然后创建OnInitDialog处理程序。 步骤2: 创建一个单独的对话框资源为每张卡片。对话框资源应该有以下方式: 子对话框 没有边界 没有标题 禁用 不可见的 地方任何控件,您需要在每个对话框。使用ClassWizard,创建一个对应的类。这个类必须来自TCard。TCard类没有任何特殊的实现。它唯一的目的是防止关闭卡当用户按下Enter键或逃避(TCard:位置()和TCard::虚()空表实现)。 步骤3: 初始化卡对话框中通过添加卡片。这是示例(一张非模态的对话框):隐藏,复制Code
// Create a modeless card dialog m_CardDialog.Create(IDD_CARD_DIALOG, this); // Add cards m_CardDialog.AddCard(IDD_CARD_ONE); m_CardDialog.AddCard(IDD_CARD_TWO); m_CardDialog.AddCard(IDD_CARD_THREE); // Show third card m_CardDialog.ShowCard(IDD_CARD_THREE); // Show card dialog m_CardDialog.ShowWindow(SW_SHOW);
如果TCardDialog:: ShowCard()是不叫的,卡对话框将显示第一个卡。 先前的示例使用TCardDialog:: AddCard()使用UINT国家免疫日添加卡是卡的资源ID)(国家免疫日。在这种情况下,AddCard()将调用一个虚拟函数TCardDialog:: CreateCard()使用UINT国家免疫日断言。所以,m_CardDialog必须一个类的实例来自TCardDialog实现函数CreateCard()以以下方式:隐藏,复制Code
CDialog *CCardDialog::CreateCard(UINT nId) { switch (nId) { case IDD_CARD_ONE: return new CCardOne; // CCardOne is derived from TCard case IDD_CARD_TWO: return new CCardTwo; // CCArdTwo is derived from TCard .... } return NULL; }
另一种解决方案是使用TCardDialog: AddCard(,使用UINT国家免疫日TCard * pDialog) pDialog在哪一个类的实例来自TCard和创建新的。实际创建对话框不应该。示例:隐藏,复制Code
// Create a modeless card dialog m_CardDialog.Create(IDD_CARD_DIALOG, this); // Add cards m_CardDialog.AddCard(IDD_CARD_ONE, new CCardOne); m_CardDialog.AddCard(IDD_CARD_TWO, new CCardTwo); m_CardDialog.AddCard(IDD_CARD_THREE, new CCardThree); // Show third card m_CardDialog.ShowCard(IDD_CARD_THREE); // Show card dialog m_CardDialog.ShowWindow(SW_SHOW);
在这种情况下,m_CardDialog可以TCardDialog因为虚函数的实例CreateCard()将不会被调用。 当创建一个卡片(对话框),TCardDialog将调用虚函数TCardDialog:: OnCardCreated()。卡被摧毁之前,TCardDialog将调用虚函数TCardDialog:: OnCardDestroyed()。这两个虚函数使派生类来执行初始化的卡片。 步骤4: 为了切换活动卡,调用以下函数:隐藏,复制Code
m_CardDialog.ShowCard(IDD_CARD_TWO);
您可以获得一个指向当前活动卡:隐藏,复制Code
CDialog *pDialog = m_CardDialog.GetCard();
TCardDialog: ShowCard()将调用虚函数TCardDialog:: CanShowCard()检查是否允许改变活动卡。活动卡一旦改变,TCardDialog将调用虚函数TCardDialog:: OnShowCard()首先为停用卡,然后激活。这两个虚函数允许一个派生类来执行更多任务相关的卡片。 我希望你会发现这门课很有用。 可以从http://www.scasoftware.com/下载最新版本。 本文转载于:http://www.diyabc.com/frontweb/news8112.html