第二章-第四章:基本事件处理,映射模式和滚动视图-从”Hello World”着手学习AppWizard

第二章没有内容.

第三章:”Hello World”着手学习AppWizard

OnDraw:每当视窗需要被重新绘制时,应用程序框架都要调用OnDraw函数.当用户改变了窗口的尺寸,或者当窗口恢复了先前被遮盖的部分,或者当应用程序改变了窗口数据时,窗口都要被重新绘画.尽管可以随时对窗口进行绘制,不过最好还是等变化内容累积到一定程度后再一并在onDraw函数处理.

第四章:基本事件处理,映射模式和滚动视图

1.Windows消息,在代码中有三处:

●函数的声明(主要要加上 afx_msg,虽然他只是用来表明该原型说明是针对消息映射函数而言的)

●在函数的定义中

●在BEGIN_MESSAGE_MAPEND_MESSAGE_MAP之间

2.函数详解:

virtual int CDC::GetClipBox(LPRECT lpRect)const;

返回值:剪切区类型,取值有:

         1).COMPLEXREGION:剪切区有覆盖的边界

         2).ERROR:设备上下文无效

         3).NULLREGION:剪切区为空

         4).剪切区无覆盖边界

参数:lpRect:接收矩形尺寸信息的RECTCRect结构

说明:获得围绕剪切区边界的外接矩形的尺寸信息,信息将拷贝到lpRect指向的缓冲区

BOOL  CRect:: PtInRect(BOOL point)const;

返回值:如果点位于CRect,则返回非零值,否则返回0

参数:point包含一个POINTCPoint对象

说明:在调用此函数之前应该调用NormalizeRect来使矩形规范化

BOOL   CRgn::CreateEllipticRgnIndirect(LPCRECT lpRect);

返回值:如果操作成功,则返回非零值,否则返回0

参数:lpRect指向CRECT或者CRect对象,该对象包含了椭圆的边界矩形的左上角和右下角的逻辑坐标.

说明:此成员函数用来创建一个椭圆区域.

注意:当使用完有该函数创建的区域时,应用程序应该将此区域选出设备环境外,并用DeleteObject函数来删除它.

BOOL PtInRegion( int x, int y ) const;
BOOL PtInRegion( POINT point ) const;

返回值:如果该点在区域内,则返回非零值,否则返回0

参数:x:测试点的x坐标

y:测试点的y坐标

point:表示需测试的点

说明:此成员函数用来检查由xy给定得点是否保存在CRgn对象的区域内部

virtual CGdiObject* SelectStockObject(int nIndex)

返回值:调用成功,则返回被替换的CGdiObject对象的指针,实际对象是CPen,CBrushCFont;否则返回NULL

参数:nIndex:指定需要的库存对象种类,可以为下列值之一:

BLACK_BRUSH

黑色画刷。

DKGRAY_BRUSH

深灰色画刷。

GRAY_BRUSH

灰色画刷。

HOLLOW_BRUSH

空心画刷。

LTGRAY_BRUSH

浅灰色画刷。

NULL_BRUSH

空画刷。

WHITE_BRUSH

白色画刷。

BLACK_PEN

黑色画笔。

NULL_PEN

空笔。

WHITE_PEN

白色画笔。

ANSI_FIXED_FONT

ANSI固定系统字体。

ANSI_VAR_FONT

ANSI变化系统字体。

DEVICE_DEFAULT_FONT

依赖设备的字体。

OEM_FIXED_FONT

依赖OEM的固定字体。

SYSTEM_FONT

系统字体。缺省地,Windows使用系统字体绘制菜单、对话框控件和其它文本。Windows 3.0及其后版本,系统字体具有比例宽度,早期版本则使用固定宽度的系统字体。

STSTEM_FIXED_FONT

在早于Windows 3.0的版本中使用的固定宽度系统字体。该对象与Windows 早期版本兼容。

DEFAULT_PALETTE

缺省彩色调色板,含有系统调色板中的20种静态颜色。

说明:选择一个与预先定义的库存笔,画刷或字体对应的CGdiObject对象

3.设备坐标:以像素为单位(MM_TEXT)

 

  

virtual  int  CDC:SetMapMode(int nMapMode);

返回值:上一个映射模式。
参数
nMapMode
指定新的映射模式,可为下列值之一:

MM_ANISOTROPIC

把逻辑单位转换为任意缩放轴上的任意单位。把映射模式设置为MM_ANISOTROPIC并不改变当前窗口或视图端口的设置。要改变单位、方向和缩放,可调用SetViewportExtSetWindowtExt成员函数。

MM_HIENGLISH

