CPropertySheet size...

I have made a Propertysheet, but the damn thing sizes itself to the widest page contained within it. When I use Sheet.SetWindowPos, The right side of the sheet gets clipped away...


Is there some way to avoid this??
Is there some way I can make a property sheet the size I want to, without the clipping?

The reason I wanna do this, is that it makes the space on the right side a great deal larger than on the bottom, top and left..

Who is Participating?
ZoppoConnect With a Mentor Commented:
Hi lar_jens,

perhaps I found a solution which can be adapted for your need. At www.codeproject.com I found code which makes a property sheet appear matching to the size of its first page resource. I modified this a bit because the sheet's buttons were not moved. To use it derive a new class from CPropertySheet and implement its OnInitDialog like this:

BOOL CMyPropertySheet::OnInitDialog()
 // Inherited call
 // Modifying exstyle in create method doesn't seem to work :-?, I guess
 // DIALOGEX property sheets are not very well supported (if at all)
 // We cannot access here the exstyle passed at creation time (dlgprop.cpp
 // stores temporaly in AfxGetThreadState()->m_dwPropStyle, but when OnInitDialog
 // is called that variable can have been overwritten
 ModifyStyleEx(0, WS_EX_TOOLWINDOW);
 // Resize property sheet and tab ctrl to exactly fit the page, as by default
 // PropertyPages have a non-sense minimum width of 214DLUs (MS dixit)
 // Height has also a minimum size.
 // There must be at least one property page, so safe accessing it is not needed
 // (if it has no pages MFC will not show the PropertySheet)
 CPropertyPage* pppg = GetActivePage();
 // Get the resource for first page (all pages are assumed to be of the same
 // dimensions).
 HRSRC hrsrc;
 if (AfxIsValidString(pppg->m_psp.pszTemplate))
  hrsrc = FindResource(pppg->m_psp.hInstance, pppg->m_psp.pszTemplate, RT_DIALOG);
  hrsrc = FindResource(pppg->m_psp.hInstance, MAKEINTRESOURCE(pppg->m_psp.pszTemplate), RT_DIALOG);
 // If found, we can resize the page (which was resized at creation time by MFC's),
 // It suffices modifying the layout here, as once the first page is added, MFC never
 // resizes the dialog again to fit MS's minimum sizes of PropertyPages (even if you add
 // new pages with AddPage() )
 if (hrsrc) {
  HGLOBAL hgbl = LoadResource(pppg->m_psp.hInstance, hrsrc);
  if (hgbl) {
   pdlgtpl = (LPDLGTEMPLATE) LockResource(hgbl);
   if (pdlgtpl) {
    DLGTEMPLATEEX* pdlgtplex = (DLGTEMPLATEEX*) pdlgtpl;
    CRect rcOriginal;
    // Support for DIALOGEX PropertyPages, although those aren't very well supported
    // either
    if (pdlgtplex->signature == 0xFFFF) {
     // DIALOGEX resource
     rcOriginal.SetRect(pdlgtplex->x, pdlgtplex->y, pdlgtplex->x + pdlgtplex->cx, pdlgtplex->y + pdlgtplex->cy);
    } else {
     // DIALOG resource
     rcOriginal.SetRect(pdlgtpl->x, pdlgtpl->y, pdlgtpl->x+pdlgtpl->cx, pdlgtpl->y+pdlgtpl->cy);
    // Okay, let's retrieve original size of PropertyPage
    CRect rcModified;
    // If our original PropertyPage was not modified, the follwing code
    // will make dcx = 0 and dcy = 0, so it works even for pages bigger
    // than the minimum property page
    int dcx = rcModified.Width() - rcOriginal.Width();
    int dcy = rcModified.Height() - rcOriginal.Height();
    // We could deflate the pages by 0 and it would work, but just
    // to be proper
    if (dcx || dcy) {
     // Resize PropertyPage
     pppg->SetWindowPos(NULL, 0,0,rcModified.Width(), rcModified.Height(), SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE);
     // Resize TabControl
                                        GetTabControl()->SetWindowPos(NULL, 0,0,rcModified.Width(), rcModified.Height(), SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE);
     // Resize PropertySheet
     SetWindowPos(NULL, 0,0,rcModified.Width(), rcModified.Height(), SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE);

// next lines added by me (ZOPPO) to move buttons to correct position, could be modified
// to handle shrinking of the buttons when the dialog is too small...
// I found that code at http://www.codeguru.com/propertysheet/resize_sheet.shtml
     int ids[] = { IDOK, IDCANCEL, ID_APPLY_NOW };
     CRect rectWnd;
     for( int i =0; i < sizeof(ids)/sizeof(ids[0]); i++)
      rectWnd.OffsetRect( -dcx, -dcy );
   // We are not supposed to call GlobalFree on hgbl (see the topic on LoadResource),
   // but MFC code does it this way (dlgprop.cpp)
   // Anyway the other alternative is to call FreeResource and that's a 16bit func
   // that doesn't seem to do anything on win32

 return TRUE;

hope that helps,

You would need to derive class from CPropertySheet and overwrite OnInitDialog(). See CPropertySheet::OnInitDialog()(dlgprop.cpp in MFC source code) to understand how to resize dialog.
lar_jensAuthor Commented:

I'm sorry, but I would expect a little more explanation for 200 points..

Listen.. 200 points means that the question is HARD, thus requiring HARD work to answer..

No offence, but I think that your explanation was a little vague..

lar_jensAuthor Commented:
What I want to know is how I can resize the CPropertySheet without it's beeing clipped on the right side..

OnInitDialog uses ::SetWindowPos (same as I am), but when I use it the right side of the sheet gets clipped away..
lar_jensAuthor Commented:
Thank you..
Just what I'm looking 4...

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.