KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q110800: FIX: CEditView in Splitter Window Doesn’t Update Document

Article: Q110800
Product(s): Microsoft C Compiler
Version(s): 1.0,1.5
Operating System(s): 
Keyword(s): kbMFC kbVC100bug kbVC150bug kbVC200bug kbGrpDSMFCATL kbArchitecturekbbuglist kbfixlist
Last Modified: 27-FEB-2002

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

- The Microsoft Foundation Classes (MFC), used with:
   - Microsoft Visual C++ for Windows, 16-bit edition, versions 1.0, 1.5 
   - Microsoft Visual C++, 32-bit Editions, version 1.0 
-------------------------------------------------------------------------------

SYMPTOMS
========

Normally, when the text in a CEditView object is changed, it sets the modified
flag of the document to which it is attached. If you try to close the last view
on the document or exit the application without saving, you will be prompted to
save the data.

When the CEditView derived class is a pane in a splitter window, the modified
flag is not set when the text changes.

CAUSE
=====

CEditViews are themselves edit controls. This means the notification messages
are sent to the parent of the CEditView.

When you don't have a splitter window, the CEditView is created as a child of a
class that is derived from CFrameWnd. A part of the command routing of CFrameWnd
is to send the message to the active view (in this case the CEditView message)
by calling the view's OnCmdMsg() member function. CEditView then handles the
EN_CHANGE notification message by setting the modified flag of the document.

When you use a splitter window, the CEditView message is a child of CSplitterWnd.
CSplitterWnd is derived from CWnd but not CFrameWnd. CWnds do not send messages
back to views as CFrameWnds do, so the message is not passed back to the
CEditView and the modified flag isn't set.

RESOLUTION
==========

In both cases the parent window of the CEditView calls the CEditView's
OnChildNotify() member function when it receives the EN_CHANGE notification
message. The workaround is to add an OnChildNotify() member function to a
CEditView derived class (called CMyEditView for the sample below).

The sample code shows the definition of the OnChildNotify() function. You will
also need to add a declaration for OnChildNotify() to your class declaration.

STATUS
======

Microsoft has confirmed this to be a bug in the Microsoft products listed at the
beginning of this article. This bug was corrected in MFC 3.0, included with
Visual C++ 2.0.

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

The name of the view class (CMyEditView) in the sample code below is for
purposes of discussion only. You should replace this with the name of your own
view class that you have derived from CEditView.

There are some differences in the way message parameters are "packed" into wParam
and lParam between 16-bit Windows and Win32. These differences are handled in
the sample code using conditional compilation based on the _WIN32 symbol. This
symbol is automatically defined by the 32-bit version of Visual C++.

SAMPLE CODE
-----------

  /*
  ** This is a code fragment only and will not compile as is. Please see
  ** the MORE INFORMATION section above.
  */ 
  BOOL CMyEditView::OnChildNotify( UINT message,
     WPARAM wParam,
     LPARAM lParam,
     LRESULT* pLResult )
  {
     WORD wNotification;
  #ifdef _WIN32
     wNotification = HIWORD(wParam);
  #else
     wNotification = HIWORD(lParam);
  #endif
     if (message == WM_COMMAND && wNotification == EN_CHANGE)
     {
        CEditView::OnEditChange();
        return TRUE;
     }
     else
        return FALSE;
  }

REFERENCES
==========

For more information on command routing, refer to the "Class Libraries
Reference" of the Microsoft Visual C++ documentation, or the online help for
CWnd::OnChildNotify.

Additional query words: 1.00 1.50 2.00 2.10 2.50 SetModifiedFlag CDocument kbNoUpdate

======================================================================
Keywords          : kbMFC kbVC100bug kbVC150bug kbVC200bug kbGrpDSMFCATL kbArchitecture kbbuglist kbfixlist
Technology        : kbAudDeveloper kbMFC
Version           : :1.0,1.5
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.