Article: Q148616
Product(s): Microsoft C Compiler
Version(s): winnt:
Operating System(s):
Keyword(s): kbole kbActiveX kbCOMt kbContainer kbCtrl kbLocalSvr kbMFC kbVC400bug kbVC410fix kbGrpD
Last Modified: 06-MAY-2001
-------------------------------------------------------------------------------
The information in this article applies to:
- The Microsoft Foundation Classes (MFC), used with:
- Microsoft Visual C++ 32-bit Edition, version 4.0
-------------------------------------------------------------------------------
SYMPTOMS
========
When you use the arrow keys to change between controls in a Visual C++ 4.0
generated container, the DISPID_AMBIENT_DISPLAYASDEFAULT ambient property of the
control site is not updated, and any control that relies on this property
doesn't function correctly.
For example, a subclassed button control that is programmed to update its border
according to the DISPID_AMBIENT_DISPLAYASDEFAULT ambient property will exhibit
this behavior. In a Visual C++ generated container, the control won't update its
border.
CAUSE
=====
In Occdlg.cpp, the following line 542 shouldn't be called:
bCheckDef = FALSE;
This line keeps CheckDefPushButton from being called and the ambient property
from being updated.
RESOLUTION
==========
The best solution is to upgrade to Visual C++ 4.1. If this is not a possibility,
the MFC DLL can be rebuilt without bCheckDef = FALSE; however, Microsoft
recommends against this because you need to rebuild the DLL with a different
name (see tech note 33).
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 Microsoft Visual C++
version 4.1.
MORE INFORMATION
================
Sample Code
-----------
The following code can be added to the Button Control sample shipped with Visual
C++ to demonstrate this problem.
///////////////////////////////////////////////////////////////////////////
/
// Display the button with a thick border if appropriate
void CButtonCtrl::OnAmbientPropertyChange(DISPID dispid)
{
TRACE("OnAmbientPropertyChange called\n");
BOOL bDisplayAsDefault = FALSE;
if(DISPID_AMBIENT_DISPLAYASDEFAULT != dispid)
return;
// Check the control site to see if you should add or remove the border
if (!GetAmbientProperty(DISPID_AMBIENT_DISPLAYASDEFAULT, VT_BOOL,
&bDisplayAsDefault))
ASSERT(FALSE);
if(bDisplayAsDefault)
SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, 0);
else
SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, 0);
InvalidateControl();
}
Additional query words: 4.00 focus
======================================================================
Keywords : kbole kbActiveX kbCOMt kbContainer kbCtrl kbLocalSvr kbMFC kbVC400bug kbVC410fix kbGrpDSMFCATL kbNoUpdate kbbuglist kbfixlist
Technology : kbAudDeveloper kbMFC
Version : winnt:
Issue type : kbbug
Solution Type : kbfix
=============================================================================