每一逻辑单位对换0.001英寸,X向右为正,Y向上为正。

MM_HIMETRIC

每一逻辑单位对换0.001毫米,X向右为正,Y向上为正。

MM_ISOTROPIC

逻辑单位转换为带有对等缩放轴的任意单位。即X1单位与Y1单位是相等的。可使用SetViewportExtSetWindowtExt成员函数,指定需要的单位和轴的方向。GDI修正可以保证XY轴的尺寸是一致的。

MM_LOENGLISH

每一逻辑单位对换0.01英寸,X向右为正,Y向上为正。

MM_LOMETRIC

每一逻辑单位对换0.1毫米,X向右为正,Y向上为正。

MM_TEXT

每一逻辑单位对换1设备像素,X向右为正,Y向下为正。

MM_TWIPS

每一逻辑单位对换1/20个点(1点为1/72英寸,1twip1/1440英寸)。X向右为正,Y向上为正。

说明:
设置映射模式,映射模式定义了将逻辑单位转换为设备单位的单位量,并定义了XY的方向。GDI使用映射模式将逻辑坐标转换为适当的设备坐标。MM_TEXT允许应用使用设备像素,1逻辑单位等于1像素。像素的物理尺寸随设备而异。MM_HIENGLISH,MM_HIMETRIC,MM_LOENGLISH,MM_LOMETRICMM_ TWIPS模式对于必须使用具有物理意义单位作图的应用是很有用的(如使用英寸或毫米)。MM_ISOTROPIC 模式保证了11的方向比率,可以保存图象的精确形状。MM_ANISOTROPIC模式允许XY轴可以独立调用

CPoint  SetWindowOrg(int x,int y)

返回值:CPoint对象,指向窗 口初始位置的前一个取值(逻辑单位)

参数:x,y指定窗口初始位置的x,y逻辑坐标

说明:
设置设备上下文的窗口初始位置。它和设备上下文窗口一起说明了GDI如何将逻辑坐标中的点映射到实际设备坐标中。换言之,它们说明了GDI如何将逻辑坐标转换为设备坐标。窗口初始位置表明在设备坐标系统中的点,GDI将视图端口初始位置与该点映射。窗口初始位置是由SetWindowOrg成员函数在逻辑坐标系统中指定的。GDI在映射其它点时遵从同样的过程,这需要窗口初始位置与视图端口初始位置的映射。例如,所有以窗口初始位置为中心的圆周上的点同样是以视图端口初始位置为中心的圆周上的点。同样地,通过窗口初始位置的直线上的所有点也将形成一条通过视图端口初始位置的直线。

4.Windows提供两种映射模式MM_ISOTROPICMM_ANISOTROPIC,允许我们改变他们的比例因子和坐标原点.MM_ISOTROPIC映射下,纵横比总是一比一,即圆总是圆,但是在MM_ANISOTROPIC却不是,即圆可能是椭圆

virtual CSize SetWindowExt(int cx,int cy)

返回值:窗口拓展的前一次取值.出错返回0

参数:cx,cy:指定窗体端口的x,y拓展

说明:
设置窗口扩展的XY扩展。窗口和设备上下文窗口说明了GDI如何将逻辑坐标中的点映射到实际设备坐标中。
换言之,它们说明了GDI如何将逻辑坐标转换为设备坐标。
当设置以下映射模式时,对SetWindowExtSetViewportExt的调用将被覆盖。

·

MM_HIENGLISH

·

MM_HIMETRIC

·

MM_LOENGLISH

·

MM_LOMETRIC

·

MM_TEXT

·

MM_TWIPS

当设置MM_ISOTROPIC时,应用在调用SetWindowExt成员函数之前必须调用SetViewportExt函数。

CDC::SetViewportExt(int cx,int cy)

返回值:CSize对象,是窗口拓展的前一次取值,出错时,CSize对象返回x,y坐标均设置为0

参数:cx,cy:指定视图端口的x,y拓展

说明:
设置窗口扩展的XY扩展。视口和设备上下文窗口说明了GDI如何将逻辑坐标中的点映射到实际设备坐标中。
换言之,它们说明了GDI如何将逻辑坐标转换为设备坐标。
当设置以下映射模式时,对SetWindowExtSetViewportExt的调用将被覆盖。

·

MM_HIENGLISH

·

MM_HIMETRIC

·

MM_LOENGLISH

 

·

MM_LOMETRIC

·

MM_TEXT

·

MM_TWIPS


当设置MM_ISOTROPIC时,应用在调用SetWindowExt成员函数之前必须调用

