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。
此问题由刘映虹回答。
| |
|
|
| |
|
|