PRB: Rich Edit Control Message Handlers Are Not Called

Last reviewed: March 19, 1998
Article ID: Q181664
The information in this article applies to:
  • Microsoft Visual C++, 32-bit Editions, version 5.0

SYMPTOMS

There is a problem with the message-map entries that ClassWizard creates to handle the following Rich Edit control messages: EN_SETFOCUS, EN_KILLFOCUS. The message-map entry created by ClassWizard does not call the handler for these messages.

CAUSE

The wrong message map entries are added.

RESOLUTION

Replace the message-map entries generated for EN_SETFOCUS and EN_KILLFOCUS with the following entries:

   ON_EN_SETFOCUS(IDC_RICHEDIT1, OnSetfocusRichedit1)

   ON_EN_KILLFOCUS(IDC_RICHEDIT1, OnKillfocusRichedit1)

Note: You need to alter IDC_RICHEDIT1 to match the ID of your control.

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.

MORE INFORMATION

Steps to Reproduce Behavior

  1. Use the MFC AppWizard to create a dialog-based application.

  2. Drag a RichEdit control from the Controls palette onto the Dialog template using the Dialog Resource Editor.

  3. Open ClassWizard, and choose IDC_RICHEDIT1 for the ObjectID. To add message handlers for the EN_SETFOCUS and the EN_KILLFOCUS messages, highlight the message and click Add Function.

  4. Click OK, and look at the code. The following entry appears in the message-map if you selected EN_SETFOCUS:

          ON_NOTIFY(EN_SETFOCUS, IDC_RICHEDIT1, OnSetfocusRichedit1)
    

    However, this message-map entry should be:

          ON_EN_SETFOCUS(IDC_RICHEDIT1, OnSetfocusRichedit1)
    

    The following entry is also in the message-map if you selected EN_KILLFOCUS:

          ON_NOTIFY(EN_KILLFOCUS, IDC_RICHEDIT1, OnKillfocusRichedit1)
    

    However, this message-map entry should be:

          ON_EN_KILLFOCUS(IDC_RICHEDIT1, OnKillfocusRichedit1)
    

  5. If you build and run this project to see the problematic behavior, remember to add the line AfxInitRichEdit(); in the InitInstance() function of the CWinApp derived class.

  6. You can use the default handler created by ClassWizard and add a TRACE statement. Following is an example for the EN_KILLFOCUS message:

          void CMyDialog::OnSetfocusRichedit1(NMHDR* pNMHDR, LRESULT* pResult)
          {
    
             TRACE("This function will never be called\n");
             *pResult = 0;
          }
    
    

  7. The TRACE statement does not execute when you run a Debug build.

REFERENCES

For additional information, please see the following articles in the Microsoft Knowledge Base:

   ARTICLE-ID: Q166132
   TITLE     : PRB: Dialog With RichEdit May Fail During Creation

   ARTICLE-ID: Q165744
   TITLE     : BUG: RichEditCtrl IDs Not Shown in Member Variables Tab


Additional query words: CRichEditCtrl EN_SETFOCUS EN_KILLFOCUS RichEdit
Class Wizard
Version : WINNT:5.0;win95:5.0
Platform : Win95 winnt
Issue type : kbbug
Solution Type : kbpending


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.

Last reviewed: March 19, 1998
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.