600分求助滚动问题,大家请帮帮忙,谢谢了!!!
我正在编写一个捕捉滚动屏幕(存成BMP)的程序。大致思路是:给要捕捉的程序发送WM_VSCROLL消息,捕捉完一屏幕后,使其滚动一页,然后再捕捉下一屏幕,... 最后把捕捉到的各个屏幕拼接起来。可是现在有一个问题,我不清楚发送PageDown事件后屏幕到底滚动了多少象素。因为大部分的程序按下PageDown后滚动的范围一般都小于客户区大小,这样上一屏幕底部的内容仍会出现在下一屏幕的顶部。简单地把各次捕捉的内容拼接起来结果是不对的。因此我必须精确地知道每次PageDown后页面到底滚动了多少象素。而通过GetScrollRange、GetScrollInfo和GetScrollPos等取到的值又是逻辑值,比如滚动范围取到的可能是0~100,而实际的滚动区域范围可能是0~8000(象素),也就是说整个的滚动区域的总高度为8000象素高
现在我必须精确知道整个滚动区域的象素总高度(注意,不是GetClientRect和GetWindowRect取到的Rect,通过这两个API函数取到的Rect只是可见的窗口部分,而我需要得到所有滚动区域的总高度,包括不可见的滚动部分在内),这样我可以通过下面的代码来得到PageDown一页滚动的象素数目:
SCROLLINFO si;
GetScrollInfo(hwnd, SB_VERT, &si);
每次PageDown滚动的象素数目 = 整个滚动区域的象素总高度/(si.nMax-si.nMin) * si.nPage.
现在的一个核心问题是,"整个滚动区域的象素总高度"如何获得???
我尝试了好多方法,都不成,哪位大牛知道如何获得整个滚动区域的总的象素高度???
或者有其他的方法来完成捕捉滚动窗口的内容?
问题点数:200、回复次数:11Top
1 楼nwcow(冰山下的野牦牛)回复于 2004-12-03 23:42:18 得分 10
POINT pt;
SIZE sz;
HDC hdc = GetDC(hwnd);
GetViewportOrgEx(hdc, &pt);
GetViewportExtEx(hdc, &sz);
sz.cx -= pt.x;
sz.cy -= pt.y;
sz.cy就是整个区域的高度,不过还要转换成象素,最关键的函数如下。
int mode = GetMapMode(hdc);
其他自己查查资料吧,我也不清楚了
Top
2 楼laiyiling(陌生人[MVP])回复于 2004-12-03 23:52:55 得分 0
http://search.csdn.net/Expert/topic/40/40193.xml?temp=.9521601Top
3 楼coolstar14(寒星溪月)回复于 2004-12-04 14:11:27 得分 0
gzTop
4 楼Genghiskhan(你要战,便作战!)回复于 2004-12-05 10:24:26 得分 0
To laiyiling(陌生人·专注于...) :
你给我的地址我打不开,能直接把这个连接的内容发给我吗?
Top
5 楼xindao_wang(山中客)回复于 2004-12-05 10:44:08 得分 10
如果你采用CScrollView,用GetTotalSize( )函数不知是否可行Top
6 楼GameWeaverDummy(小白菜)回复于 2004-12-05 11:16:20 得分 0
牛人Top
7 楼lzlbj(X)回复于 2004-12-05 19:24:04 得分 30
To laiyiling(陌生人·专注于...) :
你给我的地址我打不开,能直接把这个连接的内容发给我吗?
CSDN - 专家门诊 - VC/MFC 基础类问题
推荐 | 保存 | 关闭窗口
主 题: 如何取得CScrollView中可视部分的大小
作 者: vcmfc (【痛苦的虫虫】)
等 级:
信 誉 值: 100
所属论坛: VC/MFC 基础类
问题点数: 50
回复次数: 12
发表时间: 2000-11-14 13:36:00Z
我在派生的CScrollView的CAppView中设置有10000行,但我如何取得当前可视部分,并在适当的地方进行滚动.
回复人: andygood() ( ) 信誉:100 2000-11-14 14:06:00Z 得分:40
使用GetClientRect()。根据滚动位置和行高可以计算需要的位置。
Top
回复人: playboy2000(搜索客) ( ) 信誉:100 2000-11-14 14:33:00Z 得分:0
vcmfc:
你的那本《windows 编程》能不能给我一份?或告诉我何处下载?
thanks in advance...
mail to playboybo@263.net
playboy1977@sina.com
Top
回复人: vcmfc(【痛苦的虫虫】) ( ) 信誉:100 2000-11-14 16:02:00Z 得分:0
我的意思是想取得当前可视部分,不管在任何部分。
Top
回复人: andygood() ( ) 信誉:100 2000-11-14 16:48:00Z 得分:0
天哪,CScrollView总共才几个函数呀!使用CScrollView::GetScrollPosition可以取得当前滚动位置,根据你的行高和客户区域的高度就可以计算需要的可视部分了,然后使用ScrollToPosition可以滚动到指定位置。
你是真不懂还是让别人给你写代码呀?反正我没时间。
Top
回复人: vcmfc(【痛苦的虫虫】) ( ) 信誉:100 2000-11-14 19:17:00Z 得分:0
问一下,GetClientRect()是否是返回可视区间.
Top
回复人: vcmfc(【痛苦的虫虫】) ( ) 信誉:100 2000-11-15 19:40:00Z 得分:0
大家帮帮我呀!
Top
回复人: vcmfc(【痛苦的虫虫】) ( ) 信誉:100 2000-11-16 09:24:00Z 得分:0
GetClientRect()返回值有问题?
Top
回复人: vcmfc(【痛苦的虫虫】) ( ) 信誉:100 2000-11-19 21:15:00Z 得分:0
我的意思是想在适应的时候进行滚动从CScrollView派生的窗口,可有不知道当前可视屏幕已满,大家帮帮我吧!
Top
回复人: woodheart(心木) ( ) 信誉:99 2000-12-08 17:11:00Z 得分:0
难道不能判断当前屏幕的行数吗?
不懂
Top
回复人: wistaria(听风听雨) ( ) 信誉:110 2000-12-08 17:30:00Z 得分:0
CRect rect;
GetClientRect(rect);
客户区的矩形坐标就存到了rect中了
Top
回复人: vcbear(一只平凡无知@贫穷无钱¥的熊) ( ) 信誉:100 2000-12-08 17:42:00Z 得分:10
我是用每行字符的垂直高度算的,行数*行高>clientRect->SetScrollSizes
有新行加入,再SetScrollSizes,并且ScrollToPosition
Top
该问题已经结贴 ,得分记录: andygood (40)、 vcbear (10)、
Top
8 楼Genghiskhan(你要战,便作战!)回复于 2004-12-05 21:26:13 得分 0
非常感谢大家的回复!我想大家可能没太明白我的意思,这儿我再择要说一下:
我要捕捉的是其它应用程序的滚动窗口,比如Notepad、资源管理器左侧的文件树窗口等,捕捉的结果存成BMP。因此我无法知道其它程序每行的字符高度等信息,实际上在我的程序里面压根就不知道我要捕捉的滚动窗口内到底显示了些什么,因为我要捕捉的内容是有其它的应用程序定义的。
举个例子,比如有一个10万行的txt文件,用记事本(Notepad)打开后,由于文字非常多,会出现一个垂直滚动条。现在我想自己编写一个应用程序,当我在记事本的窗口上单击时,我的程序把记事本内的所有内容存成一个BMP。大致过程是这样的:先取得记事本窗口的当前的客户区内容(DC),然后把这个内容存下来得到BMP1,然后我的程序给记事本窗口发滚动消息WM_VSCROLL(PageDown),这样会导致记事本窗口滚动一页,然后再把记事本窗口内当前显示的内容存下来得到BMP2,如此这番,一直滚动到最后一屏,得到BMPn,然后在我的程序中,我再把最后得到的n幅BMP拼接起来得到一幅完整的BMP。因为窗口客户区的大小一般比程序滚动的范围要大,比如窗口客户区的高度可能是400象素,而应用程序在按下PageDown后可能只滚动了300象素,不用的应用程序都有其自己定义的大小页面滚动大小,因此,此处给出的300,在别的应用程序中可能是350、380或者其它的值。因为应用程序的滚动窗口滚动的高度一般比窗口的客户区要小,因此,第一屏底部的内容,按下PageDown后往往会出现在第二屏的顶部。因此,直接把这n幅BMP拼接起来,得到的BMP内容是不正确的,是有部分内容重叠的。
最核心的问题是我要知道我要捕捉的应用程序的滚动窗口在PageDown后到底滚动了多少象素,这样我才能精确地各次获得的各个BMP拼接起来。我想通过下面的伪码来获得要捕捉的应用程序的滚动窗口在按下PageDown后到底滚动了多少象素:
SCROLLINFO si;
GetScrollInfo(hwnd, SB_VERT, &si);
PixelHeightEachPageDown = TotalScrollRegionHeight/(si.nMax-si.nMin) * si.nPage;
其中PixelHeightEachPageDown代表按下PageDown后我要捕捉的滚动窗口实际滚动的象素值,TotalScrollRegionHeight表示整个滚动区域的总高度,包括不可见的滚动部分。注意这个值和通过GetClientRect或者GetWindowRect取到的窗口的高度是不同的,后两个API函数取到的只是滚动窗口的可见部分的高度,并不是所有滚动部分的总高度。
由于GetScrollInfo、GetScrollPos等取到的滚动范围都是逻辑高度,而我需要的是象素高度。这是最核心的问题,即TotalScrollRegionHeight的值如何取得?????????
Top
9 楼Trashy(【叶落随风】)回复于 2004-12-05 22:08:46 得分 0
关注一下!Top
10 楼ColderRain(一切尽在不言中)回复于 2004-12-05 22:44:31 得分 70
提供一点思路:
如果你得到了目标窗口的HWND,再通过GetScrollInfo之类的函数,scroll数据就都可以得到了。设置一个消息钩子,专门截获滑动消息,就可以知道用户正在滑动那个窗口以及得到它的窗口句柄。Top
11 楼jiangsheng(蒋晟.Net[MVP])回复于 2004-12-08 08:44:28 得分 80
一个最简单的办法,一张张抓下来之后去掉重合的部分
对BMP进行行扫描之后比较
不知道能不能用GetDC获得的HDC来作坐标转换……没有测试过,纯属猜想……
Top




