Winapi 获取字体的字符宽度
我需要从给定字体(例如Arial)获取字符的宽度。只有边界框的宽度,没有间距Winapi 获取字体的字符宽度,winapi,Winapi,我需要从给定字体(例如Arial)获取字符的宽度。只有边界框的宽度,没有间距 HFONT font = CreateFont(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"Arial"); 使用创建的HFONT,是否有方法提取此信息 int MyGetCharWidth(HFONT font, wchar_t wch) { // How to implement this? } 有,但请注意,它不会告诉您有关字距调整的信息,因此它可能有用,也可能不
HFONT font = CreateFont(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"Arial");
使用创建的HFONT,是否有方法提取此信息
int MyGetCharWidth(HFONT font, wchar_t wch)
{
// How to implement this?
}
有,但请注意,它不会告诉您有关字距调整的信息,因此它可能有用,也可能不有用,这取决于您计划如何处理这些信息
如果需要实际文本字符串的宽度,有几个函数可以为您测量它,如。这些功能将包括任何字距修正。这应该可以完成以下工作:
int MyGetCharWidth(HFONT font, wchar_t wch)
{
HDC hDC = GetDC(NULL) ;
HGDIOBJ oldfont = SelectObject(hDC, font) ;
RECT rect ;
DrawText(hDC, &wch, 1, &rect, DT_CALCRECT|DT_NOPREFIX) ;
SelectObject(hDC, oldfont) ;
return rect.right - rect.left ;
}
顺便说一句,这没有意义:
HFONT font = CreateFont(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"Arial");
必须为某些参数指定非空值,例如:
CreateFont(fontsize, 0, 0, 0, FW_NORMAL, 0, 0, 0,
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH, "Arial");
我只需要单个字符边界框的宽度,没有任何间距。这些函数似乎需要HDC而不是HFONT,这是为什么?您必须在设备上下文中选择字体,然后调用您选择的任何函数来测量文本。原因是答案取决于要在其上显示文本的特定设备。显示设备的分辨率和功能等因素可能会影响答案。屏幕上的10点Arial“X”可能与我的屏幕或打印机上的大小略有不同。