SetWindowPos() works for a dialog, but not in a CPropertyPage

275 Views Asked by At

I have a dialog of type CPropertyPage, where within the dialog I'm showing a CPropertySheet object to display a couple of tabs.

Initially, when I was testing this dialog, I had it running as a separate dialog window (dialog.DoModal()). When I am running it as a separate dialog window, the SetWindowPos() function works, and I succesfully moved my the CPropertySheet object to the correct location.

However, then I tried to incorporate this CPropertyPage into another parent CPropertySheet. This is when the SetWindowPos() function doesn't work.

It seems like it ignores it when I have a CPropertySheet on a CPropertyPage, which is included in another CPropertySheet. Does anybody have any idea why?

EDITED: Added extra code and pictures.

The code:

Pane 'pane.h':

CPropertySheet SheetSettings;

Top CPropertySheet, top.h:

CMyDlg         PageMyDlg;

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

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

Dialog 'CMyDlg', MyDlg.h:

CPropertySheet _dlgPropSheet;

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

This is what I get when I .doModal() my CMyDlg.

And this is what it draws when bottom is drawn on top.

1

There are 1 best solutions below

0
On

From here: https://jeffpar.github.io/kbarchive/kb/143/Q143291/

The CPropertySheet remembers the size and position of its CPropertyPages when they are first created. When a different tab is selected by the user, the CPropertySheet receives a TCN_SELCHANGE notification. In response to this, the CPropertySheet shows the new page using the size and position it had when it was first created.

So basically, you can change it all you want, but CPropertySheet is just going to change it right back. The page I linked gives a suggestion to use the OnSize() method.