2017-01-06 21 views
1

CreateTextFormatメソッドでは、fontFamilyNameパラメータが必要です。デフォルトのUIフォントを使用するIDWriteTextFormatを作成するにはどうすればよいですか?DirectWriteでデフォルトのUIフォントでテキストを描画する方法は?

+0

あなたは、 "デフォルトのUIフォント" や、アプリケーションで使用されるフォントとシステムフォントを意味していますか? –

+0

システムフォント(ネイティブウィンドウアプリケーションのUI要素に使用されるフォント) – eyelash

+3

SystemParametersInfo(SPI_GETNONCLIENTMETRICS)を呼び出し、そこで返されるメッセージボックスフォントを使用します。 –

答えて

2

ここに記載されているコードはすべてチェックなしで行われています(ここではあまりにも多くのメソッドがHRESULTを返すため、このサンプルを吹き飛ばします)。

HDC hdc = BeginPaint(...); //Creates a device context 
SelectObject(hdc, hFont); 
//Your font is now set for the current device context 
//do something 

DeleteObject(hFont); //Don't forget to do this at the end! 

ビット:今、これを使用する塗料に

(これは別のstackoverflowの質問からです!)

NONCLIENTMETRICS ncm; 
ncm.cbSize = sizeof(ncm); 
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0); 
HFONT hFont = CreateFontIndirect(&(ncm.lfMessageFont)); // 

:あなたがこれを使用する必要があり、システム全体のフォントを取得するための

thisから変更されました!

このソリューションは実際には生で、私の意見では醜いです。

代替ソリューションはIDWriteFont(醜い見えるが、結構です)を得るか:

//just the same as above except the hfont, instead use 
NONCLIENTMETRICS ncm; 

ncm.cbSize = sizeof(ncm); 
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0); 

IDWriteFactory *dwriteFactory_; 
DWriteCreateFactory(
    DWRITE_FACTORY_TYPE_SHARED, 
    __uuidof(IDWriteFactory), 
    reinterpret_cast<IUnknown**>(&dwriteFactory_) 
); 

IDWriteGdiInterop* gdiInterop = NULL; 
dwriteFactory_->GetGdiInterop(&gdiInterop); 

IDWriteFont* sys_font = nullptr; 
gdiInterop->CreateFontFromLOGFONT(&ncm.lfMessageFont, &sys_font); //Now we have it! 

//The text format can now be aquired like this 
//We need the font family of our font 
IDWriteFontFamily* family = nullptr; 
sys_font->GetFontFamily(&family); 

//Now we have to get the "localized" name of our family 
IDWriteLocalizedStrings* font_family_name = nullptr; 
family->GetFamilyNames(&font_family_name); 
UINT32 index = 0; 
UINT32 length = 0; 
BOOL exists = false; 
font_family_name->FindLocaleName(L"en-us", &index, &exists); 
font_family_name->GetStringLength(index, &length); 
wchar_t* name = new wchar_t[length + 1]; 
font_family_name->GetString(index, name, length + 1); 
wprintf(L"%s\n", name); 

//Some user defined stuff 
DWRITE_FONT_WEIGHT font_weight = DWRITE_FONT_WEIGHT_BLACK; 
DWRITE_FONT_STYLE font_style = DWRITE_FONT_STYLE_ITALIC; 
DWRITE_FONT_STRETCH font_stretch = DWRITE_FONT_STRETCH_EXPANDED; 

IDWriteTextFormat* text_format = nullptr; 
dwriteFactory_->CreateTextFormat(name, nullptr, font_weight, font_style, font_stretch, 10.0, L"en-us", &text_format); 

でもチェックせずに、コードは何の問題もなく自分のコンピュータ上で動作し、私の最初のソリューション(Windowsの10と同じ結果を与えます、フォントファミリ名はSegoe UI)です。

出典: General Microsoft DirectWrite API documentation

CreateIndirectFont Documentation

How to enumerate font families, Microsoft documentation

+1

これは質問に答えません。 DirectWriteではなくGDIを使用します。 – andlabs

+0

答えの前半はまだ正しいですが、なぜOPがそれを認識していないのだろうと思っています... DirectWriteでこれを使うのはちょっと複雑です。 – andlabs

+0

ええ、私も見ました。次に、私は最後のハーフトーンを修正する必要があります。 –

関連する問題