winAPI 函数GetTextExtentPoint32W或GetTextExtentPoint32A可以得出一个字符串的宽度,但这个宽度有时候不准确,如:
字体:
CreateFont(39,14,0,0,0,0,0,0,DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_CHARACTER_PRECIS,
DRAFT_QUALITY,DEFAULT_PITCH,(LPCTSTR)m_strName);wchar_t m_bunicode[1];
m_bunicode[0] = 0xfbfd; //阿拉伯字符
用GetTextExtentPoint32W(pDC,m_bunicode,1,&pSize)得出来的宽度为20x39,但事实上应该为
21*39,当是一个阿拉伯字符串时有时会与实际相差4,5个象素点,请问有什么办法解决这一难题呢?==========顶者有分==========
字体:
CreateFont(39,14,0,0,0,0,0,0,DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_CHARACTER_PRECIS,
DRAFT_QUALITY,DEFAULT_PITCH,(LPCTSTR)m_strName);wchar_t m_bunicode[1];
m_bunicode[0] = 0xfbfd; //阿拉伯字符
用GetTextExtentPoint32W(pDC,m_bunicode,1,&pSize)得出来的宽度为20x39,但事实上应该为
21*39,当是一个阿拉伯字符串时有时会与实际相差4,5个象素点,请问有什么办法解决这一难题呢?==========顶者有分==========
解决方案 »
- 窗口分割后的按钮消息问题
- 矩形按钮---CRect, 不规则形状按钮---?
- 创建一个子窗体,我想隐藏怎么弄?
- MFC中VPTR列表的问题,谢谢!!!
- 显示问题!
- 知道的非常简单,不知道的就是不知道!
- 新手问题,关于dll中 宏重定义 的问题 见windows核心编程P517(电子版)
- 关于AllocConsole得到的Console的缓冲区
- 我在网上无意看到一篇文章, 是关于前一阵子散发木马的人渣. 受害者真多啊!! 大家来关注一下!! 免得更多人受害!
- 新装的VS2010出现这个东西,怎么解决?要不要管呢?
- 用CRecordset::Delete()删除记录时告诉我记录集只读,请问怎么才能把它改成不是只读的
- 当鼠标在对话框外面时如何实时地将位置显示在对话框中?
1、“GetTextExtent呢”,我再试试。
2、“DrawText这个API,用DT_CALCRECT”是不可以实现的,MSDN上对于其用法讲得很清楚。
3、“应当是字符间宽度造成的,如果要精确计算的话,用SetTextCharacterExtra ”单个字符都有不准确的时候,不过我也姑且试一试。
_AFXWIN_INLINE CSize CDC::GetTextExtent(const CString& str) const
{
ASSERT(m_hAttribDC != NULL);
SIZE size;
VERIFY(::GetTextExtentPoint32(m_hAttribDC, str, str.GetLength(), &size));
return size;
}2、SetTextCharacterExtra 函数是用来设置字符串之间额外空白的,不行。不知有没有兄弟写过多过多国语言的软件版本,比如说对中东地区字符串的支持。
为什么不行?经常用的
但也不准确。我是这样来判断是否准确的:将得出的大小返回,以其大小创建一个HBITMAP,然后绘制
最后保存为一个BMP图片,发现总是有几列被截断了,非要我手工将返回的宽度加大才行。
而且我一直这么干的 呵呵
什么叫准确?
但事实上不是,你必须在一个大于20的RECT中绘制才能包含整个字符串。当然,DrawText或GetTextExtentPoint32在很多情况下面(比如英文字符,汉字)是可以得出准确的结果,但对于泰语,中东地区的语言,肯怕就没那么幸运了!!!
GetTextExtentPoint32W(... ,&pSize);
得出SIZE pSize
然后增加:TEXTMETRIC tm;
GetTextMetrics(memtempDC,&tm);
//GetCharABCWidthsW只有在TRUETYPE字体时才能使用,不过如果不是TRUETYPE,GetTextExtentPoint32W也会返回正确的结果了。 :)if(tm.tmPitchAndFamily & TMPF_TRUETYPE)
{
ABC abc;
GetCharABCWidthsW(memtempDC,m_punichar[m_length-1],m_punichar[m_length-1],&abc);
if(abc.abcC < 0)
pSize.cx -= abc.abcC;
}
....这样就能显示所有的字符串了。
GetCharABCWidths得出详细的字符的宽度,abcA是前导空白宽度,abcB是实际的显示宽度,abcC是后面增加的空白列,也可以为负数(特殊字符可能会为负数,如阿拉伯语,越南语,泰语,散含语系等)