Windows GDI中的坐标系一文所涉及的代码

原创 2003年11月04日 01:30:00

源码1

/*
 Function:

 把逻辑位置转换为最终的物理坐标空间中的位置

 Parameter:

 hDC---待转换逻辑坐标所处的空间

 lpPoint---待转换的逻辑点转换前为逻辑点,转换后为取整后的毫米

 nCount----待转换点的个数

 RetValue:

 TRUE or FALSE

 History:

 2003-10-25 11:13
*/
void GetPhysicalPosition(HDC hDC,LPPOINT lpPoint ,int nCount)
{
 POINT originPoint;

 int widthmm=GetDeviceCaps(hDC,HORZSIZE);
 int heightmm=GetDeviceCaps(hDC,VERTSIZE);

 int widthres=GetDeviceCaps(hDC,HORZRES);
 int heightres=GetDeviceCaps(hDC,VERTRES);

 LPtoDP(hDC,lpPoint,nCount);

 GetDCOrgEx(hDC,&originPoint);

 for(int i=0; i<nCount; ++i)
 {
  lpPoint[i].x +=originPoint.x;
  lpPoint[i].y +=originPoint.y;

  lpPoint[i].x=lpPoint[i].x*widthmm/widthres;
  lpPoint[i].y=lpPoint[i].y*heightmm/heightres;
 }

}

源码2
/*
 Function:

  我们自己的把逻辑坐标转换为设备坐标的函数
*/
BOOL MyLPtoDP(
  HDC hdc,           // handle to device context
  LPPOINT lpPoints,  // array of points
  int nCount         // count of points in array
)
{
 int graphicsMode=GetGraphicsMode(hdc);

 if(graphicsMode ==GM_ADVANCED) //处理启用了世界坐标系的情况
 {
  XFORM curForm;

  GetWorldTransform(hdc,&curForm);

  for(int i=0; i<nCount; ++i)//应用公式一完成世界坐标空间向页面坐标空间的转换
  {
   float xpage=lpPoints[i].x*curForm.eM11+lpPoints[i].y*curForm.eM21+curForm.eDx;
   float ypage=lpPoints[i].x*curForm.eM12+lpPoints[i].y*curForm.eM22+curForm.eDy;

   lpPoints[i].x=(int)xpage;
   lpPoints[i].y=(int)ypage;
  }
 }

 POINT pointOrgView,pointOrgWin;
 SIZE winSize,viewSize;

 //得到窗口、视口的原点和范围
 GetViewportOrgEx(hdc,&pointOrgView);
 GetViewportExtEx(hdc,&viewSize);
 GetWindowOrgEx(hdc,&pointOrgWin);
 GetWindowExtEx(hdc,&winSize);

 //根据公式二进行页面坐标空间到设备坐标空间的转换
 for(int i=0; i<nCount; ++i)
 {
  float xdevice=(lpPoints[i].x-pointOrgWin.x)*viewSize.cx/(float)winSize.cx+pointOrgView.x;
  float ydevice=(lpPoints[i].y-pointOrgWin.y)*viewSize.cy/(float)winSize.cy+pointOrgView.y;

  lpPoints[i].x=(int)xdevice;
  lpPoints[i].y=(int)ydevice;
 
 }

 return TRUE;
}

简单的说说对GDI+坐标系的理解

小弟初学GDI+,对坐标系之间的转换不是很明白,下面是我粗浅的理解,希望各路前辈和高人指出其中的错误,不甚感激! [color=#FF00FF][/color] 1. 三种坐标系 在GD...
  • wishfly
  • wishfly
  • 2013年04月12日 17:47
  • 1263

模拟GDI+中的坐标系转换

通过模拟GDI+中的坐标系转换方法,深入彻底理解转换原理,做到知其然必知其所以然。心中有原理,手上才能写出出色的代码。...
  • smstong
  • smstong
  • 2013年08月10日 20:33
  • 2737

GDI 坐标系统与坐标变换(转)

win32程序使用坐标系统之间的变换完成图形的缩放、旋转、平移等输出操作。win32下面总共使用四个坐标空间:世界坐标系、页面坐标系、设备坐标系和物理坐标系(包括客户区、桌面或打印纸等)。每个坐标空间...
  • fengxiaochenduanduan
  • fengxiaochenduanduan
  • 2013年12月24日 22:09
  • 1032

[win32] GDI绘图常用的三种坐标系

GDI绘图常用的三种坐标系:  屏幕坐标系 ,  窗口坐标系  和  客户区坐标系 1. 屏幕坐标系:    坐标原点在屏幕左上角, 自左向右x坐标增大 , 自上向下y坐标增大.  通过 GetWin...
  • qq_15567051
  • qq_15567051
  • 2015年02月03日 13:23
  • 486

GDI+坐标变换(C#)

平移 拉伸 坐标重置
  • cocoasprite
  • cocoasprite
  • 2015年12月30日 22:31
  • 1052

从GDI到GDI+使用的坐标系看微软二维绘图思路的进步

1 微软Windows绘图系统使用的三种坐标系 为了便于绘制,微软在其绘图系统中引入了三种不同的坐标系,这三种坐标系都是平面直角坐标系,下面从坐标系的三要素即度量单位、坐标原点、坐标轴方向分别对其进...
  • smstong
  • smstong
  • 2014年02月27日 18:52
  • 3561

Windows GDI中的坐标系(一)

Windows GDI中的坐标系(一)By leezy_2000                          2003-10-21 16:13 如果你用GDI输出过文本、位图、或者绘制过如直线、...
  • leezy_2000
  • leezy_2000
  • 2003年11月04日 01:30
  • 3056

Windows GDI+坐标系统详解

Windows GDI+坐标系统解析。
  • smstong
  • smstong
  • 2011年05月09日 04:16
  • 11125

C# GDI三种坐标系及颜色等常用结构

C#中GDI三种坐标系及颜色等常用结构
  • New_Teacher
  • New_Teacher
  • 2016年03月28日 08:57
  • 1605

Windows GDI中的坐标系(二)

Windows GDI中的坐标系(二)By leezy_2000                          2003-10-21 16:13 一、逻辑空间的坐标是如何转化为设备空间的坐标的? ...
  • leezy_2000
  • leezy_2000
  • 2003年11月04日 01:30
  • 3198
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Windows GDI中的坐标系一文所涉及的代码
举报原因:
原因补充:

(最多只允许输入30个字)