源码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; } 
|