virtual CPoint SetViewportOrg(int x ,int y );
virtual CPoint SetViewportOrg (POINT point );

返回值:CPoint对象,是视图端口初始位置的前一次取值(设备单位)。
参数:

x ,y

指定视图端口初始位置的X,Y坐标(设备单位)。其值必须在设备坐标系统范围内。

point

指定视图端口初始位置。其值必须在设备坐标系统范围内。可以为该参数传递POINT结构或CPoint对象。

说明:
设置设备上下文的视图端口初始位置。视图端口和设备上下文窗口说明了GDI如何将逻辑坐标中的点映射到实际设备坐标中。换言之,它们说明了GDI如何将逻辑坐标转换为设备坐标。视图端口初始位置表明在设备坐标系统中的点,GDI将窗口初始位置与该点映射。窗口初始位置是由SetWindowOrg成员函数在逻辑坐标系统中指定的。GDI在映射其它点时遵从同样的过程,这需要窗口初始位置与视图端口初始位置的映射。例如,所有以窗口初始位置为中心的圆周上的点同样是以视图端口初始位置为中心的圆周上的点。同样地,通过窗口初始位置的直线上的所有点也将形成一条通过视图端口初始位置的直线。

书上有一处代码:现把我的理解说明如下,欢迎大家拍砖.

    CRect rectClient;

    GetClientRect(rectClient);

    pDC->SetMapMode(MM_ANISOTROPIC);

    pDC->SetWindowExt(CSize(1000,1000));

    pDC->SetViewportExt(rectClient.right,-rectClient.bottom);

    pDC->SetViewportOrg(rectClient.right/2,rectClient.bottom/2);

    pDC->Ellipse(-500,-500,500,500);

我的理解是:首先获取客户端的大小(注意这里是以像素为单位,即是物理坐标),然后设置映射模式(注意各自是以什么为单位来设置的).此处设置为MM_ANISOTROPIC.然后设定窗口大小视口大小.然后将视口坐标平移,中心平移。

最后根据逻辑坐标和设备坐标进行转换,转换规则如下:

    设备坐标x = 逻辑x * x视口范围/x窗口范围 + x坐标原点偏移量

    设备坐标y = 逻辑y * y视口范围/y窗口范围 + y坐标原点偏移量

注意:x比例因子 =逻辑x * x视口范围/x窗口范围;

y比例因子 =逻辑y * y视口范围/y窗口范围;比例因子一定大于0,偏移量可以小于0

通过计算以后可以得到各自的坐标为(0,0, right,bottom).

 

5.设备坐标是以像素作为绘图单位(模式为MM_TEXT)[ Windows的鼠标消息所获取的鼠标指针的坐标值大多数是设备坐标.许多其他的MFC类库,尤其是类Crect的成员函数,则只能在设备坐标下才能正确工作.]

逻辑坐标是具体的值.MM_ISOTROPIC模式下纵横比总是1:1,MM_ANISOTROPIC映射则不一定

CDC::LPtoDP(LPPOINT lpPoints,int  nCount=1)const;

void LPtoDP(LPRECT  lpRect)const;

参数:lpPoints:点数组的指针

         nCount:数组中点的数目

         lpRect:将矩形有逻辑坐标向设备单位映射

说明:将逻辑坐标转换为设备坐标

CDC::DptoLP
void DptoLP(LPPOINT lpPoints, int nCount = 1) const;
void DptoLP(LPRECT lpRect) const;
void DptoLP(LPSIZE lpSize) const;

参数:

lpPoints

指向POINT结构的数组或CPoint对象的指针。

nCount

数组中的指针数目。

lpRect

指向RECT结构或CRect对象的指针。该参数用于将矩形从设备指针转为逻辑指针的简单情形。

lpSize

指向SIZE结构或CSize对象的指针。


说明:
将设备单位转换为逻辑单位。该函数将每一点的坐标或尺寸,从设备坐标系统转换成GDI的逻辑坐标系统,该转换取决于当前的映射模式、原先的设置以及设备窗口和视图的扩展。

坐标的使用时间:

■可以认为CDC的所有成员函数都是以逻辑坐标作为参数

■可以认为CWnd的成员函数都以设备坐标作为其参数

■所有选中测试(hit-test)操作都应该考虑设备坐标.区域的定义应采用设备坐标.某些像CRect::PtInRect之类的函数只有在其采用设备坐标参数时才会保证有正确的结果

将一些需要长期使用的值用逻辑坐标或者物理坐标来保存.如果用设备坐标来保存某点的坐标的话,那么只要用户对窗口进行一下滚动,该点的坐标就不再有效了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值