CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

600分求助滚动问题,大家请帮帮忙,谢谢了!!!

楼主Genghiskhan(你要战,便作战!)2004-12-03 23:22:23 在 VC/MFC / 界面 提问

我正在编写一个捕捉滚动屏幕(存成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

相关问题

  • 滚动文本????请帮助!!!!!!
  • 请教:数据窗口的滚动条。
  • 请问JPanel不支持滚动条吗?
  • 请教如何实现CListCtrl滚动。
  • ★★★★滚动条的问题,请进,谢谢★★★★
  • 请问如何加速屏幕滚动?
  • 请问一个滚动条的问题
  • 请问如何隐藏滚动条?
  • 关于滚动条,向前辈请教!
  • 请问JS如何控制滚动条?

关键词

  • .net
  • 信誉
  • 应用程序
  • 记事本
  • 函数
  • 区域
  • 屏幕
  • 内容
  • 客户
  • 滚动

得分解答快速导航

  • 帖主:Genghiskhan
  • nwcow
  • xindao_wang
  • lzlbj
  • ColderRain
  • jiangsheng

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo