SetWindowPos() работает для диалога, но не в CPropertyPage

У меня есть диалог типа CPropertyPageгде в диалоге я показываю CPropertySheet Объект для отображения пары вкладок.

Первоначально, когда я тестировал этот диалог, он работал как отдельное диалоговое окно (dialog.DoModal()). Когда я запускаю его как отдельное диалоговое окно, SetWindowPos() функция работает, и я успешно переместил CPropertySheet объект в правильном месте.

Однако тогда я попытался включить это CPropertyPage в другого родителя CPropertySheet, Это когда SetWindowPos() функция не работает

Кажется, что он игнорирует это, когда у меня есть CPropertySheet на CPropertyPage, который входит в другой CPropertySheet, Кто-нибудь знает, почему?

Отредактировано: добавлен дополнительный код и картинки.

Код:

Панель 'pane.h':

CPropertySheet SheetSettings;

верхний CPropertySheettop.h:

CMyDlg         PageMyDlg;

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

верхний CPropertySheet, top.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,

И это то, что он рисует, когда снизу рисуется сверху.

0 ответов

Отсюда: https://jeffpar.github.io/kbarchive/kb/143/Q143291/

CPropertySheet запоминает размер и положение своих CPropertyPages при их первом создании. Когда пользователь выбирает другую вкладку, CPropertySheet получает уведомление TCN_SELCHANGE. В ответ на это CPropertySheet показывает новую страницу, используя размер и положение, которое она имела при первом создании.

По сути, вы можете изменить все, что захотите, но CPropertySheet просто собирается изменить его обратно. На странице, на которую я ссылаюсь, предлагается использовать метод OnSize().

Другие вопросы по тегам