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个象素点,请问有什么办法解决这一难题呢?==========顶者有分==========
解决方案 »
- ifstream 的头文件 是什么啊
- 不同类中函数的调用?
- 为什么我在程序中使用std::string,编译错误系统说找不到那
- 请各位高手帮忙,如何从消息的参数当中(LPARAM,WPARAM)当中,获得按的是什么鍵急
- 高手请进,有没有可能实现SendMessage()的超时,就像recv()一样的效果。
- 如何识别?
- 求救!为何我用GetSockName函数得到的本机IP地址为0.0.0.0?
- 这种问题,看不懂!
- 菜鸟求教:怎样在状态栏(CStatusBar)中添加类似于工具栏的提示(ToolTip)?
- 请教高人:现在比较流行的串口编程方式是什么,急急问,谢谢
- 用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是后面增加的空白列,也可以为负数(特殊字符可能会为负数,如阿拉伯语,越南语,泰语,散含语系等)