zoukankan      html  css  js  c++  java
  • MFC坐标空间与映射模式

    逻辑坐标:使用GDI绘图时使用的坐标系

    设备坐标系:实际设备(显示器、打印机)的坐标系,即我们实际看到的坐标系。

    坐标空间

    在Windows NT/2000中Win32 API中支持以下四层坐标空间:

    1. 世界坐标空间:引入World是为了对图像进行平移、缩放、剪切等操作,最大范围为232个单位高和232个单位宽,初始时X轴正向向右,Y轴正向向上,World坐标空间可以成为逻辑空间。
    2. 页面坐标空间(Page坐标空间):当没有World坐标空间时,它就是逻辑空间,最大范围是232高和宽。初始时,X正向向右,Y轴正向向上。
    3. 设备坐标空间(device坐标空间):设备空间,是坐标空间的常见目的地。最大坐标范围为227高和宽。X轴正向向右,Y轴正向向下,原点在物理设备左上角,我们不能改变这些规则。设备坐标空间用于设备描述表,一般是物理设备坐标空间的子集。

      一个应用程序可以获得三种不同的显示设备对象句柄,每种句柄对应不同的屏幕区域。

      第一个抽象设备是用户区对象,坐标原点位于用户区的左上角。此坐标系称为用户区坐标系。使用GetDC()或者BeginPaint()函数获得的句柄就是用户区的句柄。

      第二个抽象坐标是全对象窗口,包括标题栏、选单、滚动杆和窗口框架等。此坐标系称为全窗口坐标系,原点在左上角。使用GetWindowsDC()可获得此设备对象句柄,CWindowsDC类生成的对象中的句柄m_hWnd也对应此坐标系。

      第三个抽象坐标是屏幕坐标,称为屏幕坐标系。

    4. 物理设备坐标系(physical device空间):这一空间代表具体的物理设备,是我们实际能够看到的坐标空间,可是图形绘制的最终目的地。物理设备坐标空间是图形设备驱动程序使用的坐标空间。由一个固定宽度和高度的像素组成。最左方的像素坐标是(0,0),X轴的方向从左到右,Y轴的方向从上到下。也被称为屏幕坐标,GetWindowsRect返回的就是屏幕坐标,窗口消息也是使用屏幕坐标。

    映射模式

    坐标转化的需要确定三个要素:单位刻度值、方向和原点。用户可以根据实际问题的需求,构造一个满足条件的逻辑空间。映射模式是GDI将逻辑坐标转化为设备坐标的机制。一种映射模式通常有一个预定的窗口和视口,他们决定了坐标转化的刻度属性。应用程序可以改变窗口原点和视口原点。

    窗口:逻辑坐标区间上的矩形区域。

    视口:设备坐标空间中的一个矩形区域,如程序的客户区。

    窗口决定了需要显示的几何模型的数量,视口位置决定了它在设备表面的显示位置。窗口和视口的尺寸比率决定了两种坐标的缩放比率。

    映射模式通过以下函数改变:SetMapMode(int nMapMode)

    windows支持以下的逻辑映射模式:

     

    映射模式

    说明

    MM_ANISOTROPIC

    x,y的逻辑单位可以被独立地标注,在任何一个方向上都可以随意扩大,此模式不改变当前窗口的设置,正X轴向右,正Y轴向上

    MM_HIENGLISH

    逻辑窗口中基本单位是0.001英寸,正X轴向右,正Y轴向上。

    MM_MIMETRIC

    逻辑窗口中基本单位是0.01毫米,正X轴向右,正Y轴向上。

    MM_ISOTROPIC

    逻辑窗口中基本单位是0.1毫米,正X轴向右,正Y轴向上。

    MM_LOENGLISH

    逻辑窗口中基本单位是0.01英寸,正X轴向右,正Y轴向上。

    MM_LOMETRIC

    逻辑窗口中基本单位是0.1毫米,正X轴向右,正Y轴向上。

    MM_TEXT

    逻辑窗口中的基本单位单位为像素,正X轴向右,正Y轴向下

    MM_TWIPS

    逻辑窗口中的基本单位为twip(1/1440英寸),正X轴向右,正Y轴向下。

    默认映射模式为MM_TEXT

    窗口与视口原点

    1. DWORD SetViewportOrg(HDC hDC,int x,int y)

    用于设计视口原点(设备单位),返回以前视口单位原点(设备坐标)

    1. DWORD SetWindowOrg(HDC hDC,int x,int y)

    用于设计窗口坐标的原点

    两个函数不能一起使用,效果相同。

    无论怎么改变窗口和视口的原点,Windows都将窗口原点变换到视口原点,并按当前的映射模式变换其余点。

  • 相关阅读:
    spring
    C++容器常用方法简单总结
    【转】shell中各种括号的作用详解()、(())、[]、[[]]、{}
    c++创建对象时一些小细节
    ros建模与仿真(urdf介绍)
    常用vi命令
    Linux零零碎碎的小知识
    Linux目录都是些什么
    关于c/c++指针,指针的指针
    关于c/c++中的二维数组与指针
  • 原文地址:https://www.cnblogs.com/xyb930826/p/5310411.html
Copyright © 2011-2022 走看看