Microsoft KB Archive/117608

{|
 * width="100%"|

PRB: OnScroll Change Between Visual C++ 1.0 and 1.5

 * }

Q117608

1.00 1.50 WINDOWS kbprg kbprb -- The information in this article applies to: - The Microsoft Foundation Classes (MFC) included with: - Microsoft Visual C++ for Windows, versions 1.0 and 1.5 -- SYMPTOMS ======== Programs overriding or calling CScrollView::OnScroll work when compiled with Visual C++, version 1.0 (using the MFC, version 2.0), but work incorrectly when compiled with Visual C++, version 1.5 (using the MFC, version 2.5). For example, the EX04C sample, in the book "Inside Visual C++" (written for Visual C++, version 1.0), calls OnScroll when it receives arrow-key keystrokes, allowing the user to scroll through the document. This works correctly in Visual C++, version 1.0, but does not work well in Visual C++, version 1.5. CAUSE ===== CScrollView::OnScroll was an undocumented function in Visual C++, version 1.0. It was changed, and the new version was documented for Visual C++, version 1.5. In Visual C++, version 1.0, CScrollView::OnScroll was defined as void CScrollView::OnScroll(int nBar, UINT nSBCode, UINT nPos) where nBar specified SB_HORZ or SB_VERT to handle vertical or horizontal scrolling. The function was also listed under the "Implementation" section of the CScrollView class definition, which generally means that a function is internal and may change in the future. Visual C++, version 1.5, defines a virtual OnScroll for both CView and CScrollView. This is now a public and documented function: BOOL CScrollView::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll) Because the actual underlying parameter types match closely enough for the different versions of OnScroll, code from Visual C++, version 1.0, can be compiled using Visual C++, version 1.5. However, the two functions differ enough (see the Visual C++ version 1.5 documentation of "OnScroll" for more details on how it works) that such programs generally do not work. RESOLUTION ========== Change any calls to or derivations from OnScroll to correctly pass the needed parameters. For example, the sample code below (taken from "Inside Visual C++") calls OnScroll when various arrow keys are pressed in a CScrollView-derived view: void CEx04cView::OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags ) { switch( nChar ) { case VK_HOME: OnScroll( SB_VERT, SB_TOP, 0 ); OnScroll( SB_HORZ, SB_TOP, 0 ); break; case VK_END: OnScroll( SB_VERT, SB_BOTTOM, 0 ); break; case VK_UP: OnScroll( SB_VERT, SB_LINEUP, 0 ); break; case VK_DOWN: OnScroll( SB_VERT, SB_LINEDOWN, 0 ); break; case VK_PRIOR: OnScroll( SB_VERT, SB_PAGEUP, 0 ); break; case VK_NEXT: OnScroll( SB_VERT, SB_PAGEDOWN, 0 ); break; case VK_LEFT: OnScroll( SB_HORZ, SB_PAGEUP, 0 ); break; case VK_RIGHT: OnScroll( SB_HORZ, SB_PAGEDOWN, 0 ); break; default: break; } } If compiled using Visual C++, version 1.0, this code works correctly. If compiled using Visual C++, version 1.5, the user cannot scroll when the corresponding arrow key is pressed. A correct Visual C++ version 1.5 implementation of this code follows below: void CMyView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { #define MAKESCROLLWORD(v,h) ( (((BYTE)(short)v)<<8)|(BYTE)h ) switch(nChar) { case VK_HOME: // High byte is vertical, low byte is horizontal // -1 does nothing OnScroll( MAKESCROLLWORD(SB_TOP,SB_TOP), 0 ); break; case VK_END: OnScroll( MAKESCROLLWORD(SB_BOTTOM, SB_BOTTOM), 0 ); break; case VK_UP: OnScroll( MAKESCROLLWORD(SB_LINEUP, -1), 0 ); break; case VK_DOWN: OnScroll( MAKESCROLLWORD(SB_LINEDOWN, -1), 0); break; case VK_PRIOR: // page up OnScroll( MAKESCROLLWORD(SB_PAGEUP, -1), 0 ); break; case VK_NEXT: // page down OnScroll( MAKESCROLLWORD(SB_PAGEDOWN, -1), 0); break; case VK_LEFT: OnScroll( MAKESCROLLWORD(-1,SB_LINEUP), 0 ); break; case VK_RIGHT: OnScroll( MAKESCROLLWORD(-1,SB_LINEDOWN), 0 ); break; } CScrollView::OnKeyDown(nChar, nRepCnt, nFlags); } Additional reference words: 1.00 1.50 2.00 2.50 KBCategory: kbprg kbprb KBSubcategory: MfcUI

Keywords : kb16bitonly

Issue type :

Technology : kbAudDeveloper kbMFC