任何人都能解释一下吗?
以下代码:
// - change font size to specified point(pt) size.
// - returns false if there is an error, or true otherwise.
bool GraphicsDirect2D::TextSetFontSize(int size)
{
if (size <= 0)
{
assert(0 && "Error: Invalid size parameter.");
return false;
}
// if size has not changed, return
float currentFontSizeDIP = m_pDWTextFormat->GetFontSize();
float currentFontSizePoints = ConvertDIPToPointSize(currentFontSizeDIP);
if (currentFontSizePoints == size)
return true;
// otherwise, create new object for new text size
IDWriteTextFormat *pNewTextFormat = NULL;
if (FAILED(m_pDWFactory->CreateTextFormat(
StringToWString(m_textCurrentSettings.strFont).c_str(),
NULL,
DWRITE_FONT_WEIGHT_REGULAR,
DWRITE_FONT_STYLE_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
ConvertPointSizeToDIP(size),
L"en-us",
&pNewTextFormat)))
{
assert(0 && "Error.");
return false;
}
{
IDWriteTextLayout *m_pDWTextLayout = NULL;
DWRITE_TEXT_METRICS tm;
if (FAILED(m_pDWFactory->CreateTextLayout(
L"Arial",
0,
pNewTextFormat,
100,
100,
&m_pDWTextLayout)))
{
Destroy();
assert(0 && "Error.");
return false;
}
if (FAILED(m_pDWTextLayout->GetMetrics(&tm)))
{
assert(0 && "Error.");
}
m_fontHeight = tm.height;
m_pDWTextLayout->Release();
}
// release the old object
if (m_pDWTextFormat)
{
m_pDWTextFormat->Release();
m_pDWTextFormat = NULL;
}
// and point to the new one
m_pDWTextFormat = pNewTextFormat;
m_textCurrentSettings.size = size;
return true;
}
这个函数来自我用来为Direct2D(和DirectWrite for text)提供图形界面的类。该函数将其正在存储的字体替换为新的大小,并更新大小变量以供参考。
问题是如果我将16传递给函数(例如),当使用Direct2D创建时,我给出的字体比点大小16更大。 (使用WinGDI,它在屏幕上生成我的参考大小为16。)Win32函数是我的基准,而directD版本创建的字体比Win32代码更大。
我已经根据我的需要将点大小输入转换为此函数,以便为Direct2D CreateTextFormat()函数提供DIP值。然后我创建一个带有0长度字符串的布局,以获得创建的默认字体的高度。这与我要求的开头不同......
我找不到任何足够详细描述此内容的文档来了解这一点。功能和结构上的每个站点都只是哄骗windows网站所说的结构内容。 (Grrrr !!)它实际上没有说明文本度量函数输出是否在DIP中,我假设它是但是看不到从另一种格式的明显转换回到16!请帮助:)
由于