让文档视结构程序支持卷滚Word格式.docx

上传人:b****4 文档编号:6772417 上传时间:2023-05-07 格式:DOCX 页数:13 大小:32.39KB
下载 相关 举报
让文档视结构程序支持卷滚Word格式.docx_第1页
第1页 / 共13页
让文档视结构程序支持卷滚Word格式.docx_第2页
第2页 / 共13页
让文档视结构程序支持卷滚Word格式.docx_第3页
第3页 / 共13页
让文档视结构程序支持卷滚Word格式.docx_第4页
第4页 / 共13页
让文档视结构程序支持卷滚Word格式.docx_第5页
第5页 / 共13页
让文档视结构程序支持卷滚Word格式.docx_第6页
第6页 / 共13页
让文档视结构程序支持卷滚Word格式.docx_第7页
第7页 / 共13页
让文档视结构程序支持卷滚Word格式.docx_第8页
第8页 / 共13页
让文档视结构程序支持卷滚Word格式.docx_第9页
第9页 / 共13页
让文档视结构程序支持卷滚Word格式.docx_第10页
第10页 / 共13页
让文档视结构程序支持卷滚Word格式.docx_第11页
第11页 / 共13页
让文档视结构程序支持卷滚Word格式.docx_第12页
第12页 / 共13页
让文档视结构程序支持卷滚Word格式.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

让文档视结构程序支持卷滚Word格式.docx

《让文档视结构程序支持卷滚Word格式.docx》由会员分享,可在线阅读,更多相关《让文档视结构程序支持卷滚Word格式.docx(13页珍藏版)》请在冰点文库上搜索。

让文档视结构程序支持卷滚Word格式.docx

MM_LOENGLISH

0.01inch

MM_HIENGLISH

0.001inch

MM_TWIPS

1/1440inch

MM_ISOTROPIC

可调整(x=y)

可选择

MM_ANISOTROPIC

可调整(x!

=y)

我们一般使用的映射模式是MM_TEXT,它也是缺省设置。

在该模式下,坐标原点在工作区左上角,而x坐标值是向右递增,y坐标值是向下递增,单位值1代表一个像素。

要设置映射模式,可以调用CDC:

:

SetMapMode()函数。

CClientDCdc;

nPreMapMode=dc.SetMapMode(nMapMode);

它将映射模式设置为nMapMode,并返回前一次的映射模式nPreMapMode,GetMapMode可取得当前的映射模式:

nMapMode=dc.GetMapMode();

MFC绘图函数都使用逻辑坐标作为位置参数。

比如

CStringstr(“Hello,world!

”);

dc.TextOut(10,10,str,str.GetLength());

  这里的(10,10)是逻辑坐标而不是像素点数(只是在缺省映射模式MM_TEXT下,正好与像素点相对应),在输出时GDI函数会将逻辑坐标(10,10)依据当前映射模式转化为“设备坐标”,然后将文字输出在屏幕上。

  设备坐标以像素点为单位,且x轴坐标值向右递增,y轴坐标值向下递增,但原点(0,0)位置却不限定在工作区的左上角。

依据设备坐标的原点和用途,可以将Windows下使用的设备坐标系统分为三种:

工作区坐标系统,窗口坐标系统和屏幕坐标系统。

(1)工作区坐标系统:

  工作区坐标系统是最常见的坐标系统,它以窗口客户区左上角为原点(0,0),主要用于窗口客户区绘图输出以及处理窗口的一些消息。

鼠标消息WM_LBUTTONDOWN、WM_MOUSEMOVE传给框架的消息参数以及CDC一些用于绘图的成员都是使用工作区坐标。

(2)屏幕坐标系统:

  屏幕坐标系统是另一类常用的坐标系统,以屏幕左上角为原点(0,0)。

以CreateDC(“DISPLAY”,...)或GetDC(NULL)取得设备上下文时,该上下文使用的坐标系就是屏幕坐标系。

  一些与窗口的工作区不相关的函数都是以屏幕坐标为单位,例如设置和取得光标位置的函数SetCursorPos()和GetCursorPos();

由于光标可以在任何一个窗口之间移动,它不属于任何一个单一的窗口,因此使用屏幕坐标。

弹出式菜单使用的也是屏幕坐标。

另外,CreateWindow、MoveWindow、SetWindowPlacement()等函数用于设置窗口相对于屏幕的位置,使用的也是屏幕坐标系统。

(3)窗口坐标系统:

  窗口坐标系统以窗口左上角为坐标原点,它包含了窗口控制菜单、标题栏等内容。

一般情况下很少在窗口标题栏上绘图,因此这种坐标系统很少使用。

三类设备坐标系统关系如下图所示:

图7-12.三类设备坐标

  MFC提供ClientToScreen()、ScreenToClient()两个函数用于完成工作区坐标和屏幕坐标之间的转换工作。

voidScreenToClient(LPPOINTlpPoint)const;

voidScreenToClient(LPRECTlpRect)const;

voidClientToScreen(LPPOINTlpPoint)const;

voidClientToScreen(LPRECTlpRect)const;

  其实,我们在前面介绍弹出式菜单时已经使用了ClientToScreen函数。

