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

时间:2018-04-04 08:28:21

标签: c++ visual-studio mfc

我正在创建一些基于对话框的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");
   ...
}

运行此我得到以下内容:

enter image description here

那么我应如何采取措施让儿童窗口在标签控件中很好地适应呢?

2 个答案:

答案 0 :(得分:3)

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

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

以下是您如何做到这一切:

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);

结果如下:

enter image description here

答案 1 :(得分:0)

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