前段时间在学Win32的编制程序,看的是《Windows程序设计第5版》风度翩翩书,那本书是广西人翻译的,有个别译法和陆地不平等,书中还或许有局地漏洞百出的地点,非常多时候必要中希腊语对照阅读,下载请点击

Windows应用程序绘制图形时利用的是风流洒脱种逻辑单位,每一个逻辑单位的深浅由映射方式决定,
这几个逻辑单位不只能够与设备单位(显示器或打字与印刷机上的叁个像素点)相通,也得以是风流罗曼蒂克种物理单
位(如分米),还能是顾客自定义的一种单位。在Windows应用程序中,只要与出口有涉嫌,都
要使用映射格局。本文的指标是扶持读者精通映射情势的有些基本知识,并对在利用中常常现身的有的标题提议建设方案。

(1)Windows坐标种类
Windows坐标系分为逻辑坐标系和设施坐标系二种,GDI扶持那二种坐标系。日常来讲,
GDI的文件和图表输出函数使用逻辑坐标,而在顾客区移动或按下鼠标的鼠标地点是应用配备坐标。
<1>逻辑坐标系是面向DC的坐标系,这种坐标不寻思实际的装置档次,在绘图时,Windows会依据当前安装的照耀格局将逻辑坐标转变为器械坐标。
<2>设备坐标系是面向物理设备的坐标系,这种坐标以像素或设施所能表示的极小长度单位为单位,X轴方向向右,Y轴方向向下。设备坐标系的原点地方(0,
0卡塔尔(英语:State of Qatar)不限量在装置彰显区域的左上角。

生机勃勃、映射形式基本知识
当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(卡塔尔(英语:State of Qatar)。弹出式菜单使用的也是显示屏坐标。
2.窗口坐标系以窗口左上角为坐标原点,它总结窗口标题栏、菜单栏和工具栏等范围。
3.客户区坐标系以窗口顾客区左上角为原点,首要用来客商区的绘图输出和窗口新闻的管理。鼠标信息的坐标参数使用顾客区坐标,CDC类绘图成员函数使用与顾客区坐标对应的逻辑坐标。

在看到GDI(GDI Graphic Device
Interface图形设备接口卡塔尔(قطر‎
辉映方式那朝气蓬勃节的时候,书中又是逻辑坐标,又是设备坐标,又是视口,窗口,又是视埠什么的,搞得人头都大了。固然自个儿未来还尚无完全读懂,可是本身深感自小编大器晚成度引发了精通那个事物的主线,下边包车型大巴事物就当做本身的笔记吧:

2.设施坐标

 

1.逻辑坐标和装置坐标

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

(2)坐标之间的并行调换
 编制程序时,有时要求根据目前的具体情形实行两种配备坐标之间或与逻辑坐标的相互作用调换。
1.MFC提供了多个函数CDC::DPtoLP(卡塔尔和CDC::
LPtoDP(卡塔尔(英语:State of Qatar)用于器具坐标与逻辑坐标之间的人机联作调换。
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卡塔尔(英语:State of Qatar)是MM_TEXT,在MM_TEXT映射形式(TEXT实际上跟文字未有多大关系,是这种映射情势下的坐标方向,从左到右,从上到下,跟文字阅读格局雷同卡塔尔(قطر‎下,那么些单位实在是像素。实际上,逻辑坐标和道具坐标的不一致就在于他们的单位分裂样!

Windows中满含以下3种配备坐标,以满足各个差异需求:

 

下边大家拿出三个公式

(1卡塔尔客商区域坐标,包罗应用程序的顾客区域,顾客区域的左上角为(0,0)。

GetWindowRect(卡塔尔拿到的是在荧屏坐标系下的RECT(即以显示器左上角为原点)
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 安徽译作视埠卡塔尔(英语:State of Qatar)和窗口(Window
安徽译作视窗卡塔尔

(3卡塔尔全窗口坐标,包罗二个前后相继的一切窗口,富含标题条、菜单、滚动条和窗口框,窗口的左上角为(0,0)。使用GetWindowDC得到的窗口设备条件,能够将逻辑单位调换到窗口坐标。

ScreentoClient(&rect);

率先,不要被那八个名字吸引了,那多个坐标是跟映射有关的,跟显示器坐标系,窗口坐标系,客商端坐标系是绝对独立的多个知识。

3.逻辑坐标与设施坐标的转移方式

不相仿

骨子里公式拿出来,学数学的友人是或不是就懂了大半了,那一个公式特别首要,通晓了这些公式,前面包车型客车广大东西就会分晓,首先,公式中的Window,WinOrg,WinExt,便是带了Win的事物,正是运用的逻辑坐标的值,就跟GDI函数中的相通,逻辑坐标的单位只怕是像素(MM_TEXT映射)、毫米(单位是0.1mm,在MM_LOMETPAJEROIC映射下卡塔尔(英语:State of Qatar)等等等等(看下图卡塔尔(قطر‎.

辉映格局定义了Windows怎样将GDI函数中钦点的逻辑坐标映射为设备坐标。要世襲探究映射格局大家要介绍Windows有关映射格局的一些术语:大家将逻辑坐标所在的坐标系称为”窗口”,将配备坐标所在的坐标系称为”视口”。

CRect rect;

图片 2

“窗口”重视于逻辑坐标,能够是像素点、分米或程序猿想要的别的标准化。

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

身为我们在调用Win32函数绘图的时候,要清楚本身使用的单位(依照映射形式规定的卡塔尔(英语:State of Qatar)。因为绘图函数里的数值,使用的就是那么些单位,固然私下认可的MM_TEXT映射情势接纳的单位正是像素,不过过多时候任何单位也很有用,比方您要做贰个显示器尺子的时候,你要用尺子量一下物体有几毫米。尺子上的刻度就足以用别样的光彩夺目情势来画。不过显示器在展现的时候却不能够只精晓逻辑坐标几分米啊,荧屏得精晓具体的像素地方才行啊!那此时,就需求选择下边包车型地铁公式转换了。讲到这里,公式里的ViewExt/WinExt是何许意思就很显眼了。那正是在当下逻辑坐标系下(举例几分米,打比方哈卡塔尔(قطر‎,实际上是上边映射情势表格里的单位卡塔尔(英语:State of Qatar)对应的配备坐标应该是微微个像素!那样转换之后,获得实质上的Viewport,正是该逻辑点在显示器上的职务。

“视口”注重于设备坐标(像素点)。平日,视口和客户区域等同。可是,假设程序猿用GetWindowDC或CreateDC获取了三个设施条件,则视口也足以指全窗口坐标或荧屏坐标。点(0,0)是顾客区域的左上角。x的值向右增添,y的值向上增加。

CRect rect;

为此说视口和窗口实际上是意味的相近块区域,只可是是因为单位和原点的两样,供给开展览放映射,逻辑单位正是窗口,就是Window,就是像素,毫米,英寸,就是给人用的单位,正是器材非亲非故的单位,设备单位正是视口,就是Viewport,就不能不是像素,就是给器械用的单位,鲜明的大器晚成毫米,在不一致的装置上的像素数大概会有分别,所以是道具相关的单位。

对此具有映射模式,Windows都用下边多少个公式将窗口坐标调换到视口坐标:

View调用GetWindwoRect(&rect卡塔尔(قطر‎,
拿到的坐标是:左上角(33,99卡塔尔(英语:State of Qatar),右下角(1040,524卡塔尔(英语:State of Qatar),那是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卡塔尔(英语:State of Qatar),rect变成为:左上角(35,101卡塔尔(英语:State of Qatar),右上角(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卡塔尔(英语:State of Qatar),窗口原点(WinOrg卡塔尔国等,都是设备内容(DC
Device
Context,又译作装置内容、设备上下文等卡塔尔国的性质,设备内容其实便是你绘制的区域。有二种BeginPaint(在WM_PAINT时绘制无效区域卡塔尔国,GetDC是顾客端区域(在更新时绘制整个客商区域卡塔尔(英语:State of Qatar),GetWindowsDC是全部窗口区域(能够绘制包蕴窗口题目栏,菜单栏区域卡塔尔。这一个文化细讲的话又是另意气风发篇博客了

那多个公式使用了个别内定窗口和视口原点的点:(xWinOrg,yWinOrg)是逻辑坐标的窗口原点;(xViewOrg,yViewOrg)是设备坐标的视口原点。在缺省的设施条件中,这四个点均设置为(0,0),但它们能够更换。此公式意味着,逻辑点(xWinOrg,yWinOrg)总被映射为设备点(xViewOrg,yViewOrg)。

 

 

Windows仍是可以够将视口(设备)坐标调换为窗口(逻辑)坐标:

(3卡塔尔(英语:State of Qatar).映射形式

 

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

     
映射格局规定了在绘制图形时所依靠的坐标系,它定义了逻辑单位的骨子里尺寸、坐标增生倾向,全体映射方式的坐标原点均在配备出口区域(如客商区或打印区)的左上角。别的,对于有个别映射情势,客户还足以自定义窗口的长短和宽度,设置视图区的情理范围。
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平常在打字与印刷机上,单位是59%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英寸卡塔尔(英语:State of Qatar)。别的映射格局对应的物理单位参见表1。设置了炫人眼目形式之后,Windows自动设置了窗口及视口的范围,范围本身的值并不主要,但范围比是一个定位的值,对于MM_LOMETPAJEROIC,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卡塔尔(英语:State of Qatar);

二、与映射方式有关的难点的消除
其实使用中,工程师会碰到有的与展现方式有关的难题。举个例子OLEServer中映射情势的设置、如何压缩逻辑坐标与设备坐标间互为转换的标称误差等。上边,我就研商一下那多少个难题的缓慢解决办法。
1.OLEServer中映射形式的设置方法

//设置逻辑窗口的原点坐标,缺省原点为(0,0)。
WINGDIAPI BOOL  WINAPI SetWindowOrgEx(HDC, int, int, LPPOINT);
此API函数在MFC中封装为CDC::CPoint SetWindowOrg(int x, int y卡塔尔(英语:State of Qatar);
留意:SetWindowOrg(Ex卡塔尔国独有在炫人眼目形式为MM_ANISOTROPIC或MM_ISOTROPIC时才有意义。

开采OLEServer应用程序时,要是技师间接调用SetMapMode函数将映射形式设置成衡量映射形式中的风姿洒脱种后,在Windows95/98上程序会平常运营,但在WindowsNT上对象出示的高低比边框小。经过小编商讨后,发掘WindowsNT上OLEServer应使用基于逻辑英寸的炫彩方式。在座谈哪边设置基于逻辑英寸的投射格局前,我们先介绍一下逻辑英寸的定义。

//定义视口的坐标轴方向及区域、定义域和值域,单位为像素(Pixel)
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为HO路虎极光ZSIZE和VERTSIZE时,可获得显示区域的幅度和中度;当nIndex
为HOXC60ZRES和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
     
将窗口重新定位到全部非顶层窗口的最上部(那表示在富有的顶层窗口之下)。这几个标识对那多个早已经是非顶层窗口的窗口未有效果与利益。有关这一个函数以致这一个参数的利用法规参见说美赞臣(Karicare卡塔尔(قطر‎些。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_NOOWNE奥迪Q5ZO揽胜极光DEXC90       不校勘具有者窗口在Z轴次序上的职位。l  
SWP_NOREDRAW      
不重画变化。假诺设置了这一个标记,则不发生任何项指标变迁。那适用于客户区、非顾客区(包蕴题目和滚动条)甚至被移动窗口覆盖的父窗口的任何部分。当以此标记被安装的时候,应用程序务必明白地无效或重画要重画的窗口和父窗口的此外部分。l
  SWP_NOREPOSITION       与SWP_NOOWNERZORDER相同。l  
SWP_NOSENDCHANGING       幸免窗口选用WM_WINDOWPOSCHANGING消息。l  
SWP_NOSIZE       保持这几天的深浅(忽视cx和cy参数)。l   SWP_NOZO揽胜DEENVISION  
    保持近日的次序(忽视pWndInsertAfter)。l   SWP_SHOWWINDOW      
展现窗口。  
   
 
调用那一个成员函数以转移子窗口、弹出窗口和顶层窗口的大大小小、地方和Z轴次序。窗口在显示屏上依据它们的Z轴次序排序。在Z轴次序上居于最上部的窗口将先后在有着其余窗口的最上部。子窗口的具有坐标都以客商坐标(相对于父窗口顾客区的左上角)。窗口能够被移动到Z轴次序的最上端,不仅可以够经过将
pWndInsertAfter参数设为&wndTopMost,并保管未有安装SWP_NOZOCR-VDEWrangler标记,也足以透过安装窗口的Z轴次序使它坐落于全体现有的顶层窗口上方。当多少个非顶层窗口被设为顶层窗口时,它具备的窗口也被设为顶层的。它的具备者不发生变化。假若顶层窗口被再次定位到Z轴次序的最底层(&wndBottom)或任何非顶层窗口之后,则它将不再是顶层窗口。当顶层窗口被成为非顶层窗口时,它装有的具备者和它装有的保有窗口都被改成非顶层窗口。假如既未有一些名SWP_NOACTIVE标记也尚未点名SWP_NOZO宝马X5DE牧马人标识(那象征应用程序供给窗口被同一时间激活并归入钦赐的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卡塔尔(英语:State of Qatar)来设置映射情势,当前的映射方式为大要英寸,并不是逻辑英寸。设置逻辑英寸必需自定义窗口和视口的界定,使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_LOMETCRUISERIC时,窗口的限量设为256,视口的限量设为96(在VGA显示屏下LOGPIXELSX的值),约2.6个逻辑单位对应1个像素,那鲜明会促成相当大的标称误差,它展览会今后应用程序的各类方面:客商区的三个片段从没被刷新;对象时期自然未有间距,却显得出有间隔;对象在显示屏的两样岗位上会裁减或附加一个像素等主题材料。

能够选择以下多个步骤幸免转变标称误差。(1卡塔尔(英语:State of Qatar)尽量选择窗口范围和视口范围比能够整除的照射情势,比方基于逻辑英寸的MM_TWIPS其窗口范围和视口范围比1440/96,可简化为15/1,从设备坐标转变为逻辑坐标时没有截断误差,从解除固有误差角度看,MM_TWIPS比其余多少个映射形式都要好。(2卡塔尔窗口范围和视口范围比无法整除时,也硬着头皮将其简化,举例,当使用0.3900mm
中的将1个逻辑单位映射成1/64英寸的照耀形式时,其窗口范围和视口范围比值为64/96,可简化为2/3。假若我们将逻辑单位的值都取为2的翻番,设备单位的值都取为3的倍数,转变后就从不精度的不见了。

总结,假设大家能够依照映射形式值的本性,逻辑坐标和配备坐标都取经简化的窗口和视口范围值的倍数,则逻辑坐标和装备坐标间的中间转播将尚未引用误差。

(我地址:南开东军大学科学和技术行业楼401室,100084)

相关文章