在那里,由于弹出式菜单使用的是屏幕坐标,因此当处理弹出式菜单快捷键shift+F10时,如果要在窗口左上角(5,5)处显示快捷菜单,就必须先调用ClientToScreen函数将客户区坐标(5,5)转化为屏幕坐标。

CRectrect;

GetClientRect(rect);

ClientToScreen(rect);

point=rect.TopLeft();

point.Offset(5,5);

  在视图滚动后,如果用户在视图中单击鼠标,那么会得到鼠标位置的设备(视图)坐标。

在使用这个数据处理文档(比如画点或画线)时,需要把它转化为文档坐标。

这是因为利用MFC绘图时,所有传递给MFC作图的坐标都是逻辑坐标。

当调用MFC绘图函数绘图时,Windows自动将逻辑坐标转换成设备坐标,然后再绘图。

设备上下文类CDC提供了两个成员函数LPToDP和DPToLP完成逻辑坐标和设备坐标之间的转换工作。

如其名字所示那样,LPToDP将逻辑坐标转换为设备坐标,DPToLP将设备坐标转换为逻辑坐标。

voidLPtoDP(LPPOINTlpPoints,intnCount=1)const;

voidLPtoDP(LPRECTlpRect)const;

voidLPtoDP(LPSIZElpSize)const;

voidDPtoLP(LPPOINTlpPoints,intnCount=1)const;

voidDPtoLP(LPRECTlpRect)const;

voidDPtoLP(LPSIZElpSize)const;

 

7.3.2滚动文档

  由于MFC绘图函数使用的是逻辑坐标,因此用户可以在一个假想的通常是比视图要大的“文档窗口”中绘图;

Windows自动在幕后完成坐标转换工作,并将落在视图范围内的那一部分“文档窗口”显示出来,其余的部分被裁剪。

  但是光这样还不能卷滚文档。

要卷滚显示文档,还必须知道文档卷滚到了什么位置;

一旦用户拖动滚动条时要告诉视图改变在文档中的相应位置。

所有这些,由MFC的CScrollView来完成。

  MFC提供了CScrollView类,简化了滚动需要处理的大量工作。

除了管理文档中的滚动操作外,MFC还通过调用WindowsAPI函数画出滚动条、箭头和滚动光标。

它还负责处理:

用户初始化滚动条范围(通过滚动视图的SetScrollRange()方法)

处理滚动条消息,并滚动文档到相应位置

管理窗口和视图的尺寸大小

调整滚动条上滑块(或称拇指框)的位置,使之与文档当前位置相匹配

程序员要做的工作是:

从CScrollView类中派生出自己的视图类,以支持卷滚

提供文档大小,确定滚动范围和设置初始位置

协调文档位置和屏幕坐标

  要让应用程序支持卷滚,可以在用AppWizard生成框架程序时就指定视图的基类为CSrollView。

可以在AppWizard的MFCAppWizard-Step6of6对话框中,在对话框上方应用程序所包含的类中选择CEditorView,然后在BaseClass下拉列表框中选择应用程序视图类的基类为CScrollView,如图7-11所示:

图7-13为应用程序的视图类指定基类

  现在我们要手工修改CEditorView,使它的基类为CScrollView。

1.修改视图类所对应的头文件,将所有用到CView的地方改为CScrollView。

通常,首先修改视图类赖以派生的父类,形式如下:

classCEditorView:

publicCScrollView

2.修改视图类实现的头文件,把所有用到CView的地方改为CScrollView。

首先修改IMPLEMENT_DYNACREATE一行:

IMPLEMENT_DYNACREATE(CEditorView,CScrollView)

然后修改BEGIN_MESSAGE_MAP宏

BEGIN_MESSAGE_MAP(CEditorView,CScrollView)

然后将其他所有用到CView的地方改为CScrollView。

一个更简单的方法是:

使用Edit-Replace功能,进行全局替换。

  到现在为止,已经将编辑器视图类CEditorView的基类由CView转化为CScrollView。

  现在,要设置文档大小,以便让CScrollView知道该如何处理文档。

视图必需知道文档的卷滚范围,这样才能确定何时卷滚到文档的头部和尾部,以及当拖动卷滚条的滑块时按适当比例调整文档当前显示位置。

  为此,我们首先在文档类CEditorDoc的头文件editordoc.h中增加一个CSize类型的数据成员m_sizeDoc用以表示文档的大小。

CSize对象包含cx和cy两个数据成员,分别用于存放文档的x方向坐标范围和y方向坐标范围。

另外,还要提供一个成员函数GetDocSize()来访问该文档大小范围数据成员。

修改后的editordoc.h如清单7.11。

清单7.11CEditorDoc头文件

classCEditorDoc:

publicCDocument

{

protected:

//createfromserializationonly

CEditorDoc();

DECLARE_DYNCREATE(CEditorDoc)

//保存文档大小

CSizem_sizeDoc;

//Attributes

public:

CSizeGetDocSize(){returnm_sizeDoc;

}

//Operations

CStringListlines;

intnLineNum;

......

};

  既然增加了m_sizeDoc这一数据成员,就需要在CEditorDoc构造函数中进行初始化,给m_sizeDoc设置一合理的数值,比如说x=700,y=800。

