Microsoft KB Archive/147206

= FIX: Border of Modeless CPropertySheet Is Not 3D in Windows NT =

Article ID: 147206

Article Last Modified on 11/21/2006

-

APPLIES TO


 * Microsoft Foundation Class Library 4.2, when used with:
 * Microsoft Visual C++ 4.0 Standard Edition

-



This article was previously published under Q147206



SYMPTOMS
If you create a modeless CPropertySheet under Windows NT, its outer border will not be a 3D border. A modal CPropertySheet will have a 3D border. Both modal and modeless CPropertySheets have a 3D border under Windows 95.



CAUSE
MFC sets up a callback function for modeless CPropertySheets called AfxPropSheetCallback. This function checks for PSCB_PRECREATE, which is a message that is received before a property sheet is created. In this handler, MFC takes out the DS_MODALFRAME style.

Ctl3d32.dll is used by Windows NT to paint 3D borders for controls and windows. For a dialog box to have a 3D border, CTL3D requires a style of DS_MODALFRAME.



RESOLUTION
 Derive a class from CPropertySheet (CMySheet) and override its Create. Comment the call to CWnd::Create that the ClassWizard puts in. Copy code from CPropertySheet::Create in DLGPROP.CPP (as shown below) into CMySheet::Create, and change the parameters it takes accordingly.  Change this line: m_psh.dwFlags |= (PSH_MODELESS|PSH_USECALLBACK); to: m_psh.dwFlags |= PSH_MODELESS; The callback function isn't set so that PSCB_PRECREATE is not handled, and the DS_MODALFRAME style is not removed.   Comment out this line: m_psh.pfnCallback = AfxPropSheetCallback;  Include  in MySheet.h.  In MySheet.h, change the MySheet.Create to take the corresponding parameters: BOOL Create(CWnd* pParentWnd = NULL, DWORD dwStyle = WS_SYSMENU |               WS_POPUP | WS_CAPTION | DS_MODALFRAME | WS_VISIBLE,                DWORD dwExStyle = WS_EX_DLGMODALFRAME ); </li></ol>

<div class="status_section">

STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This problem was corrected in Visual C++, 32-bit Edition, version 4.1.

<div class="moreinformation_section">

Sample Code
// in MySheet.h
 * 1) include <afxpriv.h>

BOOL Create(CWnd* pParentWnd = NULL, DWORD dwStyle = WS_SYSMENU |     WS_POPUP | WS_CAPTION | DS_MODALFRAME | WS_VISIBLE,      DWORD dwExStyle = WS_EX_DLGMODALFRAME );

// In MySheet.cpp // CMySheet is derived from CPropertySheet BOOL CMySheet::Create(CWnd* pParentWnd, DWORD dwStyle, DWORD dwExStyle) {    _AFX_THREAD_STATE* pState = AfxGetThreadState; pState->m_dwPropStyle = dwStyle; pState->m_dwPropExStyle = dwExStyle;

ASSERT_VALID(this); ASSERT(m_hWnd == NULL);

// WS_SYSMENU must not be set if a property sheet is created as a child

if (dwStyle & WS_CHILD) dwStyle &= ~WS_SYSMENU;

// finish building PROPSHEETHEADER structure BuildPropPageArray; m_bModeless = TRUE; // original line specifies a callback function //  m_psh.dwFlags |= (PSH_MODELESS|PSH_USECALLBACK); // new line does not specify a callback function m_psh.dwFlags |= PSH_MODELESS; //  m_psh.pfnCallback = AfxPropSheetCallback; m_psh.hwndParent = pParentWnd->GetSafeHwnd;

// hook the window creation process AfxHookWindowCreate(this); HWND hWnd = (HWND)PropertySheet(&m_psh);

// clean up on failure, otherwise return TRUE if (!AfxUnhookWindowCreate) PostNcDestroy;    // cleanup if Create fails

if (hWnd == NULL || hWnd == (HWND)-1) return FALSE; ASSERT(hWnd == m_hWnd);

return TRUE; }

/* Compile options needed: default

Additional query words: 4.00 border CPropertySheet modeless Property Sheet vcfixlist410

Keywords: kbbug kbdlg kbfix kbuidesign kbvc410fix KB147206

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.