图片 2

坐标和几个函数的用法说明,设备坐标的理解

近来在学Win32的编制程序,看的是《Windows程序设计第5版》生龙活虎书,那本书是安徽人翻译的,有些译法和陆地不相仿,书中还应该有部分不当之处,非常多时候要求中韩语对照阅读,下载请点击

Windows应用程序绘制图形时利用的是意气风发种逻辑单位,种种逻辑单位的高低由映射格局决定,
这一个逻辑单位既可以够与设施单位(显示屏或打印机上的一个像素点卡塔 尔(英语:State of Qatar)雷同,也能够是风流倜傥种物理单
位(如毫米卡塔 尔(阿拉伯语:قطر‎,还是能够是客户自定义的生机勃勃种单位。在Windows应用程序中,只要与出口有涉嫌,都
要使用映射形式。本文的指标是扶植读者明白映射方式的局地基本知识,并对在运用中平日现身的风流洒脱部分主题素材提议应用方案。

(1卡塔尔Windows坐标类别
Windows坐标系分为逻辑坐标系和设备坐标系二种,GDI协助这两种坐标系。日常来说,
GDI的公文和图表输出函数使用逻辑坐标,而在客商区移动或按下鼠标的鼠标位置是接纳配备坐标。
<1>逻辑坐标系是面向DC的坐标系,这种坐标不构思实际的器械等级次序,在绘图时,Windows会依据当前安装的映射情势将逻辑坐标转变为器材坐标。
<2>设备坐标系是面向物理设备的坐标系,这种坐标以像素或设施所能表示的微小长度单位为单位,X轴方向向右,Y轴方向向下。设备坐标系的原点地点(0,
0)不约束在设施突显区域的左上角。

生机勃勃、映射情势基本知识
当Windows应用程序在其客商区绘制图形时,必得付出在客商区之处,其位置用x和y
三个坐标表示,x表示横坐标,y表示纵坐标。在具有的GDI绘制函数中,这几个坐标使用的是大器晚成种”逻辑单位”。当GDI函数将出口送到有些物理设备上时,Windows将逻辑坐标
调换来设备坐标(如显示屏或打字与印刷机的像素点卡塔尔国。逻辑坐标和配备坐标的改变是由映射模式决
定的。映射格局被积累在装置条件中。GetMapMode函数用于从设备条件获得当前的映照形式,SetMapMode函数用于安装设备条件的照耀格局。
1.逻辑坐标

 

好了,下边最初正文:

逻辑坐标是单独于设备的,它与设备点的深浅非亲非故。使用逻辑单位,是完毕”所见即所得”的底工。当技士在调用贰个画线的GDI函数LineTo,画出25.4mm(1英寸)
长的线时,他并无需思索输出的是何种设备。若设备是VGA显示屏,Windows自动将其转变为九十六个像素点;若设备是三个300dpi的激光打印机,Windows自动将其转变为300个像素点。

设备坐标系分为荧屏坐标系、窗口坐标系和顾客区坐标系二种互相独立的坐标系。
1.显示器坐标系以荧屏左上角为原点,一些与任何显示屏有关的函数均使用显示屏坐标,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。弹出式菜单使用的也是显示屏坐标。
2.窗口坐标系以窗口左上角为坐标原点,它包蕴窗口标题栏、菜单栏和工具栏等节制。
3.顾客区坐标系以窗口顾客区左上角为原点,首要用于客商区的绘图输出和窗口音信的管理。鼠标新闻的坐标参数使用顾客区坐标,CDC类绘图成员函数使用与客商区坐标对应的逻辑坐标。

在看到GDI(GDI Graphic Device
Interface图形设备接口)
辉映方式那后生可畏节的时候,书中又是逻辑坐标,又是设备坐标,又是视口,窗口,又是视埠什么的,搞得人头都大了。即便自身明日还从未完全读懂,然则作者以为本身曾经抓住了接头那一个事物的主线,上边包车型客车东西就视作自个儿的笔记吧:

2.设施坐标

 

1.逻辑坐标和配备坐标

Windows将GDI函数中钦命的逻辑坐标映射为设备坐标,在享有的设施坐标类别中,单位以像素点为准,水平值从左到右增大,垂直值从上到下增大。

(2卡塔尔坐标之间的相互影响调换
 编制程序时,不经常须求依据近期的具体景况进行三种器具坐标之间或与逻辑坐标的交互作用调换。
1.MFC提供了多个函数CDC::DPtoLP()和CDC::
LPtoDP()用于装备坐标与逻辑坐标之间的相互转换。
2.MFC提供了多个函数CWnd::ScreenToClient()和CWnd::ClientToScreen()用于荧屏坐标与顾客区坐标的并行转变。

 
 首先,逻辑坐标那个名词就让很几个人惶惑,确实,无法“一概而论”地精晓的翻译就不是好翻译 
 ——周豫才。哈哈,开个笑话,咱们要知道那四个东西,首先要想开若是你要用Win32要绘制三个东西,该如何是好吧?比方绘制叁个矩形,假若我们调用的是Rectangle(hdc,30,20,50,80),(那一个函数的用法是Rectangle(hdc,left,top,right,bottom),笔者叫雷正兴,不用谢笔者)。能够观看,跟超多GDI函数同样,这么些函数里面使用了成都百货上千数字,坐标。让大家纪念一下完全小学文化,绘制三个事物,不仅仅应当搞了然他的尺寸,还相应搞明白她的单位,那么这里的30,20,50,80的单位是如何吗?很四人会说,是像素!那些答案是对的,可是又不全对。事实上,Windows暗中同意的照射方式(Mapping
Mode,简单的称呼正是MM)是MM_TEXT,在MM_TEXT映射方式(TEXT实际上跟文字未有多大关系,是这种映射方式下的坐标方向,从左到右,从上到下,跟文字阅读方式相仿)下,那几个单位实乃像素。实际上,逻辑坐标和设备坐标的分裂就在于他们的单位区别样!

Windows中包含以下3种器具坐标,以满足各样分裂要求:

 

上面大家拿出二个公式

(1)顾客区域坐标,包涵应用程序的客商区域,客商区域的左上角为(0,0卡塔 尔(英语:State of Qatar)。

GetWindowRect()
获得的是在荧屏坐标系下的RECT(即以显示器左上角为原点卡塔 尔(英语:State of Qatar)
GetClientRect()
获得的是在顾客区坐标系下的RECT(即以所在窗口左上角为原点,去掉了标题栏总计,仅仅是个大小,重临值的左上角永恒为0,0卡塔尔 
  
CRect rect;

         
 图片 1

(2)荧屏坐标,包罗整个荧屏,显示器的左上角为(0,0卡塔尔国。显示器坐标用在WM_MOVE信息中(对于非子窗口卡塔尔以致上边包车型大巴Windows函数中:CreateWindow和MoveWindow(都对此非子窗口)、GetMessage、GetCursorPos、GetWindowRect、WindowFromPoint和SetBrushOrg中。用函数ClientToScreen和ScreenToClient能够将顾客区域坐标调换到显示屏区域坐标,或反之。

GetWindowRect(&rect);

要讲下面的公式,将要先说一下视口(Viewport 山西译作视埠)和窗口(Window
云南译作视窗)

(3)全窗口坐标,包罗二个前后相继的所有的事窗口,包罗标题条、菜单、滚动条和窗口框,窗口的左上角为(0,0卡塔 尔(英语:State of Qatar)。使用GetWindowDC获得的窗口设备条件,能够将逻辑单位调换来窗口坐标。

ScreentoClient(&rect);

率先,不要被那三个名字吸引了,这三个坐标是跟映射有关的,跟显示屏坐标系,窗口坐标系,顾客端坐标系是相持独立的四个文化。

3.逻辑坐标与设备坐标的改动情势

不相像

事实上公式拿出去,学数学的友人是否就懂了大致了,那么些公式非常首要,理解了那几个公式,后边的点不清事物就能够精通,首先,公式中的Window,WinOrg,WinExt,正是带了Win的事物,正是使用的逻辑坐标的值,就跟GDI函数中的同样,逻辑坐标的单位或然是像素(MM_TEXT映射)、毫米(单位是0.1mm,在MM_LOMET奥迪Q3IC映射下)等等等等(看下图).

炫丽情势定义了Windows如何将GDI函数中钦赐的逻辑坐标映射为设备坐标。要接二连三讨论映射形式大家要介绍Windows有关映射情势的有的术语:大家将逻辑坐标所在的坐标系称为”窗口”,将设备坐标所在的坐标系称为”视口”。

CRect rect;

图片 2

“窗口”依赖于逻辑坐标,能够是像素点、分米或程序员想要的别样条件。

GetClient(&rect);
举个举例:有个单文书档案程序

身为大家在调用Win32函数绘图的时候,要精通自个儿行使的单位(依照映射情势明确的)。因为绘图函数里的数值,使用的就是那个单位,尽管暗许的MM_TEXT映射方式应用的单位尽管像素,但是洋洋时候任何单位也很有用,譬如你要做一个荧屏尺子的时候,你要用尺子量一下实体有几厘米。尺子上的刻度就能够用其余的映射情势来画。不过显示屏在展示的时候却不可能只精晓逻辑坐标几分米啊,显示屏得清楚具体的像素地方才行啊!那那个时候,就需求使用上边的公式转变了。讲到这里,公式里的ViewExt/WinExt是何许看头就很分明了。那便是在那时此刻逻辑坐标系下(比方几毫米,打举个例子哈),实际上是地点映射情势表格里的单位)对应的配备坐标应该是多少个像素!那样转变之后,获得实质上的Viewport,便是该逻辑点在显示器上的岗位。

“视口”信任于设备坐标(像素点卡塔尔。经常,视口和顾客区域等同。然而,借使程序猿用GetWindowDC或CreateDC获取了三个设备条件,则视口也足以指全窗口坐标或显示器坐标。点(0,0卡塔尔国是顾客区域的左上角。x的值向右扩展,y的值向上增添。

CRect rect;

为此说视口和窗口实际上是表示的生机勃勃律块区域,只可是是因为单位和原点的不如,要求进行映射,逻辑单位正是窗口,正是Window,正是像素,分米,英寸,正是给人用的单位,就是器材无关的单位,设备单位正是视口,就是Viewport,就一定要是像素,正是给设备用的单位,显著的意气风发毫米,在分歧的装置上的像素数只怕会有分别,所以是设备相关的单位。

对于具有映射格局,Windows都用上边七个公式将窗口坐标调换到视口坐标:

View调用GetWindwoRect(&rect),
获得的坐标是:左上角(33,99),右下角(1040,524),那是View相对于显示屏的坐标,当调用ScreenToClient(&rect),rect形成为:左上角(-2,-2),右上角(1007,423),-2,-2是client和window之间的间隔差–border。

 

  1. xViewport = (xWindow – xWinOrg) * (xViewExt / xWinExt) + xViewOrg
  2. yViewport = (yWindow – yWinOrg) * (yViewExt / yWinExt) + yViewOrg

rect =
CRect(0,0,1,1),当调用ClientToScreen(&rect),rect形成为:左上角(35,101),右上角(36,102),那是也会有2个单位的border的效能。

要专一的是在上述的5映射方式下,ViewExt/WinExt的比例都以现已鲜明了,不可能改变的,假诺要改动几个值,只可以在MM_ISOTROPIC和MM_ANISOTROPIC映射格局下行使SetViewportExtEx()和SetWindowExtEx()校订。而且那多少个函数在上头5种炫目格局下无效。

里头,(xWindow,yWindows卡塔尔是待转换的逻辑点,(xViewport,yViewport卡塔尔是改造后的设备点。就算设备坐标是客商区域坐标或全窗口坐标,则Windows在画贰个目的前,还非得将那么些坐标调换到荧屏坐标。

Frame调用GetWindowRect(&rect),获得的坐标是:左上角(25,25),右下角(1050,551),那是Frame相对于显示器的坐标,与View的坐标有差别是因为Frame还会有菜单栏,工具栏。

说起底,这个映射格局,视口原点(ViewOrg),窗口原点(WinOrg)等,都以设备内容(DC
Device
Context,又译作装置内容、设备上下文等)的个性,设备内容实在正是您绘制的区域。有三种BeginPaint(在WM_PAINT时绘制无效区域),GetDC是客商端区域(在创新时绘制整个顾客区域),GetWindowsDC是总体窗口区域(可以绘制包涵窗口标题栏,菜单栏区域)。那个文化细讲的话又是另风华正茂篇博客了

那八个公式使用了个别钦命窗口和视口原点的点:(xWinOrg,yWinOrg卡塔 尔(英语:State of Qatar)是逻辑坐标的窗口原点;(xViewOrg,yViewOrg卡塔尔是器械坐标的视口原点。在缺省的配备条件中,这八个点均安装为(0,0卡塔 尔(英语:State of Qatar),但它们得以改过。此公式意味着,逻辑点(xWinOrg,yWinOrg卡塔尔国总被映射为设备点(xViewOrg,yViewOrg卡塔尔国。

 

 

Windows仍是可以将视口(设备卡塔尔坐标转变为窗口(逻辑卡塔 尔(阿拉伯语:قطر‎坐标:

(3).映射情势

 

  1. xWindow=(xViewport-xViewOrg)*(xWinExt/xViewExt)+xWinOrg
  2. yWindow=(yViewport-yViewOrg)*(yWinExt/yViewExt)+yWinOrg

     
映射情势分明了在绘制图形时所依附的坐标系,它定义了逻辑单位的骨子里尺寸、坐标增生趋向,全部映射形式的坐标原点均在设施出口区域(如客商区或打字与印刷区卡塔 尔(英语:State of Qatar)的左上角。别的,对于有个别映射方式,客户还是可以自定义窗口的长短和增长幅度,设置视图区的情理范围。
Windows定义了8种绚烂格局,见下表。
炫酷形式使得程序员可不要思忖输出设备的实际设备坐标系,而在二个合併的逻辑坐标系中张开图纸的绘图。

由此要是记住开端的公式,获得不错的相应的参数,就能够画出须要的图纸。

能够行使Windows提供的三个函数DPtoLP和LPtoDP在器材坐标及逻辑坐标之间互相调换。

照耀方法(Mapping Mode卡塔尔
 逻辑单位               坐标轴方向
MM_TEXT(暗许方式卡塔尔
 1 pixel                X轴正方向朝右,Y轴正方向朝下

 

4.映射格局的品种

MM_LOMETRIC
 0.1 mm                 X轴正方向朝右,Y轴正方向朝上
 
MM_HIMETRIC
 0.01 mm                X轴正方向朝右,Y轴正方向朝上
 
MM_LOENGLISH
 0.01 inch              X轴正方向朝右,Y轴正方向朝上
 
MM_HIENGLISH
 0.001 inch             X轴正方向朝右,Y轴正方向朝上
 
MM_TWIPS
 1/1440 inch            X轴正方向朝右,Y轴正方向朝上
 
MM_ISOTROPIC
 自定义(X=Y)            自定义
 
MM_ANISOTROPIC
 自定义(X!=Y)           自定义
 

Windows定义了表1所列出的8种绚烂方式。

   
当绘制的图片需求随着窗口的大大小小改动而自动改变的时候,平日选取MM_ISOTROPIC和MM_ANISOTROPIC映射方式。它们的天下无双差距就是前边一个的X轴和Y轴的逻辑单位的轻重是生龙活虎律的,单词“isotropic”便是各种方向相等的情致,此映射格局相符绘制圆或星型。而实际利用中,日常给X轴和Y轴取分裂的比例,那时选拔MM_ANISOTROPIC映射格局。单词“anisotropic”正是逐条方向相异的情趣。

映 射 方 式 逻 辑 单 位 X 轴 增 加 Y 轴 增 加 毫 米
MM_TEXT 像 素 点 与 设 备 有 关
MM_LOMETRIC 0. 1mm 0.1
MM_HIMETRIC 0. 01mm 0.01
MM_LOENGLISH 0. 01英寸 0.254
MM_HIENGLISH 0.001英寸 0.0254
MM_TWIPS 1/1440英寸 0.0176
MM_ISOTROPIC 任 意(x=y) 可 选 可 选 可 设
MM_ANISOTROPIC 任 意(x!=y) 可 选 可 选 可 设

    在缺省的方式(MM_TEXT卡塔 尔(阿拉伯语:قطر‎下,逻辑坐标的趋势和单位与道具坐标的趋向和单位风华正茂律,也是以像素为单位来代表的,X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。逻辑坐标和配备坐标纵然在缺省情势下其数值也不见得相同,除了在偏下三种情形下:
  1.   窗口为非滚动窗口
  2.  
窗口为滚动窗口,但垂直滚动条位于滚动边框的最上方,水平滚动条位于最左端,但假若运动了滚动条那三种坐标就不平等了。

注:MM_TWIPS常常在打字与印刷机上,单位是60%0磅(1磅=1/72英寸卡塔尔。

 

上述映射格局中又可分为以下3类:

(4).自定义映射方式

  1. MM_TEXT映射格局这种映射方式被称得上”文本”映射格局,不是因为它对
    于文本最合适,而是轴的趋势与读文件的趋势黄金时代致。Windows提供了函数SetViewportOrg和SetWindowOrg
    用来安装视口和窗口的原点。缺省的窗口原点和视口原点均为(0,0卡塔尔,能够改变;缺省的窗
    口范围和视口范围均为(1,1卡塔 尔(阿拉伯语:قطر‎,不可改动。
  2. 心胸映射模式MM_LOMETRIC、MM_HIMETRIC、MM_LOENGLISH、MM_HIENGLISH和MM_TWIPS
    将1个逻辑单位映射为固定的骨子里单位,此中1twip相当于0.0176mm(1/1440英寸)。其余映射格局对应的物理单位参见表1。设置了酷炫方式之后,Windows自动设置了窗口及视口的限量,范围本身的值并不主要,但范围比是一个一定的值,对于MM_LOMETCR-VIC,Windows总括范围比xViewExt/xWinExt=0.1mm中水平像素的罗列。
  3. 自定义映射格局MM_ISOTROPIC和MM_ANISOTROPIC三种炫目形式允许工程师设置自身的窗口和视口范围。MM_ISOTROPIC和MM_ANISOTROPIC的界别是所设置的x轴和y轴的的界定必得大器晚成致,而MM_ANISOTROPIC所设置的x轴和y轴的的限量能够不一致。isotropi的意趣是”
    在有着矛头雷同”,anisotropic的意思正相反。自定义映射情势中窗口和视口的原点和限量都得以改动,程序员能够安装自个儿要求的映照形式。函数SetWindowExt和SetViewportExt
    用于转移窗口和视口的节制。下面包车型客车代码将1个逻辑单位映射成0.396mm(1/64英寸)。

“窗口”和“视口”的概念:
窗口(Window卡塔尔:对应逻辑坐标系上技师设定的区域
视口(Viewport卡塔尔:对应实际输出设备上程序猿设定的区域
1.窗口原点是指逻辑窗口坐标系的原点在视口(设备卡塔尔国坐标系中之处,视口原点是指设备实际出口区域的原点。
2.除了映射情势,窗口和视口也是控制四个点的逻辑坐标怎么着改换为器械坐标的二个成分。叁个点的逻辑坐标遵照如下式子转变为设备坐标:
  设备(视口卡塔尔国坐标 = 逻辑坐标 – 窗口原点坐标      + 视口原点坐标

//定义坐标映射方式
WINGDIAPI int   WINAPI SetMapMode(HDC, int);
此API函数在MFC中封装为CDC::virtual int SetMapMode(int nMapMode);

SetMapMode(hDC, MM_ISOTROPIC); 
SetWindowExt(64, 64); 
SetViewportExt(hdc,GetDeviceCaps(hdc,LOGPIXELSX),GetDeviceCaps(hdc, LOGPIXELSY)); 

//定义逻辑窗口区域,单位为逻辑单位(Logical卡塔 尔(阿拉伯语:قطر‎
WINGDIAPI BOOL  WINAPI SetWindowExtEx (HDC, int, int, LPSIZE);
此API函数在MFC中封装为CDC::virtual CSize SetWindowExt(int cx, int cy);

二、与映射格局有关的主题材料的消除
其进行使中,技师会境遇一些与突显格局有关的题目。比如OLEServer中映射格局的装置、怎么样减少逻辑坐标与设备坐标间相互影响调换的舍入误差等。上面,我就研讨一下那五个难点的消除办法。
1.OLEServer中映射形式的设置方法

//设置逻辑窗口的原点坐标,缺省原点为(0,0卡塔尔。
WINGDIAPI BOOL  WINAPI SetWindowOrgEx(HDC, int, int, LPPOINT);
此API函数在MFC中封装为CDC::CPoint SetWindowOrg(int x, int y);
在乎:SetWindowOrg(Ex)
唯有在酷炫情势为MM_ANISOTROPIC或MM_ISOTROPIC时才有含义。

开荒OLEServer应用程序时,假若技士直接调用SetMapMode函数将映射情势设置成衡量映射方式中的黄金年代种后,在Windows95/98上程序会平常运作,但在WindowsNT上对象出示的大小比边框小。经过作者斟酌后,开采WindowsNT上OLEServer应使用基于逻辑英寸的照射情势。在争辨如何设置基于逻辑英寸的映射格局前,大家先介绍一下逻辑英寸的定义。

//定义视口的坐标轴方向及区域、定义域和值域,单位为像素(Pixel卡塔 尔(英语:State of Qatar)
WINGDIAPI BOOL  WINAPI SetViewportExtEx(HDC, int, int, LPSIZE);
此API函数在MFC中封装为CDC::virtual CSize SetViewportExt(int cx, int
cy);
留心:SetViewportExt(Ex)
唯有在炫酷形式为MM_ANISOTROPIC或MM_ISOTROPIC时才有含义。

Windows在体现时以”逻辑英寸”为单位,逻辑英寸比实际的英寸要大。假使Windows程序采纳实际英寸,则日常的10磅文本在显示屏上就能够小到差十分的少难以辨认,因而Windows使用放大了的”逻辑英寸”来代表文本。逻辑英寸只影响突显,而不影响打字与印刷。

//设置视口的原点坐标,缺省原点为(0,0卡塔尔。
WINGDIAPI BOOL  WINAPI SetViewportOrgEx(HDC, int, int, LPPOINT);
此API函数在MFC中封装为CDC:: virtual CPoint SetViewportOrg(int x, int y);

行使GetDeviceCaps函数可获得当前器材的各样本领,其首先个参数nIndex提醒要获取音讯的档案的次序。当nIndex为HOENVISIONZSIZE和VERTSIZE时,可获得展现区域的上涨的幅度和可观;当nIndex
为HO纳瓦拉ZRES和VERTRES时,可获取各个水平和垂直方向的像素数即分辨率;当nIndex的值为LOGPIXELSX
和LOGPIXELSY时,可获得水平和垂直方向每逻辑英寸所含像素数。

void   MoveWindow(   int   x,   int   y,   int   nWidth,   int  
nHeight,   BOOL   bRepaint   =   TRUE   );   
void   MoveWindow(   LPCRECT   lpRect,   BOOL   bRepaint   =   TRUE  
);   
 参数:
  x钦命了CWnd的左臂的新职责。  
  y钦命了CWnd的顶上部分的新岗位。  
  nWidth钦定了CWnd的新宽度。  
  nHeight钦定了CWnd的新的高峰度。  
 
bRepaint内定了是不是要重画CWnd。要是为TRUE,则CWnd象平时那样在OnPaint音讯管理函数中接到到一条WM_PAINT新闻。假诺那几个参数为FALSE,则不会生出别的类型的重画操作。那应用于顾客区、非客商区(包括题目条和滚动条卡塔尔和出于CWnd移动而流露的父窗口的其余部分。当以此参数为FALSE的时候,应用程序必需旗帜显然地使CWnd和父窗口中务必重画的生龙活虎对无效或重画。lpRectCRect对象或RECT结构,内定了新的分寸和职位。表达那一个函数更改窗口的岗位和大小。对于顶层的CWnd对象,x和y参数是相对于显示屏的左上角的。对于子对象,它们是相对于父窗口客商区的左上角的。
 
 
MoveWindow函数发送一条WM_GETMINMAXINFO消息。管理那些消息时,CWnd拿到叁个改观最大和细小的窗口缺省值的时机。假设传递给MoveWindow成员函数的参数抢先了那几个值,则在WM_GETMINMAXINFO管理函数中得以用超小或最大值来替代那几个值。   
    
  BOOL  CWnd::SetWindowPos(const  CWnd* pWndInsertAfter,  int   x, int
 y, int  cx, int  cy,UINT  nFlags   );  
  重临值假设函数成功,则赶回非零值;不然重回0。  
 
参数pWndInsertAfter标记了在Z轴次序上位居这么些CWnd对象以前的CWnd对象。那一个参数能够是指向CWnd对象的指针,也能够是指向下列值的指针:l
  wndBottom      
将窗口放在Z轴次序的最底层。如若那一个CWnd是叁个顶层窗口,则窗口将失去它的顶层状态;系统将以此窗口放在其余具有窗口的平底。l
  wndTop       将窗口放在Z轴次序的顶端。l   wndTopMost      
将窗口放在全部非顶层窗口的方面。那么些窗口将维持它的顶层地方,即便它失去了活动状态。wndNoTopMost
     
将窗口重新定位到持有非顶层窗口的最上端(那表示在具备的顶层窗口之下卡塔 尔(阿拉伯语:قطر‎。这些标记对那么些曾经是非顶层窗口的窗口没有效应。有关那几个函数以至那个参数的使用准绳参见说宾博些。x钦定了窗口左边包车型地铁新岗位。y内定了窗口最上端的新职分。cx钦点了窗口的新宽度。cy钦赐了窗口的新的高峰度。nFlags内定了大小和岗位选项。那么些参数能够是下列值的咬合:l
  SWP_DRAWFRAME       围绕窗口画出边框(在创设窗口的时候定义卡塔尔国。l  
SWP_FRAMECHANGED      
向窗口发送一条WM_NCCALCSIZE新闻,就算窗口的尺寸不会变动。若无一点点名这么些标记,则仅当窗口的轻重爆发变化时才发送
WM_NCCALCSIZE消息。l   SWP_HIDEWINDOW       隐蔽窗口。SWP_NOACTIVATE
     
不激活窗口。若无安装那几个标记,则窗口将被激活并活动到顶层或非顶层窗口组(信任于pWndInsertAfter参数的安装卡塔尔国的最上端。l
  SWP_NOCOPYBITS      
废弃那几个顾客区的内容。若无一点点名那一个参数,则顾客区的灵光内容将被封存,并在窗口的高低或职分变动以后被拷贝回看客区。l
  SWP_NOMOVE       保持方今的职位(忽视x和y参数卡塔尔。l  
SWP_NOOWNEGL450ZO讴歌RDXDEEscort       不改造具备者窗口在Z轴次序上之处。l  
SWP_NOREDRAW      
不重画变化。假诺设置了这么些标记,则不发出别的类型的转换。那适用于客户区、非客商区(包罗标题和滚动条卡塔尔国以致被活动窗口覆盖的父窗口的别的部分。当那个标识被安装的时候,应用程序必需精晓地无效或重画要重画的窗口和父窗口的此外界分。l
  SWP_NOREPOSITION       与SWP_NOOWNERZORDER相同。l  
SWP_NOSENDCHANGING       幸免窗口选取WM_WINDOWPOSCHANGING消息。l  
SWP_NOSIZE       保持近些日子的分寸(忽视cx和cy参数卡塔 尔(英语:State of Qatar)。l   SWP_NOZORubiconDE本田UR-V  
    保持近日的顺序(忽视pWndInsertAfter卡塔尔国。l   SWP_SHOWWINDOW      
彰显窗口。  
   
 
调用那个成员函数以更换子窗口、弹出窗口和顶层窗口的朗朗上口、地点和Z轴次序。窗口在荧屏上遵循它们的Z轴次序排序。在Z轴次序上高居顶上部分的窗口将顺序在富有其余窗口的最上端。子窗口的富有坐标都以客商坐标(相对于父窗口顾客区的左上角卡塔 尔(英语:State of Qatar)。窗口能够被移位到Z轴次序的最上部,不仅可以够通过将
pWndInsertAfter参数设为&wndTopMost,并确定保证未有设置SWP_NOZOEnclaveDE大切诺基标识,也能够透过安装窗口的Z轴次序使它坐落全体现成的顶层窗口上方。当二个非顶层窗口被设为顶层窗口时,它具备的窗口也被设为顶层的。它的具备者不发生变化。假如顶层窗口被再次定位到Z轴次序的平底(&wndBottom卡塔尔国或任何非顶层窗口之后,则它将不再是顶层窗口。当顶层窗口被变成非顶层窗口时,它装有的具备者和它抱有的全部窗口都被改成非顶层窗口。倘若既未有一点名SWP_NOACTIVE标记也从未点名SWP_NOZO奔驰G级DERubicon标记(那意味应用程序供给窗口被同时激活并归入钦点的Z轴次序卡塔 尔(阿拉伯语:قطر‎,则pWndInsertAfter参数中钦命的值将只在下列条件下适用:l
  在pWndInsertAfter参数中既未有一点点名&wndTopMost也未有一点点名&wndNoTopMost。
 
 
这一个窗口不是活动窗口。应用程序不能够激活一个非活动窗口但同期又不把它带到Z轴次序的最上端。应用程序能够未有其他约束地转移活动窗口的Z轴次序。非顶层窗口大概持有一个顶层窗口,不过反之则不创立。任何被顶层窗口具备的窗口(比如对话框卡塔尔国都将自身成为顶层窗口,以作保全数被全体的窗口位于它们的具有者上方。在Windows
 
3.1或更新的版本中,能够将窗口移动到Z轴次序的顶上部分,并由此安装它们的WS_EX_TOPMOST风格而将之锁定在此。这种顶层窗口即便在错失活动状态以往也会维持顶层位置。举个例子,选择WinHelp的Always
  On  
Top命令会使救助窗口变为顶层,并且在您回到应用程序之后它还保持可以知道。要开创二个顶层窗口,应在调用SetWindowPos的时候将
pWndInsertAfter参数设为&wndTopMost,或然在创制窗口的时候设置WS_EX_TOPMOST风格。尽管Z轴次序中蕴藏了别的具有WS_EX_TOPMOST风格的窗口,则用&wndTopMost移动的窗口将被安置全数非顶层窗口的顶端,不过放在任何顶层窗口的下面。当应用程序激活一个不具备WS_EX_TOPMOST风格的非活动窗口时,该窗口将被移位到拥有非顶层窗口的上方,然而放在全部顶层窗口的下方。假使在调用SetWindowPos的时候pWndInsertAfter参数被设为&wndBottom,况且CWnd是叁个顶层窗口,则该窗口失去顶层状态(WS_EX_BOTTOM风格被拔除卡塔尔,并且系统将窗口放在Z轴次序的尾部。

在介绍了逻辑英寸的知识现在,十分轻易将OLEServer设置为依照逻辑英寸的照耀形式。倘若程序员仅仅调用SetMapMode(hdc,MM_LOENGLISH)来设置映射形式,当前的照耀形式为概略英寸,并不是逻辑英寸。设置逻辑英寸必得自定义窗口和视口的约束,使xViewExt/xWinExt
=0.01逻辑英寸中国水力电力对国有集团业平像素的罗列,当xViewExt=LOGPIXELSX,xWinExt=100时,其比率正巧满意上述供给。

 

以下是安装映射形式的代码。

from:

intxLogPixPerInch = GetDeviceCaps(hdc, LOGPIXELSX); 
intyLogPixPerInch = GetDeviceCaps(hdc, LOGPIXELSY); 
SetMapMode(MM_ANISOTROPIC); 
SetWindowExt(100, 100); 
SetViewportExt(xLogPixPerInch, yLogPixPerInch); 

上述代码中调用SetMapMode函数将映射方式设置为自定义的,该调用必得放在SetWindowExt
和SetViewportExt调用此前,不然设置将会失效。
上述代码实际大校映射情势设置成逻辑MM_LOENGLISH,若工程师必要安装逻辑MM_LOMETRIC、MM_HIMETRIC、MM_HIENGLISH
或MM_TWIPS,只需校正上述代码中的SetWindowExt的参数,该参数实际上是每英寸所饱含的各个映射情势下的单位数。依照表1中各映射形式的参数,可获得表2中每英寸所对应的各逻辑单位的个数。

例如说,要设置逻辑MM_TWIPS,函数SetWindowExt中的参数为应1440。

2.逻辑坐标与道具坐标转换时抽样误差的管理

表2

映 射 模 式 每 英 寸 所 对 应 的 逻 辑 单 位 数
MM_LOENGLISH 100
MM_HIENGLISH 1000
MM_LOMETRIC 254
MM_HIMETRIC 2540
MM_TWIPS 1440

当大家将映射方式设置成基于逻辑英寸的MM_LOMET昂CoraIC时,窗口的限量设为256,视口的限量设为96(在VGA显示屏下LOGPIXELSX的值卡塔尔,约2.6个逻辑单位对应1个像素,那眼看会招致一点都不小的基值误差,它会显今后应用程序的各样方面:客户区的三个部分没有被刷新;对象时期自然从没间距,却显得出有间距;对象在荧屏的不如职位上会缩短或附加二个像素等难点。

能够动用以下多少个步骤制止调换相对误差。(1)尽量筛选窗口范围和视口范围比能够整除的光彩夺目格局,举例基于逻辑英寸的MM_TWIPS其窗口范围和视口范围比1440/96,可简化为15/1,从设备坐标转变为逻辑坐标时从没零值误差,从撤销引用误差角度看,MM_TWIPS比任何多少个映射形式都要好。(2)窗口范围和视口范围比不能够整除时,也硬着头皮将其简化,举例,当使用0.3900mm
中的将1个逻辑单位映射成1/64英寸的映照格局时,其窗口范围和视口范围比值为64/96,可简化为2/3。如若大家将逻辑单位的值都取为2的倍数,设备单位的值都取为3的翻番,调换后就从不精度的不见了。

综合,如若大家能够根据映射模式值的风味,逻辑坐标和设施坐标都取经简化的窗口和视口范围值的倍数,则逻辑坐标和设备坐标间的转速将还没抽样误差。

(我地址:北大东军事和政院学科技(science and technology)行当楼401室,100084卡塔 尔(阿拉伯语:قطر‎

发表评论