hur.cn - 华软网

 热门搜索

获取truetype字体中指定字符的宽度

  作者:未知    来源:网络    更新时间:2011/4/13
应用程序里边调用了第三方的控件来实现往pdf里边插入文本,然则用他们提供的接口函数需要指定文本的字体信息和插入位

置坐标点。但实现中英文夹杂文本插入后,显示出来的字符间距不对。英文之间会间隔对照远,感觉跟汉字等宽。

目前我这边能做的是,对中英文夹杂文本举行判断,字体均是指定的宋体,中文部份指定字符集为GB2312_CHARSET,英文则指定

为ANSI_CHARSET。但这就涉及到字符宽度的问题。假定字符为wchar_t text[] = "北京市ABC中学",我读入字符后,得分别计

算"北京市"、“ABC”的字符宽度。查资料说GetTextExtent函数能够计算字符串的宽度,我按以下方法是了下。获得“北京

市”和"ABC"的宽度是一样的,都是21。

       wchar_t text[] = "北京市";
  //   wchar_t text[] = "ABC";
       int ncount = wcslen(text);
       CClientDC dc(this);
       LOGFONT lf;
       memset(&lf, 0, sizeof(lf));
       char FontNameCH[] = "SimSun";
       strcpy(lf.lfFaceName, FontNameCH);
       lf.lfCharSet = GB2312_CHARSET;
  //   lf.lfCharSet = ANSI_CHARSET;
       lf.lfItalic &= 0x00;
       lf.lfWeight &= 0x00;
       lf.lfPitchAndFamily &= 0x00;    
   
       CFont newFont;
       if(!newFont.CreateFontIndirect(&lf)) 
           return;
       CFont *pOldFont = dc.SelectObject(&newFont);
       CString str;
       str = text;
       CSize sizeText = dc.GetTextExtent(str,ncount);

 我也试过指定lf.lfPitchAndFamily &= 0x02; 但结果是一样。可是中英文的字符宽度明显应该是不一样的啊?

请问还能用哪一个函数猎取truetype字体的字符宽度信息吗?
---华软 网友回答---
GetTextMetrics 
---华软网友回复---
引用 1 楼 j8daxue 的回复:
GetTextMetrics


这个只可猎取字体的字符平均宽度和最大宽度吧。

---华软网友回复---
获得字符串的宽度GetTextExtent就够了啊
C++">
        CFont font;
font.CreatePointFont(100,L"Arial");
CFont* pOld = pDC->SelectObject(&font);

CString str1 = L"ABC";
CString str2 = L"北京市";

CSize s1 = pDC->GetTextExtent(str1);
s1 = pDC->GetTextExtent(str2);
int a = 0;

不知道你怎么搞的,这个2个明显不同,一个是27,一个是48.
---华软网友回复---
引用 3 楼 j8daxue 的回复:
获得字符串的宽度GetTextExtent就够了啊

C/C++ code

        CFont font;
    font.CreatePointFont(100,L"Arial");
    CFont* pOld = pDC->SelectObject(&font);

    CString str1 = L"ABC";
    CString str2……


可是由于我这边所遇到的情况,需要对中英文指定不同的字符集,没法用CreatePointFont来创建字体。我也想可能是我哪一个参数没设置正确,然则看不出来。
---华软网友回复---
GetTextMetrics:猎取当前字体的信息

GetTextExtent:猎取特定的字符串在屏幕上所占的宽度和高度

对于这两个函数的作用,我在编程的时候,也有一定的困惑。因此,我也想,其余人在编程的时候也肯定有 一样的困惑。所以我把他们解释一下。不足之处,还请大家多多的增加 批评~~其实,咱们对什么困惑呢?函数的调用方法,照旧在前往值上?

CDC::GetTextMetrics

作用:

前往当强设备描写表中的当前所用的字体的信息

函数原型:

BOOL GetTextMetrics(
   LPTEXTMETRIC lpMetrics 
) const;

参数: 
lpMetrics (是一个指针)
前往指向TEXTMETRIC 结构的一个数据。

前往值:
非零值成功

要求: 
包括头资料: afxwin.h




CDC::GetTextExtent
Call this member function to compute the width and height of a line of text using the current font to determine the dimensions.
调用这个函数,前往用当前字体写下的一行字符串的高度和宽度

函数原型:
CSize GetTextExtent(
   LPCTSTR lpszString,
   int nCount 
) const;

CSize GetTextExtent(
   const CString& str 
) const;

参数 
lpszString

指向一个字符串指针,也能够传送一个字符串对象。
nCount

指定字符在字符串中的数目
str

一个字符串对象,包括指定的字符。
前往值:

以逻辑单位前往字符串的尺寸,保存留一个CSize对象中



要求:包括头资料 afxwin.h
---华软网友回复---
GetGlyphOutline
GetCharABCWidths      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。