Article ID: 181664 - Last Review: December 8, 2003 - Revision: 3.0

PRB: Rich Edit Control Message Handlers Are Not Called

This article was previously published under Q181664

On This Page

Expand all | Collapse all

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. You will also need to change the prototypes for the message handlers generated by the wizard to:
afx_msg void OnSetfocusRichedit1();

afx_msg void OnKillfocusRichedit1();

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:
166132  (http://support.microsoft.com/kb/166132/EN-US/ ) PRB: Dialog With RichEdit May Fail During Creation

165744  (http://support.microsoft.com/kb/165744/EN-US/ ) BUG: RichEditCtrl IDs Not Shown in Member Variables Tab

APPLIES TO
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Keywords: 
kbbug kbprb kbwizard kbctrl kbpending KB181664
 

Article Translations