卡片对话框






3.57/5 (4投票s)
2000年1月20日

59888

1656
一个自动调整大小的对话框,用于存储和显示较小的子对话框。
在一个最近的项目中,该项目使用了一个可视化框架,我需要一个始终存在的重叠对话框,并且其内容(子控件及其布局)会根据当前选定的视图或选项卡而变化。我没有创建几个独立的对话框并选择哪个对话框可见,而是设计了一个所谓的卡片对话框。
卡片对话框是一个空的标准对话框。它包含一个卡片(子对话框)列表。根据应用程序的不同,其中一张卡片是可见和启用的。此外,卡片对话框将根据卡片的大小调整自身大小。几个虚函数允许程序员在卡片被创建/销毁或被(取消)激活时对其进行初始化。
步骤 1
创建一个空的对话框资源(这将是一个卡片对话框)。尺寸并不重要。它应该是空的(没有控件),因为它的客户区将被其中一张卡片覆盖。使用 ClassWizard 创建一个对应的类。如果您打算将其用作模态对话框,则创建一个 OnInitDialog
处理程序。
第二步
为每张卡片创建一个单独的对话框资源。对话框资源应具有以下样式
- 子对话框
- 无边框
- 无标题
- 禁用
- 不可见
在每个对话框上放置您需要的任何控件。使用 ClassWizard,创建一个对应的类。此类必须从 TCard
派生。 TCard
类没有任何特殊的实现。它的唯一目的是防止用户按下 Enter 或 Escape 时关闭卡片(TCard::OnOK()
和 TCard::OnCancel()
具有空实现)。
步骤 3
通过添加卡片来初始化卡片对话框。这是一个示例(对于非模态卡片对话框)
// 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 nId)
添加卡片(nId
是卡片资源 ID)。在这种情况下,AddCard()
将调用一个虚函数 TCardDialog::CreateCard(UINT nId)
,该函数会 ASSERT
。因此,m_CardDialog
必须是从 TCardDialog
派生的类的实例,该类以以下方式实现函数 CreateCard()
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 nId, TCard *pDialog)
,其中 pDialog
是从 TCard
派生的类的实例,并使用 new
创建。不应创建实际对话框。示例
// 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()
。这 2 个虚函数使派生类能够执行卡片的初始化。
步骤 4
为了切换活动卡片,请调用以下函数
m_CardDialog.ShowCard(IDD_CARD_TWO);
您可以使用以下命令获取指向当前活动卡片的指针
CDialog *pDialog = m_CardDialog.GetCard();
TCardDialog::ShowCard()
将调用虚函数 TCardDialog::CanShowCard()
以检查是否允许更改活动卡片。一旦更改了活动卡片,TCardDialog
将首先为停用卡片调用虚函数 TCardDialog::OnShowCard()
,然后为激活卡片调用。这 2 个虚函数使派生类能够执行与卡片相关的其他任务。
我希望您会发现这个类有用。
可以从 http://www.scasoftware.com/ 下载最新版本。