天天看点

VC学习摘要4

1、CPoint对象只能在相应 WM_PAINT消息的时候使用,一般被用在OnPaint消息处理函数中。其在构造的时候就执行了BeginPaint得到一个dc,在析构的时候执行 了EndPaint函数释放一个dc。CClientDC对象被用来相应其他非WM_PAINT消息时使用,在构造的时候调用GetDC得到dc,在析构 的时候调用ReleaseDC函数释放dc。

2、win32应用程序接口 (API)使用四种坐标空间:世界坐标系空间,页面空间,设备空间和物理设备空间。应用程序运用世界坐标系空间对图形输出进行旋转、斜切或者反射。一般把 世界坐标系空间和页面空间称为逻辑空间,物理设备空间随所获得的dc而异,通常指应用程序窗口的客户区,但是它也指整个桌面、完整的窗口(包括框架、标题 栏和菜单栏)或打印机的一页或绘图仪的一页。物理设备的尺寸随显示器、打印机或绘图仪所设置的尺寸而变化。如果要在物理设备上绘制输出,windows一 般是把一个矩形区域从一个坐标空间映  射到另一个坐标空间,直至最终完整的输出呈现在物理设备上,如果该应用程序调用SetWorldTransform函数,则映射就从应用程序的世界坐标系 空间开始,否则映射从页面空间中开始进行。页面空间到设备空间的转化所用的是两个矩形宽和高的比例(该比例称为转化因子),其中页面空间中的矩形称为窗 口,设备空间中的矩形称为视口(所看到的窗口),windows把窗口圆点映射到视口圆点,把窗口范围映射到视口范围,就完成了这种转。设备空间到物理空 间的转化仅限于平移,并由windows的窗口管理部分控制,这种转化的唯一用途是确保设备空间的原点被映射到物理设备上的适当点上。一旦应用程序建立的 设备表述表(DC),并立即开始调用GDI绘图或输出函数,则运用默认页面空间到设备空间的转化和设备空间到物理设备空间(客户区)的转。注意在默认的情 况下,设备空间和物理设备空间(使用设备坐标)的y轴是正向朝下,负y轴向上,而逻辑空间(使用逻辑坐标)则是正常的y轴正向朝上,负y轴向下。

3、逻辑坐标和设备坐标

        几 乎在所有GDI函数中使用的坐标值都是采用的逻辑单位。windows必须将逻辑单位转换成设备单位(象素)。这种转化是由映射方式、窗口和视口的原点以 及窗口和视口的范围所控制的。windows对所有的消息(如WM_SIZE,WM_MOUSEMOVE,WM_LBUTTONDOWN, WM_LBUTTONUP),所有的非GDI函数和少数GDI函数(如GetDeviceCaps函数)永远使用设备坐标。窗口是基于逻辑坐标的,逻辑坐 标可以是象素、毫米、英寸等单位;视口是基于设备坐标(象素)的。通常,视口和物理设备空间(客户区)是相同的(因其一一对应)。缺省的映射模式是 MM_TEXT。在这种映射模式下,逻辑单位和设备单位相同。

        CDC中提供了两个成员函数 SetViewportOrg和SetWindowOrg,用来设置视口和窗口原点。如果将视口原点设置为(xViewOrg,yViewOrg),则逻辑点(0,0)就会被映射为设备点(xViewOrg,yViewOrg)。如果将窗口原点改变为(xWinOrg,yWinOrg),则逻辑点 (xWinOrg,yWinOrg)将会被映射为设备点(0,0),即左上角。

        不管对窗口和视口原点作什么改变,设备点(0,0)始终是客户区的左上角。注意OnPrepareDC会随时根据滚动窗口的位置来调整视口的原点,用函数ptVpOrg = -GetDeviceScrollPosition();获得滚动栏上滚动块的位置(设备坐标y轴正向朝下),然后pDC->SetViewportOrg(ptVpOrg);函数设置视口原点(逻辑坐标y轴正向朝上)。

       CDC的LPtoDP和DPtoLP被用来作逻辑坐标系和设备坐标系之间的相互转换。可以任务CDC的所有成员函数都以逻辑坐标作为其参数;可以认为 CWnd的成员函数都以设备坐标作为其参数;所有选中测试操作(如CRect::PtInRect)都应考虑设备坐标;注意如果用设备坐标来保存某点的坐 标时,如果用户对串口进行一下滚动,则该点的坐标就不再有效了(因为设备坐标的(0,0)点发生了变化)。

辨析下两个概念(以用记事本打开的一个txt文件为例):

窗口:打开的整个txt文件。不管滚动条如何变化,其窗口点(0,0)永远在该文件的第一行,第一个字符之前。

视口:你看见的当前txt文件显示部分。其视口(0,0)永远在你看的的显示文件部分的左上角(即客户区左上角)。

在映射中,视口原点和窗口原点如果不做改变都是(0,0)点,映射永远是把窗口原点映射到视口原点。