SetWindowPos() работает для диалога, но не в CPropertyPage
У меня есть диалог типа CPropertyPage
где в диалоге я показываю CPropertySheet
Объект для отображения пары вкладок.
Первоначально, когда я тестировал этот диалог, он работал как отдельное диалоговое окно (dialog.DoModal()
). Когда я запускаю его как отдельное диалоговое окно, SetWindowPos()
функция работает, и я успешно переместил CPropertySheet
объект в правильном месте.
Однако тогда я попытался включить это CPropertyPage
в другого родителя CPropertySheet
, Это когда SetWindowPos()
функция не работает
Кажется, что он игнорирует это, когда у меня есть CPropertySheet
на CPropertyPage
, который входит в другой CPropertySheet
, Кто-нибудь знает, почему?
Отредактировано: добавлен дополнительный код и картинки.
Код:
Панель 'pane.h':
CPropertySheet SheetSettings;
верхний CPropertySheet
top.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().