热情软件屋

 

CScrollView类纵向滚动长度受32768的限制


编号:QA002641
建立日期: 2000年2月28日 最后修改日期:2000年2月28日
所属类别:

唐慧君:
    操作系统:win98
    编程工具:vc50
    问题:我用CScrollView类滚动显示大量数据,纵向滚动长度受32768的限制,只能显示部分数据,同时CWnd::TextOut()也受到int型参数的限制。请问,如何能象写字板,WORD等那样纵向滚动大量数据。在写OnPrint()函数时,因为是一页一页打印,就不存在这一问题。我想或许可以使OnDraw()函数滚动显示逐屏快速切换,就向在dos程序中块操作那样。但感到不好下手,而且CScrollView的自动滚动功能就不能用了。请指点:
     1、基于CScrollView类的利用自动滚动的解决办法
     2、如果要自己设计滚动,怎么实施
     3、如果必须采用别的方法,请提供建议

回答:

    CScrollView是通过OnPrepareDC中调CDC的成员函数SetWindowOrg, SetWindowExt, SetViewportOrg, SetViewportExt实现窗口自动滚动。问题关键在于Win95 GDI的坐标是16位的,所以必须自已实现分屏显示和滚动(打印也如此,因为打印纸的坐标也是16位)。把文档内容分页,使每页行列数不超过32768。
    1.从CView而不是CScrollView派生视图类CMyView。
    2.为CMyView加反映卷滚条位置的数据成员CSize m_ScrollLine,反映快速滚动规模的CSize m_nScrollPage(10,10)(即用卷滚条的翻页滚动时相当于滚动10个位置)。
    3.CMyView::PreCreateWindow中加入cs.style |= WS_HSCROLL|WS_VSCROLL ;
    4.响应消息WM_HSCROLL,WM_VSCROLL,在响应函数中,调节m_ScrollLine,重画窗口。
    5.CMyView::OnDraw调文档类的自定义成员函数
    MyPaint(dc,position,ScreenInfo,PrinterInfo),该函数负责实际绘画。
    6.ScreenInfo指出屏幕大小,PrinterInfo指出打印纸大小,文档类可根据这两个参数,自已决定分成多大的页,以使一页能写满屏(纸)。CDC::IsPrinting指出是否是画往打印机。参数position指出当前卷滚条位置(m_ScrollLine),根据这个参数,可决定该页从文档的什么实际位置开始。MyPaint画出特定的文档页(而不是向CScrollView应用那样一次画出全部),当然坐标要做一定的转换。
    7.屏幕的大小,可通过CView::GetClientRect获得,要想获得打印纸的大小,须响应ID_FILE_PRINT命令消息,如下:
    void CMyView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
    {
     PrinterInfo.Rect=pInfo->m_rectDraw;
    CPrintInfo::m_rectDraw坐标的映射模式是MM_TEXT。

此问题由刘映虹回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio