65.9K
CodeProject 正在变化。 阅读更多。
Home

卡片对话框

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.57/5 (4投票s)

2000年1月20日

viewsIcon

59888

downloadIcon

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/ 下载最新版本。

© . All rights reserved.