逻辑坐标和设备坐标的研究

题目:以毫米为单位在用户区中输出(上下相邻)两行字符串,如何解?

如果打印两行字符串,需要在行间保持(一定的)距离才不会重叠或者行距太大。

第一个问题,如何知道字体的高度呢?根据文本显示的研究,字体的高度存放在TEXTMETRIC这个结构中,通过创建DC得到这个高度,接着的问题是,如果按照默认映射模式,也即MM_TEXT模式,得到的是映射模式的逻辑单位,换句话说,假如不改变映射模式,得出的高度为16(象素)。

16是象素,但是现在需要以毫米为单位,显然这个16不符合要求,需要把映射模式改为MM_LOMETRIC,于是得到逻辑单位以0.1mm为单位,再去取TEXTMETRIC中的高度,得到56。

计算:
同样的字体,象素为单位=16,0.1mm为单位=56,于是16象素=5.6mm。

通过计算得知,在以MM_LOMETRIC的映射模式下,字体的高度为56(即5.6毫米),问题已经基本得到解决。

在MM_LOMETRIC的映射模式下,x向右,y向上, 假如第一行字串起点为:(100,-100),则第二行字串的起点为(100,-100-56)。

同样,如果转换为MM_TEXT模式,在相同的地方输出,则第一行字串转换为(28,28),可以覆盖,稍有点误差。

/*------------------------截选代码---------------------------*/
     static char buffer[20];
     HDC hdc;
     PAINTSTRUCT ps;
     static TEXTMETRIC tm;
     switch (message)
     {
     case WM_CREATE:
          hdc=GetDC(hwnd);//创建临时DC
          SetMapMode(hdc,MM_LOMETRIC);//转换映射模式为MM_LOMETRIC
          GetTextMetrics(hdc,&tm);//得到字体信息
          itoa(tm.tmHeight,buffer,10);//获取字体高度,存放在临时数组buffer中,观察字体在MM_LOMETRIC模式的高度
          ReleaseDC(hwnd,hdc);
          return 0;
     case WM_PAINT:
          hdc=BeginPaint(hwnd,&ps);
          SetMapMode(hdc,MM_LOMETRIC);//设置MM_LOMETRIC模式
          TextOut(hdc,100,-100,buffer,strlen(buffer));//输出第一行字串
          TextOut(hdc,100,-100-tm.tmHeight,buffer,strlen(buffer));//输出第二行字串
          SetMapMode(hdc,MM_TEXT);//再转换成MM_TEXT模式
          TextOut(hdc,28,28,"MM_TEXT",7);//输出字串
          TextOut(hdc,28,28+28,"MM_TEXT",7);
          EndPaint(hwnd,&ps);
          return 0 

对映射模式的两种操作:

SetMapMode(HDC hdc,int nMapMode); /*映射模式其实为一常量值*/
int GetMapMode(HDC hdc);

时间: 2024-11-07 12:26:35

逻辑坐标和设备坐标的研究的相关文章

逻辑坐标与设备坐标——全窗口坐标、屏幕坐标、客户区坐标的总结

Windows应用程序绘制图形时使用的是一种逻辑单位,每个逻辑单位的大小由映射模式决定,这个逻辑单位既可以与设备单位(屏幕或打印机上的一个 像素点)相同,也可以是一种物理单位(如毫米),还可以是用户自定义的一种单位.在Windows应用程序中,只要与输出有关系,都要使用映射模式. 首先谈谈映射模式基本知识,当Windows应用程序在其客户区绘制图形时,必须给出在客户区的位置,其位置用x和y 两个坐标表示,x表示横坐标,y表示纵坐标.在所有的GDI绘制函数中,这些坐标使用的是一种"逻辑单位&quo

设备坐标和逻辑坐标

StickToProgram 设备坐标和逻辑坐标 Windows应用程序绘制图形时使用的是一种逻辑单位,每个逻辑单位的大小由映射模式决定,这个逻辑单位既可以与设备单位(屏幕或打印机上的一个像素点)相同,也可以是一种物理单位(如毫米),还可以是用户自定义的一种单位.在Windows应用程序中,只要与输出有关系,都要使用映射模式.本文的目的是帮助读者了解映射模式的一些基本知识,并对在使用中经常 出现的一些问题提出解决方案. 一.映射模式基本知识   当Windows应用程序在其客户区绘制图形时,必须

图形基础

图形基础 壹佰软件开发小组  整理编译   图形设备接口(GDI:Graphics Device Interface)是Windows的子系统,它负责在视讯显示器和打印机上显示图形.正如您所认为的那样,GDI是Windows非常重要的部分.不只您为Windows编写的应用系统在显示视觉信息时使用GDI,就连Windows本身也使用GDI来显示使用者接口对象,诸如菜单.滚动条.图标和鼠标光标. 不幸的是,如果要对GDI进行全面的讲述,将需要一整本书-当然不是这本书.在本章中,我只是想向您提供画线和

C#实现无物理边距真正可打印区域的绘图\打印程序开发

经常在开发实际的应用程序中,需要用到图形绘制和打印程序.如何实现完整的精确打印和绘图是需要注意许多细节地方的.最近在遇到打印问题的时候,仔细研究一阵,总结这篇博文,写得有点杂乱,看文要还请费点神. 基本功能:窗体绘图与鼠标交互  打印预览与打印输出 开发平台:VisualStudio 2010 (C#) 1绘图坐标系统 1.1绘图系统坐标转换(屏幕窗口/打印机) 绘图程序涉及到多种坐标系统,总体上可分为三个坐标系:世界坐标系.页面坐标系以及设备坐标系.想要将图形图像会知道最终的设备上,中间需要做

DPtoLP/LPtoDP 和 ScreenToClient/ClientToScreen

设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出设备上的坐标.通常将屏幕上的设备坐标称为屏幕坐标.设备坐标用对象距离窗口左上角的水平距离和垂直距离来指定对象的位置,是以像素为单位来表示的,设备坐标的X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角. 逻辑坐标(Logical Coordinate)是系统用作记录的坐标.在缺省的模式(MM_TEXT)下,逻辑坐标的方向和单位与设备坐标的方向和单位相同,也是以像素为单位来表示的,X轴

Windows API 大全

常用Windows API1. API之网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接WNetCancelConnection2 结束一个网络连接WNetCloseEnum 结束一次枚举操作WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDis

linux API函数大全

还没有认真研读过,今晚在其他博客上找了比较久,今晚时间也不多了,等有空再细看 先复制先 获取当前执行路径:getcwd 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接  WNetAddConnection2 创建同一个网络资源的连接  WNetAddConnection3 创建同一个网络资源的连接  WNetCancelConnection 结束一个网络连接  WNetCancelConnection2 结束一个网络连接  WNetCloseEnum

MFC绘图(转载)

http://www.cppblog.com/bestcln/articles/83189.html 1 几何对象的结构和类 为了使用绘图函数,应该先了解绘图所用到的几种表示几何对象的结构和类.这些结构和类分别定义在头文件windef.h和afxwin.h中. 1.点 1)点结构POINT 点数据结构POINT用来表示一点的x.y坐标: typedef struct tagPOINT { LONG x; LONG y; } POINT; 2)点类CPoint 点类CPoint为一个没有基类的独立

windows客户端开发--windows api大全

网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接 WNetDisconnectDialo