滚动条的位置为什么自动归0
以下是程序wWinProc函数,粗体部分是滚动条相关的代码。
LRESULT CALLBACK wWinProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
static char * pText;
static HGLOBAL hResource;
static HWND hScroll;
static int iPosition, cxChar, cyChar, cyClient, iNumLines, xScroll;
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
TEXTMETRIC tm;
static int focusCount = 0;
char focusCountStr[10];
switch (message)
{
case WM_CREATE:
hdc = GetDC( hwnd );
GetTextMetrics( hdc, &tm );
cxChar = tm.tmAveCharWidth;
cyChar = tm.tmHeight + tm.tmExternalLeading;
ReleaseDC( hwnd, hdc );
xScroll = GetSystemMetrics( SM_CXVSCROLL );
hScroll = CreateWindow( TEXT("scrollbar"), NULL,
WS_CHILD | WS_VISIBLE | SBS_VERT,
0, 0, 0, 0,
hwnd, (HMENU)1, hInst, NULL );
hResource = LoadResource( hInst,
FindResource(hInst, TEXT("AnnabelLee"),
TEXT("TEXT")));
pText = (char *)LockResource( hResource );
iNumLines = 0;
while ( *pText != '\\' && *pText != '\0' )
{
if( *pText == '\n' )
iNumLines++;
pText = AnsiNext( pText );
}
*pText = '\0';
SetScrollRange( hScroll, SB_CTL, 0, iNumLines, FALSE );
SetScrollPos( hScroll, SB_CTL, 0, FALSE );
return 0;
case WM_SIZE:
MoveWindow( hScroll, LOWORD( lParam ) - xScroll, 0,
xScroll, cyClient = HIWORD( lParam ), TRUE );
SetFocus( hwnd );
return 0;
case WM_SETFOCUS:
focusCount++;
SetFocus( hScroll );
return 0;
case WM_VSCROLL:
switch (wParam)
{
case SB_TOP:
iPosition = 0;
break;
case SB_BOTTOM:
iPosition = iNumLines;
break;
case SB_LINEUP:
iPosition -= 1;
break;
case SB_LINEDOWN:
iPosition += 1;
break;
case SB_PAGEUP:
iPosition -= cyClient / cyChar;
break;
case SB_PAGEDOWN:
iPosition += cyClient / cyChar;
break;
case SB_THUMBPOSITION:
iPosition = HIWORD(wParam);
break;
}
iPosition = max( 0, min( iPosition, iNumLines ) );
if( iPosition != GetScrollPos( hScroll, SB_CTL ) )
{
SetScrollPos( hScroll, SB_CTL, iPosition, TRUE );
InvalidateRect( hwnd, NULL, TRUE );
}
return 0;
case WM_PAINT:
hdc = BeginPaint( hwnd, &ps );
pText = (char*)LockResource( hResource );
GetClientRect( hwnd, &rect);
rect.left += cxChar;
rect.top += cyChar * ( 1 - iPosition );
DrawTextA( hdc, pText, -1, &rect, DT_EXTERNALLEADING );
EndPaint( hwnd, &ps);
return 0;
case WM_DESTROY:
FreeResource( hResource );
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc( hwnd, message, wParam, lParam );
}
程序运行的时候,滚动条不停的闪动,点击滚动条的上下箭头,滚动条的位置总是在0.
我跟踪了一下,SetScrollPos执行的时候,滚动条被设置到了正确的位置。
可是不知道为什么,滚动条总是又被自动设置回了0的位置。
请指教,谢谢.