滚动条的位置为什么自动归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的位置。
请指教,谢谢.
...全文
375 4 打赏 收藏 转发到动态 举报
写回复
用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 !
一、软件简介 FastStone Capture 是一款出色的屏幕捕捉(截图)软件,它集图像捕捉、浏览、编辑、视频录制等功能于一身,功能完善、使用方便,值得推荐! 软件提供多种捕捉方式(如:活动窗口、指定窗口/对象、矩形区域、手绘区域、整个屏幕、滚动窗口等),提供屏幕录像机、放大镜、拾取颜色、标尺等辅助功能,支持快捷键操作 对于捕捉到的图像,软件提供了多种处理方式,如:在编辑器打开;存入剪贴板或文件;发送到打印机、邮件、WORD、Powerpoint 甚至是网络 FTP 等。用户还可以通过文件名称模板定制文件名以自动保存捕捉内容,支持BMP、GIF、JPG、PNG、TIF、PDF等文件格式,输出文件夹位置也可以自行设定。 软件内置功能完善的图像编辑器,支持几乎所有主流图片格式,除提供缩放、旋转、剪切、格式转换、调整大小等基本功能外,还可向图像中加入标题、边框和水印、文本、线条、图形等内容,并可调整图像颜色,进行多种特效处理。 二、版本特色 本版本基于官方英文原版汉化,集成注册文件,并优化了部分设置。相对于其他版本,具有更新及时、汉化彻底、使用方便等特点。希望大家喜欢! 三 、特别声明: 1、本软件相关资源收集自互联网,版权归其开发厂商及作者所有。 2、本软件仅限于个人学习交流,请勿用于任何形式商业用途。 3、您必须自行承担使用过程所有可能引起的后果及损失。 4、使用过程中若有意见或建议,请及时反馈和指正。 软件名称:FastStone Capture 产品版本:8.4 官方主页:http://www.faststone.org 软件汉化:飞扬时空 博客地址:http://iyoung.blog.163.com/blog/static/16678880720106161648206/ 版本性质:汉化版 更新日期:2016年1月16日
修正内容: 增加了404页面 增加了robots.txt文件 增加了明星索引 增加了“最新影片”滚动发布 修正了xss防注入代码 修正了年代采集错误 修正了导演采集错误 自带了万条影片数据库 设置了14条采集规则 酷啦影视 http://www.colalive.com 只完善了部分源码,版权归官方所有。 QVOD快播点播系统分享程序,支持时下流行的P2P,QVOD(快播),久久影音(WebPlayer9),皮皮影音Pvod,Gvod等多种播放媒体,特有的采集功能,强大的影片资源库,完善的会员系统 QVODCMS点播专家4.0主要模块介绍功能 01.网站会员系统 02.会员积分系统 03.影片收藏系统 04.奖品发布系统 05.冲值卡冲值系统 06.新闻影讯系统 07.网站地图系统 08.广告管理系统 09.AJAX留言本系统 10.智能影片报错系统 11.模板管理系统 12.友情链接系统 13.网页生成系统 14.数据管理系统 15.数据共享采集 16.自定义采集系统 17.演员和导演自带查询连接功能! 18.自定义非法关键字查询点播功能! 19.AJAX评论功能(会员评论功能) 20.AJAX自定义集数显示状态功能(自己定义降序升序显示功能) 21.列表页多项展示或能(如:按时间,按人气,按推荐) 22.后台设置QVOD缓冲广告,只需输入广告地址便可 23.多资源一键更新系统,每天加片点点完成 24.播放页支持生成静态化html 25.网站自动托管系统

15,980

社区成员

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

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