码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-04-14 06:51:40      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

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

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

第一个问题,如何知道字体的高度呢?根据文本显示的研究,字体的高度存放在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);

 

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

标签:

原文地址:http://www.cnblogs.com/tinaluo/p/5389636.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!