KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q184820: FIX: Apply Button on an ATL Control’s Property Page Is Disabled

Article: Q184820
Product(s): Microsoft C Compiler
Version(s): WINDOWS:2.0,2.1
Operating System(s): 
Keyword(s): kbnokeyword kbActiveX kbATL200bug kbATL210bug kbCOMt kbContainer kbCtrl kbPropSheet kbV
Last Modified: 28-JUN-2001

-------------------------------------------------------------------------------
The information in this article applies to:

- The Microsoft Active Template Library (ATL), versions 2.0, 2.1, used with:
   - Microsoft Visual C++, 32-bit Enterprise Edition, version 4.2b 
   - Microsoft Visual C++, 32-bit Professional Edition, version 4.2b 
   - Microsoft Visual C++, 32-bit Enterprise Edition, version 5.0 
   - Microsoft Visual C++, 32-bit Professional Edition, version 5.0 
-------------------------------------------------------------------------------

SYMPTOMS
========

When embedding an ATL ActiveX control inside a container application written in
Visual Basic (VB), the Apply button on the control's property page is never
activated even though the property page's dirty flag is set [that is, calling
SetDirty(TRUE)] to enable the button.

CAUSE
=====

Below is the SetDirty() function copied from the Atlctl.h file:

     void SetDirty(BOOL bDirty)
     {
        T* pT = static_cast<T*>(this);
        if (!pT->m_bDirty && bDirty)
           pT->m_pPageSite->OnStatusChange(
              PROPPAGESTATUS_DIRTY | PROPPAGESTATUS_VALIDATE);
        pT->m_bDirty = bDirty;
     }

When OnStatusChange() is called, Visual Basic in turn calls IsPageDirty(), which
returns S_OK if m_bDirty is set to TRUE; otherwise, S_FALSE.

However, as shown above, m_bDirty is not set until OnStatusChanged() returns.

RESOLUTION
==========

Please note that m_bDirty must be set before OnStatusChanged() is called in
SetDirty().

STATUS
======

Microsoft has confirmed this to be a bug in the Microsoft products listed at the
beginning of this article. This problem was corrected ATL version 3.0, which
shipped with Visual C++ version 6.0 for Windows.

MORE INFORMATION
================

The following are two workarounds:

1. Add an additional call to OnStatusChanged() right after SetDirty() is called.
  Using the ATL Polygon sample code, the change is shown below: "

        LRESULT OnSidesChange(WORD wNotify, WORD wID, HWND hWnd, BOOL&
           bHandled)
        {
           SetDirty(TRUE);
           m_pPageSite->OnStatusChange(
              PROPPAGESTATUS_DIRTY | PROPPAGESTATUS_VALIDATE);
           return 0;
        }

  " (without the quotation marks)

2. Change the SetDirty() function in Atlctl.h to the following: "

        void SetDirty(BOOL bDirty)
        {
           T* pT = static_cast<T*>(this);
           if (pT->m_bDirty != bDirty)
           {
              pT-.m_bDirty = bDirty;
              if (bDirty)
                 pT->m_pPageSite->OnStatusChange(
                    PROPPAGESTATUS_DIRTY | PROPPAGESTATUS_VALIDATE);
           }
        }

  " (without the quotation marks)

Steps to Reproduce Behavior
---------------------------

1. Place an ATL Polygon control on a Visual Basic Form.

2. Display the Polygon control's Property Pages dialog box by selecting the
  (Custom) property from Visual Basic's Properties window.

  NOTE: The Apply button on the Property Pages window is initially disabled.

3. Enter an integer value in the Sides edit box.

  NOTE: The Apply button remains disabled.

(c) Microsoft Corporation 1998, All Rights Reserved. Contributions by Yeong- Kah
Tam, Microsoft Corporation

Additional query words: ocx

======================================================================
Keywords          : kbnokeyword kbActiveX kbATL200bug kbATL210bug kbCOMt kbContainer kbCtrl kbPropSheet kbVBp kbVC420bug kbVC500bug kbVC600fix kbATL300fix kbGrpDSMFCATL 
Technology        : kbVCsearch kbAudDeveloper kbATLsearch
Version           : WINDOWS:2.0,2.1
Issue type        : kbbug
Solution Type     : kbfix

=============================================================================

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.