菜单

坐标和多少个函数的用法表达 .

2019年3月10日 - www6165com

能够行使Windows提供的五个函数DPtoLP和LPtoDP在装置坐标及逻辑坐标之间互相转换。

//定义逻辑窗口区域,单位为逻辑单位(Logical)
WINGDIAPI BOOL  WINAPI SetWindowExtEx (HDC, int, int, LPSIZE);
此API函数在MFC中封装为CDC::virtual CSize SetWindowExt(int cx, int cy);

MFC提供了七个函数CDC::DPtoLP()和CDC::
LPtoDP()用于装备坐标与逻辑坐标之间的彼此转换。

 

2.逻辑坐标与设备坐标转换时误差的拍卖

(4).自定义映射格局

(1)Windows坐标体系

率先,不要被这些名字迷惑了,那三个坐标是跟映射有关的,跟显示器坐标系,窗口坐标系,客户端坐标系是相对独立的多个文化。

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

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
     
将窗口重新定位到拥有非顶层窗口的顶部(那象征在全数的顶层窗口之下)。这一个标志对那多少个早已是非顶层窗口的窗口没有效应。有关这么些函数以及那一个参数的利用规则参见说美赞臣(Meadjohnson)些。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卡宴ZO卡宴DE汉兰达       不转移拥有者窗口在Z轴次序上的岗位。l  
SWP_NOREDRAW      
不重画变化。假设设置了那一个标志,则不发出别的类型的转变。那适用于客户区、非客户区(包罗标题和滚动条)以及被活动窗口覆盖的父窗口的此外部分。当以此标志被设置的时候,应用程序必须通晓地无效或重画要重画的窗口和父窗口的其余部分。l
  SWP_NOREPOSITION       与SWP_NOOWNERZORDER相同。l  
SWP_NOSENDCHANGING       防止窗口接收WM_WINDOWPOSCHANGING消息。l  
SWP_NOSIZE       保持方今的分寸(忽略cx和cy参数)。l   SWP_NOZO奥迪Q5DE福睿斯  
    保持最近的次序(忽略pWndInsertAfter)。l   SWP_SHOWWINDOW      
