Microsoft KB Archive/147684

= FIX: Sending WM_xSCROLL Message Causes Invalid ASSERT =

Article ID: 147684

Article Last Modified on 11/21/2006

-

APPLIES TO


 * Microsoft Foundation Class Library 4.2, when used with:
 * Microsoft Visual C++ 4.0 Standard Edition

-



This article was previously published under Q147684



SYMPTOMS
Forcing a window to scroll to an absolute location by sending it a WM_HSCROLL or WM_VSCROLL message with the SB_THUMBPOSITION or SB_THUMBTRACK scrolling codes might cause an assertion. The assertion is in Wincore.cpp file on line 1938.



CAUSE
The assertion tries to ensure that for the current message, the nTrackPos member of the SCROLLINFO structure retrieved from a call to ::GetScrollInfo is the same as the thumb position specified in the message. The value of this variable is retrieved by calling ::GetScrollInfo, and it reflects the current scroll thumb position only when the user is dragging the thumb. In the case of a programmatically sent scroll message with the SB_THUMBPOSITION code, this value is not valid. Because this value is indeterminate, it will not likely match the thumb position specified in the message, and the assertion will fail.

Also, even if the assertion is ignored, the WM_xSCROLL message handler will be called with an invalid scroll position when the WM_xSCROLL message is sent programmatically.



RESOLUTION
If the assertion is ignored, you cannot rely on the position value passed to the WM_xSCROLL handler and must make a call to GetCurrentMessage to get the values specified in the message instead. If this is done properly, then the assertion can be safely ignored. For more information on this, please refer to the sample code included in this article.

If the assertion occurs too often to manually select 'Ignore' in the assertion failure message box, you can programmatically turn off assertion failures with the following code: int nPrevMode = _CrtSetReportMode(_CRT_ASSERT,0); // Code that causes the assertion, for example: // SendMessage(WM_VSCROLL,...) _CrtSetReportMode(_CRT_ASSERT,nPrevMode);
 * 1) ifdef _DEBUG
 * 1) endif
 * 1) ifdef _DEBUG
 * 1) endif



STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This problem was corrected in Visual C++, 32-bit Edition, version 4.1.



MORE INFORMATION
This assertion is part of some new code added in MFC 4.0 to accomplish 32 bit scrolling and exists in the function CWnd::OnWndMsg.

Sample Code to Reproduce and Resolve the problem
The following code demonstrates the problem: // Assume that nScrollPos is not 0

WPARAM wParam = MAKELONG ( SB_THUMBPOSITION, nScrollPos); pView->SendMessage( WM_VSCROLL, wParam );

// As mentioned above, ignore the assert. // Change the OnVScroll handler to the following : void CMyView::OnVScroll(UINT nSBCode, UINT nPos,                       CScrollBar* pScrollBar) {   if(nSBCode = SB_THUMBPOSITION ) {       const MSG* pMsg = GetCurrentMessage; nPos = (short)HIWORD(pMsg->wParam); } // Do your processing here CEditView::OnVScroll(nSBCode, nPos, pScrollBar); } NOTE: CMyView is derived from CEditView. However the same technique works for any CWnd derived class. Remember, the same problem also occurs for scroll messages programmatically sent with the SB_THUMBTRACK code.

Additional query words: 4.00 Windows 95 vcrel 1948 vcfixlist410

Keywords: kbbug kbfix kbnoupdate kbuidesign kbvc410fix KB147684

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.