FIX: CScrollView::OnHScroll/OnVScroll Do Not Call OnChildNotify (150574)



The information in this article applies to:

  • The Microsoft Foundation Classes (MFC), when used with:
    • Microsoft Visual C++ for Windows, 16-bit edition 1.5
    • Microsoft Visual C++ for Windows, 16-bit edition 1.51
    • Microsoft Visual C++ for Windows, 16-bit edition 1.52
    • Microsoft Visual C++, 32-bit Editions 2.0
    • Microsoft Visual C++, 32-bit Editions 2.1
    • Microsoft Visual C++, 32-bit Editions 2.2

This article was previously published under Q150574

SYMPTOMS

Scroll messages generated by scroll related controls in a CScrollView- derived object fail to invoke the control's OnChildNotify function.

CAUSE

CScrollView::OnVScroll and CScrollView::OnHScroll do not call SendChildNotifyLastMsg, which is responsible for calling OnChildNotify.

RESOLUTION

Override OnVScroll and/or OnHScroll for your CScrollView-derived class, and implement this code:
   void CMyView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar*
   pScrollBar)
   {
       if (pScrollBar != NULL && pScrollBar->SendChildNotifyLastMsg())
           return;     // eat it

       // ignore scroll bar msgs from other controls
       if (pScrollBar != GetScrollBarCtrl(SB_VERT))
           return;

       OnScroll(MAKEWORD(-1, nSBCode), nPos);
   }

   void CMyView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar*
   pScrollBar)
   {
       // same as above
       ...
   }
				

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This problem is corrected in Microsoft Visual C++ version 4.0.

MORE INFORMATION

OnChildNotify is called by the control's parent window when the parent window receives a notification message that applies to this control. Notification messages include control notification messages such as WM_COMMAND sent by controls, some specific Windows messages such as WM_HSCROLL, WM_VSCROLL, and WM_CTLCOLOR, and a few others.

NOTE: For more information, see Tech note #21.

OnChildNotify allows a control an initial opportunity to view these messages before the control reaches its parent.

The code reflects corrections for a bug reported in the following article in the Microsoft Knowledge Base:

133034 BUG: CSpinButtonCtrl Causes Assertion in Viewscrl.cpp line 698

The need for CScrollView to pass scroll messages correctly to OnChildNotify arises from implementing a CSpinButtonCtrl control, or an additional CScrollbar control in the view.

REFERENCES

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

133034 BUG: CSpinButtonCtrl Causes Assertion in viewscrl.cpp line 698.

MFC Technical Note #21 - Command and Message Routine

Books Online - CWnd::OnChildNotify

Modification Type:MajorLast Reviewed:12/10/2003
Keywords:kbBug kbDocView kbfix kbNoUpdate kbVC400fix KB150574