题目:以毫米为单位在用户区中输出(上下相邻)两行字符串,如何解?
如果打印两行字符串,需要在行间保持(一定的)距离才不会重叠或者行距太大。
第一个问题,如何知道字体的高度呢?根据文本显示的研究,字体的高度存放在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