1

我有一个 type 的对话框CPropertyPage,在对话框中我显示一个CPropertySheet对象以显示几个选项卡。

最初,当我测试这个对话框时,我让它作为一个单独的对话框窗口 ( dialog.DoModal()) 运行。当我将它作为单独的对话框窗口运行时,该SetWindowPos()功能起作用,并且我成功地将CPropertySheet对象移动到正确的位置。

但是,然后我尝试将其合并CPropertyPage到另一个 parentCPropertySheet中。这是该SetWindowPos()功能不起作用的时候。

CPropertySheet当我有 a时 ,它似乎忽略了它CPropertyPage,它包含在 another 中CPropertySheet。有人知道为什么吗?

已编辑:添加了额外的代码和图片。

编码:

窗格“pane.h”:

CPropertySheet SheetSettings;

顶部CPropertySheet,顶部.h:

CMyDlg         PageMyDlg;

Onsize(UINT nType, int cx, int cy);

顶部CPropertySheet,顶部.cpp:

Top::Top()
{
    SheetSettings.AddPage(&PageMyDlg);
}

Top::Onsize(UINT nType, int cx, int cy)
{
     if(SheetSettings.GetSafeHwnd())
     {
          SheetSettings.MoveWindow(0, 0, cx, cy);
          CRect Rect;
          SheetSettings.GetClientRect(Rect);
          Rect.InflateRect(-2, -4, -2, -2);
          SheetSettings.GetTabControl()->MoveWindow(Rect.left, Rect.top, Rect.Width(), Rect.Height());
          SheetSettings.GetTabControl()->AdjustRect(FALSE, Rect);
          if (Page12nc.GetSafeHwnd())
              Page12nc.MoveWindow(Rect.left, Rect.top, Rect.Width(), Rect.Height());

      }
       // CPane holds the page where the CPropertySheet is drawn.
       CPane::OnSize(nType, cx, cy);
}

对话框'CMyDlg',MyDlg.h:

CPropertySheet _dlgPropSheet;

对话框'CMyDlg',MyDlg.cpp:

CRect rcSheet;
_dlgPropSheet.GetParent()->GetWindowRect(&rcSheet);
ScreenToClient( &rcSheet );
// This goes wrong.
_dlgPropSheet.SetWindowPos( NULL, rcSheet.left+26, rcSheet.top+223, rcSheet.Width(), rcSheet.Height(), SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE );

就是.doModal()我的CMyDlg.

就是在顶部绘制底部时绘制的内容。

4

1 回答 1

0

从这里:https ://jeffpar.github.io/kbarchive/kb/143/Q143291/

CPropertySheet 在第一次创建时记住其 CPropertyPages 的大小和位置。当用户选择不同的选项卡时,CPropertySheet 会收到 TCN_SELCHANGE 通知。作为对此的响应,CPropertySheet 使用新页面首次创建时的大小和位置来显示新页面。

所以基本上,你可以随心所欲地改变它,但 CPropertySheet 只是要马上改变它。我链接的页面建议使用 OnSize() 方法。

于 2020-10-10T03:40:54.193 回答