FIX:CScrollView::OnHScroll/OnVScroll Do Not Call OnChildNotify

Last reviewed: September 19, 1997
Article ID: Q150574
1.50 1.51 1.52 | 2.00 2.10 2.20
WINDOWS        | WINDOWS NT
kbprg kbbuglist kbfixlist

The information in this article applies to:

  • The Microsoft Foundation Classes (MFC), included with:

        - Microsoft Visual C++ for Windows, versions 1.5, 1.51, 1.52
        - Microsoft Visual C++, 32-bit Edition, versions 2.0, 2.1, 2.2
    

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:

   ARTICLE-ID: Q133034
   TITLE     : 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:

   ARTICLE-ID: Q133034
   TITLE     : BUG: CSpinButtonCtrl Causes Assertion in viewscrl.cpp
               line 698.

MFC Technical Note #21 - Command and Message Routine

Books Online - CWnd::OnChildNotify


Additional reference words: 1.50 1.51 1.52 2.00 2.10 2.20
KBCategory: kbprg kbbuglist kbfixlist
KBSubcategory: MfcDocView
Keywords : MfcDocView kbbuglist kbfixlist kbprg
Technology : kbMfc
Version : 1.50 1.51 1.52 | 2.00 2.10 2.20
Platform : NT WINDOWS
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.

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