Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我从DirectWrite字体文本度量中获得的字体高度与作为高度参数请求的不同_C++_Text_Height_Metric_Directwrite - Fatal编程技术网

C++ 我从DirectWrite字体文本度量中获得的字体高度与作为高度参数请求的不同

C++ 我从DirectWrite字体文本度量中获得的字体高度与作为高度参数请求的不同,c++,text,height,metric,directwrite,C++,Text,Height,Metric,Directwrite,有人能解释一下吗 代码如下: // - 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 parame

有人能解释一下吗

代码如下:

// - 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;
}
/-将字体大小更改为指定点(pt)大小。
//-如果存在错误,则返回false,否则返回true。
bool GraphicsDirect2D::TextSetFontSize(整数大小)
{
if(size GetFontSize();
float currentFontSizePoints=ConvertDIPToPointSize(currentFontSizeDIP);
如果(currentFontSizePoints==大小)
返回true;
//否则,为新文本大小创建新对象
IDWriteTextFormat*pNewTextFormat=NULL;
如果(失败)(m_pDWFactory->CreateTextFormat(
StringToString(m_textCurrentSettings.strFont).c_str(),
无效的
D书写字体重量规则,
DWRITE\u FONT\u STYLE\u NORMAL,
DWRITE\u FONT\u STRETCH\u NORMAL,
ConvertPointSizeToDIP(尺寸),
L“恩我们”,
&pNewTextFormat)))
{
断言(0&“错误”);
返回false;
}
{
IDWriteTextLayout*m_pDWTextLayout=NULL;
DWRITE_TEXT_METRICS tm;
如果(失败)(m_pDWFactory->CreateTextLayout(
L“Arial”,
0,
pNewTextFormat,
100,
100,
&m_pDWTextLayout)))
{
破坏();
断言(0&“错误”);
返回false;
}
if(失败(m_pDWTextLayout->GetMetrics(&tm)))
{
断言(0&“错误”);
}
m_fontHeight=tm高度;
m_pDWTextLayout->Release();
}       
//释放旧对象
if(m_pDWTextFormat)
{
m_pDWTextFormat->Release();
m_pDWTextFormat=NULL;
}
//并指向新的一个
m_pDWTextFormat=pNewTextFormat;
m_textCurrentSettings.size=大小;
返回true;
}
此函数来自我用来为Direct2D(和DirectWrite for text)提供图形界面的类。此函数将存储为“当前”字体的字体替换为新大小的字体,并更新大小变量以供参考

问题是,如果我将16传递给函数(例如),当使用Direct2D创建时,给我的字体大于点大小16。(使用WinGDI在屏幕上生成我的参考大小16。)Win32函数是我的基准,directD版本创建的字体大于Win32代码

我已经按照我认为需要的方式将点大小输入转换为该函数,以向Direct2D CreateTextFormat()函数提供DIP值。然后我创建了一个长度为0的字符串布局,以获得创建的默认字体的高度。这与我要求的开始不同

我找不到任何足够详细的文档来描述这一点。每个关于函数和结构的网站都只是鹦鹉学舌地模仿windows网站关于结构内容的内容。(Grrrr!!)它实际上没有说明文本度量函数输出是否处于DIP状态,我假设它处于DIP状态,但看不到从另一种格式到16的明显转换!!请帮助:)


谢谢

为什么您希望版面规格等于您正在设置的字体大小?这些也不必匹配,您不需要在CreateTextFormat中指定字体高度,而是emsize。关于DWRITE_TEXT_度量,msdn明确表示它使用了DIPs.sure。我认为大多数布局值都是DIP,因为特定的DPI值是一个运行时属性。Bunglehad,你能链接到MSDN上的哪个位置吗?它说你应该提供emsize?从这个定义来看,它本身是一个不断发展的定义,从最初用于排版,到现在不同于数字字体。在GDI中,你传递升序+下降值,也就是你想要的字体度量的tmHeight,然后你得到它。在directWrite中,他们要求的显然是其他东西,但没有告诉人们-MSDN上的IDWriteFactory::CreateTextFormat()规范页面只是说以DIP单位传递“字体的逻辑大小”,所以我不知道这到底是什么。抱歉编辑了我的评论。谢谢,我会读的。。因此,基本上在我的代码中,我要求使用21.33的DIP大小字体(emHeight)。但是GetMetrics函数的“高度”或大小为24.531,所以我有点不知所措,lolYes,没有执行GDI使用上升+下降高度进行的缩放。所以你不应该比较GDI字体大小和DirectWrite字体大小。基本上,emsize用于缩放字体提供的设计指标。如果将emsize设置为DWRITE\u FONT\u METRICS.designunits prem,您将获得完全以设计单位表示的字体度量。