2015-03-31 118 views
0

我如何计算WinRT中文本的宽度和高度。我试图通过将我的文本放入TextBlock并设置属性是fontsize,fontfamily等。这将计算高度和宽度。但我无法获得表演。有更好的性能来计算宽度和高度的其他方法吗?请提出任何想法?如何计算WinRT中文本的宽度和高度?

+0

你是指屏幕上的字符的高度或什么?你能澄清你的预期结果吗? :) – CalebB 2015-03-31 14:05:50

+0

是的,我需要计算整个字符的宽度和高度。 – 2015-03-31 14:18:17

回答

0

由于在WinRT中没有GDI,GDI +和FormattedText类,所以似乎DirectX是唯一的出路。你可以使用IDWriteTextLayout界面来做到这一点。

Size TextMeasure::Measure(String^ text, String^ fontFamily, float fontSize, Size layoutSize) { 
    // Create DWrite Factory 
    IDWriteFactory *pDWriteFactory = NULL; 
    HRESULT hr = DWriteCreateFactory(
     DWRITE_FACTORY_TYPE::DWRITE_FACTORY_TYPE_SHARED, 
     __uuidof(IDWriteFactory), 
     reinterpret_cast<IUnknown**>(&pDWriteFactory) 
     ); 
    if (FAILED(hr)) { 
     throw ref new Exception(hr, "DWriteCreateFactory failed."); 
    } 

    // Create TextFormat 
    IDWriteTextFormat *pDWriteTextFormat = NULL; 
    hr = pDWriteFactory->CreateTextFormat(
     fontFamily->Begin(), 
     NULL, 
     DWRITE_FONT_WEIGHT::DWRITE_FONT_WEIGHT_NORMAL, 
     DWRITE_FONT_STYLE::DWRITE_FONT_STYLE_NORMAL, 
     DWRITE_FONT_STRETCH::DWRITE_FONT_STRETCH_NORMAL, 
     fontSize, 
     L"en-US", 
     &pDWriteTextFormat); 

    if (FAILED(hr)) { 
     pDWriteFactory->Release(); 
     throw ref new Exception(hr, "CreateTextFormat failed."); 
    } 

    // Create TextLayout 
    IDWriteTextLayout *pDWriteTextLayout = NULL; 
    hr = pDWriteFactory->CreateTextLayout(
     text->Begin(), 
     text->Length(), 
     pDWriteTextFormat, 
     layoutSize.Width, 
     layoutSize.Height, 
     &pDWriteTextLayout); 

    if (FAILED(hr)) { 
     pDWriteTextFormat->Release(); 
     pDWriteFactory->Release(); 
     throw ref new Exception(hr, "CreateTextLayout failed."); 
    } 

    // Get Text Metrics 
    DWRITE_TEXT_METRICS textMetrics; 
    hr = pDWriteTextLayout->GetMetrics(&textMetrics); 

    // Release referances 
    pDWriteTextFormat->Release(); 
    pDWriteTextLayout->Release(); 
    pDWriteFactory->Release(); 

    if (FAILED(hr)) { 
     throw ref new Exception(hr, "GetMetrics failed."); 
    } 
    return *ref new Size(textMetrics.width, textMetrics.height); 
} 

请注意,为了在C#/ VB/JavaScript中使用代码,您可以将代码放在运行时组件中。