构造函数如清单7.12。

清单7.12CEditorDoc的构造函数

CEditorDoc:

CEditorDoc()

//TODO:

addone-timeconstructioncodehere

nLineNum=0;

m_sizeDoc=CSize(700,800);

  一个设计优秀的应用程序应当能够动态调整文档的卷滚范围。

比如,在WORD中新建一个文件时,在“页面模式”下将可卷滚范围设为一页大小。

随着用户输入,逐渐增加文档的卷滚范围。

但是这里为简明起见,将文档卷滚范围设为固定大小700X800点像素大小。

设置文档大小通过由视图类的CEditorView:

OnInitialUpdate()调用SetScrollSizes()成员函数来完成。

  SetScrollSizes()用于设置文档卷滚范围。

一般在重载OnInitialUpdate()成员函数或OnUpdate()时调用该函数,用以调整文档卷滚特性。

比如,在文档初始显示或文档大小作了调整之后。

清单7.13在OnInitialUpdate()中设置卷滚范围

voidCEditorView:

OnInitialUpdate()

Addyourspecializedcodehereand/orcallthebaseclass

CDC*pDC=GetDC();

pFont=newCFont();

if(!

(pFont->

CreateFont(0,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,

ANSI_CHARSET,OUT_TT_PRECIS,CLIP_TT_ALWAYS,

DEFAULT_QUALITY,DEFAULT_PITCH,"

CourierNew"

)))

pFont->

CreateStockObject(SYSTEM_FONT);

CFont*oldFont=pDC->

SelectObject(pFont);

TEXTMETRICtm;

pDC->

GetTextMetrics(&

tm);

lHeight=tm.tmHeight+tm.tmExternalLeading;

cWidth=tm.tmAveCharWidth;

SetScrollSizes(MM_TEXT,GetDocument()->

GetDocSize());

CScrollView:

OnInitialUpdate();

  SetScrollSizes()第一个参数为映射模式。

SetScrollSizes()可以使用除MM_ISOTROPIC和MM_ANISOTROPIC之外的其他任何映射模式。

SetScrollSizes()第二个参数为文档大小,用一个CSize类型的数值表示。

  另外,我们还要检查两个包含绘图输出功能的函数:

CEditorView:

OnChar()和CEditorView:

OnDraw()函数。

OnChar(UINTnChar,UINTnRepCnt,UINTnFlags)

CEditorDoc*pDoc=GetDocument();

CClientDCdc(this);

CStringline("

"

);

//存放编辑器当前行字符串

POSITIONpos=NULL;

//字符串链表位置指示

if(nChar=='

\r'

pDoc->

nLineNum++;

else

//按行号返回字符串链表中位置值

pos=pDoc->

lines.FindIndex(pDoc->

nLineNum);

pos)

//没有找到该行号对应的行,因此它是一个空行,

//我们把它加到字符串链表中。

line+=(char)nChar;

lines.AddTail(CString(line));

else{

//thereisaline,soaddtheincomingchartotheendof

//theline

line=pDoc->

lines.GetAt(pos);

lines.SetAt(pos,line);

dc.GetTextMetrics(&

dc.TextOut(0,

(int)pDoc->

nLineNum*tm.tmHeight,

line,

line.GetLength());

SetModifiedFlag();

OnChar(nChar,nRepCnt,nFlags);

  在程序运行开始的时侯,视图坐标原点和文档坐标原点是重合的。

但是,当用户拖动滚动条时,视图原点就与文档原点不一致了,如图7-14。

由于GDI是按照文档坐标(逻辑坐标)来输出图形的,这样自然就无法正确显示文档内容。

图7-14文档滚动前后文档坐标原点和视图坐标原点的变化

  这时,要想获得正确输出,就必须调整视图坐标,让视图坐标原点和文档坐标原点重合,如图7-15所示。

图7-15调整视图设备上下文原点后

CScrollView视图类提供了一个CScrollView:

OnPrepareDC()成员函数,完成视图设备上下文坐标原点的调整工作。

现在修改OnChar(),加入OnPrepareDC()函数,见清单7.15。

清单7.15修改后的OnChar成员函数

OnPrepareDC(&

dc);

CFont*pOldFont=dc.SelectObject(pFont);

dc.SelectObject(pOldFont);

  但是,对于视图OnDraw()函数,则不需要作这样的调整。

这是因为,框架在调用OnDraw()之前,已经自动调用了OnPrepareDC()成员函数完成设备上下文坐标调整工作了。

提示:

对于框架传过来的设备上下文,不需要调用OnPrepareDC(),因为框架知道它是用于绘图的,因此事先调用了OnPrepareDC()作好了坐标调整工作。

如果是自己构造或用GetDC()取得得设备上下文,则需要调用OnPrepareDC()完成设备上下文坐标调整工作。

  现在编辑器已经能够支持文档滚动了,如图7-16。

图7-16支持滚动的文本编辑器

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 成人教育 > 自考

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2