第二章没有内容.
第三章:从”Hello World”着手学习AppWizard
OnDraw:每当视窗需要被重新绘制时,应用程序框架都要调用OnDraw函数.当用户改变了窗口的尺寸,或者当窗口恢复了先前被遮盖的部分,或者当应用程序改变了窗口数据时,窗口都要被重新绘画.尽管可以随时对窗口进行绘制,不过最好还是等变化内容累积到一定程度后再一并在onDraw函数处理.
第四章:基本事件处理,映射模式和滚动视图
1.对Windows消息,在代码中有三处:
●函数的声明(主要要加上 afx_msg,虽然他只是用来表明该原型说明是针对消息映射函数而言的)
●在函数的定义中
●在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间
2.函数详解:
◆virtual int CDC::GetClipBox(LPRECT lpRect)const;
返回值:剪切区类型,取值有:
1).COMPLEXREGION:剪切区有覆盖的边界
2).ERROR:设备上下文无效
3).NULLREGION:剪切区为空
4).剪切区无覆盖边界
参数:lpRect:接收矩形尺寸信息的RECT或CRect结构
说明:获得围绕剪切区边界的外接矩形的尺寸信息,信息将拷贝到lpRect指向的缓冲区
◆BOOL CRect:: PtInRect(BOOL point)const;
返回值:如果点位于CRect中,则返回非零值,否则返回0
参数:point包含一个POINT或CPoint对象
说明:在调用此函数之前应该调用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,CBrush或CFont;否则返回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并不改变当前窗口或视图端口的设置。要改变单位、方向和缩放,可调用SetViewportExt和SetWindowtExt成员函数。 |
MM_HIENGLISH | 每一逻辑单位对换0.001英寸,X向右为正,Y向上为正。 |
MM_HIMETRIC | 每一逻辑单位对换0.001毫米,X向右为正,Y向上为正。 |
MM_ISOTROPIC | 逻辑单位转换为带有对等缩放轴的任意单位。即X轴1单位与Y轴1单位是相等的。可使用SetViewportExt和SetWindowtExt成员函数,指定需要的单位和轴的方向。GDI修正可以保证X、Y轴的尺寸是一致的。 |
MM_LOENGLISH | 每一逻辑单位对换0.01英寸,X向右为正,Y向上为正。 |
MM_LOMETRIC | 每一逻辑单位对换0.1毫米,X向右为正,Y向上为正。 |
MM_TEXT | 每一逻辑单位对换1设备像素,X向右为正,Y向下为正。 |
MM_TWIPS | 每一逻辑单位对换1/20个点(1点为1/72英寸,1twip为1/1440英寸)。X向右为正,Y向上为正。 |
说明:
设置映射模式,映射模式定义了将逻辑单位转换为设备单位的单位量,并定义了X和Y的方向。GDI使用映射模式将逻辑坐标转换为适当的设备坐标。MM_TEXT允许应用使用设备像素,1逻辑单位等于1像素。像素的物理尺寸随设备而异。MM_HIENGLISH,MM_HIMETRIC,MM_LOENGLISH,MM_LOMETRIC和MM_ TWIPS模式对于必须使用具有物理意义单位作图的应用是很有用的(如使用英寸或毫米)。MM_ISOTROPIC 模式保证了1:1的方向比率,可以保存图象的精确形状。MM_ANISOTROPIC模式允许X和Y轴可以独立调用
◆CPoint SetWindowOrg(int x,int y)
返回值:CPoint对象,指向窗 口初始位置的前一个取值(逻辑单位)
参数:x,y指定窗口初始位置的x,y逻辑坐标
说明:
设置设备上下文的窗口初始位置。它和设备上下文窗口一起说明了GDI如何将逻辑坐标中的点映射到实际设备坐标中。换言之,它们说明了GDI如何将逻辑坐标转换为设备坐标。窗口初始位置表明在设备坐标系统中的点,GDI将视图端口初始位置与该点映射。窗口初始位置是由SetWindowOrg成员函数在逻辑坐标系统中指定的。GDI在映射其它点时遵从同样的过程,这需要窗口初始位置与视图端口初始位置的映射。例如,所有以窗口初始位置为中心的圆周上的点同样是以视图端口初始位置为中心的圆周上的点。同样地,通过窗口初始位置的直线上的所有点也将形成一条通过视图端口初始位置的直线。
4.Windows提供两种映射模式MM_ISOTROPIC和MM_ANISOTROPIC,允许我们改变他们的比例因子和坐标原点.在MM_ISOTROPIC映射下,纵横比总是一比一,即圆总是圆,但是在MM_ANISOTROPIC却不是,即圆可能是椭圆
◆virtual CSize SetWindowExt(int cx,int cy)
返回值:窗口拓展的前一次取值.出错返回0
参数:cx,cy:指定窗体端口的x,y拓展
说明:
设置窗口扩展的X和Y扩展。窗口和设备上下文窗口说明了GDI如何将逻辑坐标中的点映射到实际设备坐标中。
换言之,它们说明了GDI如何将逻辑坐标转换为设备坐标。
当设置以下映射模式时,对SetWindowExt和SetViewportExt的调用将被覆盖。
· | 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拓展
说明:
设置窗口扩展的X和Y扩展。视口和设备上下文窗口说明了GDI如何将逻辑坐标中的点映射到实际设备坐标中。
换言之,它们说明了GDI如何将逻辑坐标转换为设备坐标。
当设置以下映射模式时,对SetWindowExt和SetViewportExt的调用将被覆盖。
· | 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 | |
nCount | 数组中的指针数目。 |
lpRect | |
lpSize |
说明:
将设备单位转换为逻辑单位。该函数将每一点的坐标或尺寸,从设备坐标系统转换成GDI的逻辑坐标系统,该转换取决于当前的映射模式、原先的设置以及设备窗口和视图的扩展。
坐标的使用时间:
■可以认为CDC的所有成员函数都是以逻辑坐标作为参数
■可以认为CWnd的成员函数都以设备坐标作为其参数
■所有选中测试(hit-test)操作都应该考虑设备坐标.区域的定义应采用设备坐标.某些像CRect::PtInRect之类的函数只有在其采用设备坐标参数时才会保证有正确的结果
■将一些需要长期使用的值用逻辑坐标或者物理坐标来保存.如果用设备坐标来保存某点的坐标的话,那么只要用户对窗口进行一下滚动,该点的坐标就不再有效了