展现窗口。  
   
 
调用那个成员函数以变更子窗口、弹出窗口和顶层窗口的大大小小、地点和Z轴次序。窗口在显示器上依照它们的Z轴次序排序。在Z轴次序上居于顶端的窗口将顺序在具有其余窗口的顶部。子窗口的全部坐标都是客户坐标(绝对于父窗口客户区的左上角)。窗口能够被移动到Z轴次序的顶部,既可以经过将
pWndInsertAfter参数设为&wndTopMost,并保管没有安装SWP_NOZO奥德赛DE奥迪Q5标志,也能够因此设置窗口的Z轴次序使它座落全体现存的顶层窗口上方。当3个非顶层窗口被设为顶层窗口时,它富有的窗口也被设为顶层的。它的拥有者不暴发变化。若是顶层窗口被再一次定位到Z轴次序的底层(&wndBottom)或别的非顶层窗口之后,则它将不再是顶层窗口。当顶层窗口被改为非顶层窗口时,它兼具的拥有者和它拥有的拥有窗口都被变成非顶层窗口。假使既没有点名SWP_NOACTIVE标志也一直不点名SWP_NOZO大切诺基DE奥德赛标志(这意味应用程序供给窗口被同时激活并放入钦命的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轴次序的底层。

照耀格局规定了在绘制图形时所依据的坐标系,它定义了逻辑单位的实际尺寸、坐标增进趋势,全数映射形式的坐标原点均在配备出口区域(如客户区或打字与印刷区)的左上角。其它,对于有个别映射方式,用户还是能自定义窗口的长度和宽窄,设置视图区的物理范围。

实际公式拿出来,学数学的伙伴是否就懂了大多了,这一个公式卓殊重要,驾驭了那个公式,前边的累累东西就能知晓,首先,公式中的Window,WinOrg,WinExt,便是带了Win的事物,就是利用的逻辑坐标的值,就跟GDI函数中的一样,逻辑坐标的单位只怕是像素(MM_TEXT映射)、毫米(单位是0.1mm,在MM_LOMET奥迪Q7IC映射下)等等等等(看下图).

以下是设置映射情势的代码。

(2)坐标之间的并行转换
 编制程序时,有时要求遵照近日的具体意况进行三种装备坐标之间或与逻辑坐标的互相转换。
1.MFC提供了多少个函数CDC::DPtoLP()和CDC::
LPtoDP()用于装备坐标与逻辑坐标之间的交互转换。
2.MFC提供了五个函数CWnd::ScreenToClient()和CWnd::ClientToScreen()用于显示器坐标与客户区坐标的互相转换。

<1>逻辑坐标系(Logical
Coordinate)是面向DC的坐标系,这种坐标不考虑现实的设备项目,在绘图时,Windows会遵照当下设置的照射方式将逻辑坐标转换为设备坐标。

之所以假若记住开首的公式,获得不错的附和的参数,就能够画出必要的图纸。

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

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

注意:
第②,要记住两点:
1。设备坐标的(0, 0)点一贯是客户区的左上角。 
2。我们在绘图时内定的点全体都以逻辑坐标点。
坐标转换
调用CDC::LPtoDP能够将逻辑坐标转换为装备坐标;
高用CDC::DPtoLP能够将配备坐标转换为逻辑坐标;
怎么样时候用什么样坐标系
 可以认为CDC的有着成员函数都以逻辑坐标作为参数 
 能够认为CWnd的保有成员函数都是设备坐标作为其参数 

 
 首先,逻辑坐标这么些名词就让很三人惶惑,确实,无法“以偏概全”地精晓的翻译就不是好翻译 
 ——周豫才。哈哈,开个噱头,我们要精晓这多少个东西,首先要想开固然你要用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都用上面八个公式将窗口坐标转换到视口坐标:

CRect rect;

编程时,有时须要根据当下的具体意况实行三种配备坐标之间或与逻辑坐标的相互转换。

 

Windows还可以将视口(设备)坐标转换为窗口(逻辑)坐标:

ScreentoClient(&rect);

Windows定义了8种炫耀格局,见下表。

1.逻辑坐标和装备坐标

当咱们将映射情势设置成基于逻辑英寸的MM_LOMETCRUISERIC时,窗口的限定设为256,视口的限定设为96(在VGA显示屏下LOGPIXELSX的值),约2.5个逻辑单位对应3个像素,这肯定会促成十分大的误差,它会议及展览未来应用程序的各样方面:客户区的贰个有个别没有被刷新;对象期间自然从没间隔,却显得出有间距;对象在荧屏的不等岗位上会收缩或附加八个像素等难题。

设施坐标系分为显示屏坐标系、窗口坐标系和客户区坐标系三种互相独立的坐标系。
1.显示屏坐标系以显示器左上角为原点,一些与总体显示器有关的函数均运用荧屏坐标,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。弹出式菜单使用的也是显示器坐标。
2.窗口坐标系以窗口左上角为坐标原点,它总结窗口标题栏、菜单栏和工具栏等限制。
3.客户区坐标系以窗口客户区左上角为原点,重要用来客户区的绘图输出和窗口音信的处理。鼠标音讯的坐标参数使用客户区坐标,CDC类绘图成员函数使用与客户区坐标对应的逻辑坐标。

(2)坐标之间的互相转换

故此说视口和窗口实际上是意味的均等块区域,只然则是因为单位和原点的不比,需求开始展览映射,逻辑单位正是窗口,正是Window,即是像素,毫米,英寸,正是给人用的单位,就是装备无关的单位,设备单位正是视口,正是Viewport,就不得不是像素,就是给装备用的单位,鲜明的一分米,在差异的配备上的像素数大概会有分别,所以是装备相关的单位。

Windows中蕴涵以下3种配备坐标,以满足种种不一样须求:

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

  逻辑坐标是GDI函数在显示器上显示数据所用的坐标,逻辑坐标除非与物理坐标相关联,不然没有义。windows依靠映射形式解释逻辑坐标。比如缺省的格局为MM_TEXT,该方式下,物理坐标与逻辑坐标是出色的涉及。

要讲上边的公式,就要先说一下视口(Viewport 山东译作视埠)和窗口(Window
山西译作视窗)

里面,(xWindow,yWindows)是待转换的逻辑点,(xViewport,yViewport)是更换后的设备点。假设设备坐标是客户区域坐标或全窗口坐标,则Windows在画一个目的前,还非得将那些坐标转换到荧屏坐标。

 

      逻辑坐标(Logical
Coordinate)是系统作为记录的坐标。在缺省的情势(MM_TEXT)下,逻辑坐标的大势和单位与设备坐标的来头和单位一律,也是以像素为单位来
表示的,X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。逻辑坐标和设备坐标就算在缺省方式下其数值也不一定相同,除了在偏下两种景况下:
  1. 窗口为非滚动窗口
  2.
窗口为滚动窗口,但垂直滚动条位于滚动边框的最上端,水平滚动条位于最左端,但只要移动了滚动条那三种坐标就不一样了。
  在VC中鼠标坐标的坐标地点用配备坐标表示,但有所GDI绘图都用逻
坐标表示,所以用鼠标绘图时,那么必须将装备坐标转换为逻辑坐标,能够运用CDC
函数DptoLP()将配备坐标转化为逻辑坐标,同样可以用LptoDP()将逻辑坐标转化为设备坐标。

要小心的是在上述的5映射情势下,ViewExt/WinExt的百分比都以早已规定了,不能更改的,即使要改变三个值,只可以在MM_ISOTROPIC和MM_ANISOTROPIC映射格局下行使SetViewportExtEx()和SetWindowExtEx()更改。而且这两个函数在上边5种炫耀方式下无效。

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

   
当绘制的图纸必要随着窗口的大大小小改变而机关改变的时候,一般选取MM_ISOTROPIC和MM_ANISOTROPIC映射格局。它们的绝无仅有分裂就是前者的X轴和Y轴的逻辑单位的大大小小是均等的,单词“isotropic”就是逐一方向相等的情致,此映射格局符合绘制圆或长方形。而实在应用中,平日给X轴和Y轴取不一样的百分比,那时候选用MM_ANISOTROPIC映射格局。单词“anisotropic”就是各类方向相异的趣味。

上边三种都以展现设备的情理坐标,它们在荧屏上用实际的情理像素表示

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图