Windows MFC:将子对话框调整为选项卡控件显示区域

Posted

技术标签:

【中文标题】Windows MFC:将子对话框调整为选项卡控件显示区域【英文标题】:Windows MFC: adjust child dialog to a tab control display area 【发布时间】:2018-04-04 08:28:20 【问题描述】:

我正在创建一些基于对话框的 MFC 应用程序 (C++),并且需要使用选项卡控件。这是我尝试将子对话框调整为选项卡控件显示区域的代码(Visual Studio 2015):

/* main dialog */
BOOL CResourceBrowserDlg::OnInitDialog()

   ....
   /* 
    * `m_Page` is my child dialog instance:
    * CDlgFilterPage::CDialogEx *m_Page
    */
   m_Page = new CDlgFilterPage();
   m_Page->Create(IDD_FILTERPAGE, m_FilterTab.GetWindow(IDD_FILTERPAGE));

   RECT rect;

   /*
    * `m_FilterTab` is a tab control element:
    * CTabCtrl m_FilterTab
    */
   m_FilterTab.GetWindowRect(&rect);
   m_FilterTab.AdjustRect(FALSE, &rect);

   m_Page->MoveWindow(&rect);
   m_Page->ShowWindow(SW_SHOW);

   m_FilterTab.InsertItem(0, L"Page1");
   ...

运行这个我得到了以下信息:

那么我应该如何让子窗口很好地适应选项卡控件?

【问题讨论】:

见About Tab Controls: Display Area。 已经完成了。实际上我的代码就是基于它的。 看起来你得到的是标签窗口矩形,而不是标签内部区域矩形。 但是我怎样才能得到内在呢? 在上面链接的文章中有解释。 【参考方案1】:

首先,您可能希望先添加一个页面,然后将另一个对话框放置在选项卡的客户区域内。否则,您的选项卡窗口将没有选项卡按钮,并且对话框的大小将超出您的预期。

其次,您需要将新对话框放置在客户区域内。您必须检索它,然后根据窗口区域对其进行翻译。

这就是你如何做到的:

m_Page = new CDlgFilterPage();
m_Page->Create(IDD_FILTERPAGE, m_FilterTab.GetWindow(IDD_FILTERPAGE));

m_FilterTab.InsertItem(0, L"Page1");

CRect rcClient, rcWindow;

m_FilterTab.GetClientRect(&rcClient);   
m_FilterTab.AdjustRect(FALSE, &rcClient);

m_FilterTab.GetWindowRect(&rcWindow);   
ScreenToClient(rcWindow);

rcClient.OffsetRect(rcWindow.left, rcWindow.top);

m_Page->MoveWindow(&rcClient);
m_Page->ShowWindow(SW_SHOW);

结果是这样的:

【讨论】:

rcClient.OffsetRect 的参数不应该是负数吗?因为局部坐标小于窗口坐标?【参考方案2】:

不要尝试在 OninitDialog() 函数中获取窗口位置。它将显示 0,0 位置而不是对话框的实际位置。

【讨论】:

以上是关于Windows MFC:将子对话框调整为选项卡控件显示区域的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MFC 选项卡控件 (TabCtrl) 获取额外数据?

Qt 选项卡小部件中的 MFC 控件

使 MFC CTabCtrl 不使用绘图选项卡的完整控件宽度

如何从MFC选项卡控件(TabCtrl)获取额外数据?

选项卡控件中的嵌入式对话框不能在第二个对话框中工作,MFC

MFC里的CMFCPropertyGridCtrl怎么多页切换