滚动条的位置为什么自动归0

time_is_life 2014-04-27 06:41:02
以下是程序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的位置。
请指教,谢谢.
...全文
397 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
许文君 2014-04-27
  • 打赏
  • 举报
回复
记忆中scoll位置似乎自己存储了,你试试用局部变量看看
time_is_life 2014-04-27
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
窗口过程的函数中的变量使用static在各个使用同一个窗口过程(wWinProc)的窗口将会互相干扰,lz这样设计窗口函数一般是不正确的,只有哪些整个程序都是唯一值的变量才使用static !
这个是<Windows程序设计>上的例子。那些静态变量是每次事件触发的时候需要共享的。不如怎么保证状态的连续性啊。
躺着睡的蜗牛 2014-04-27
  • 打赏
  • 举报
回复

case SB_THUMBPOSITION:
case SB_THUMBTRACK:
	m_VScroll.GetScrollInfo(&ScrollInfo);
	m_VScroll.SetScrollPos(ScrollInfo.nTrackPos);
MFC里的用法, Win32下可能要改一下吧。
worldy 2014-04-27
  • 打赏
  • 举报
回复
窗口过程的函数中的变量使用static在各个使用同一个窗口过程(wWinProc)的窗口将会互相干扰,lz这样设计窗口函数一般是不正确的,只有哪些整个程序都是唯一值的变量才使用static !

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