Article: Q152000
Product(s): Microsoft C Compiler
Version(s): winnt:4.0,4.1
Operating System(s):
Keyword(s): kbActiveX kbCOMt kbCtrlCreate kbMFC KbUIDesign kbVC400 kbVC410 kbGrpDSMFCATL
Last Modified: 06-MAY-2001
-------------------------------------------------------------------------------
The information in this article applies to:
- The Microsoft Foundation Classes (MFC), used with:
- Microsoft Visual C++, 32-bit Editions, versions 4.0, 4.1
-------------------------------------------------------------------------------
SYMPTOMS
========
MFC Controls support a set of standard properties. One of these properties is
Appearance (DISPID_APPEARANCE). Appearance is implemented to give a control a
3-D look. If the control is used on a version of Windows or Windows NT less than
4.0, the Appearance property will not affect the appearance of the control at
run time.
CAUSE
=====
At run time, the Appearance property is implemented in an MFC control by setting
an extended window style WS_EX_CLIENTEDGE. This window style is not supported on
versions of Windows or Windows NT less than 4.0.
RESOLUTION
==========
It is possible to supply your own implementation of the Appearance property
although this technique will not work for subclassed Windows controls.
STATUS
======
This behavior is by design.
MORE INFORMATION
================
Using the Class Wizard, add the stock Appearance property but choose Get/Set
methods rather that accepting the stock implementation. In the control, declare
a member variable of type BOOL to represent the Appearance property. The stock
Get/Set functions can be copied and changed slightly to manipulate this variable
as well as handle the property binding requirements. In the Draw function, draw
a 3-D border depending on the value of this variable.
Sample Code
-----------
// these get and set functions are the same as the original with a minor
// change (noted in the code)
short CTestAppearanceCtrl::GetAppearance()
{
return m_MyAppearance;
}
void CTestAppearanceCtrl::SetAppearance(short nNewValue)
{
if (nNewValue != 0 && nNewValue != 1)
ThrowError(CTL_E_INVALIDPROPERTYVALUE,
AFX_IDP_E_INVALIDPROPERTYVALUE);
// Is the property changing?
if (m_MyAppearance == nNewValue)
return;
if (!BoundPropertyRequestEdit(DISPID_APPEARANCE))
SetNotPermitted();
// changed from original
// do not use the WS_EX_CLIENTEDGE style
//ASSERT((m_hWnd == NULL) ||
// ((GetExStyle() & WS_EX_CLIENTEDGE) == (DWORD)(m_sAppearance ?
// WS_EX_CLIENTEDGE : 0)));
m_MyAppearance = nNewValue;
SetModifiedFlag();
//ToggleAppearance(this);
// end of changes
OnAppearanceChanged();
BoundPropertyChanged(DISPID_APPEARANCE);
}
void CTestAppearanceCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
// TODO: Replace the following code with your own drawing code.
pdc->FillRect(rcBounds,
CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
pdc->Ellipse(rcBounds);
// draw as 3D if m_appearance is set
if(m_appearance)
{
CRect rect(rcBounds);
pdc->DrawEdge(rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
}
}
Additional query words: 4.00 4.10 DISPID_APPEARANCE
======================================================================
Keywords : kbActiveX kbCOMt kbCtrlCreate kbMFC KbUIDesign kbVC400 kbVC410 kbGrpDSMFCATL
Technology : kbAudDeveloper kbMFC
Version : winnt:4.0,4.1
Issue type : kbprb
=============================================================================