Formatowanie tekstu i układ
DirectWrite udostępnia dwa interfejsy do formatowania tekstu: IDWriteTextFormat i IDWriteTextLayout. IDWriteTextFormat opisuje tylko format tekstu i jest używany w przypadkach, gdy cały ciąg ma być taki sam rozmiar czcionki, styl, waga itd. Z drugiej strony IDWriteTextLayout hermetyzuje zarówno ciąg tekstowy, jak i formatowanie dla określonych zakresów ciągu. W tym dokumencie opisano każdy interfejs i ich zastosowania. Aby uzyskać więcej informacji na temat tworzenia i metod tych interfejsów, zobacz IDWriteTextFormat i IDWriteTextLayout stron referencyjnych.
Ten dokument zawiera następujące części:
-
IDWriteTextFormat
- modyfikowanie IDWriteTextFormat
-
IDWriteTextLayout
- formatowanie zakresu tekstu
- opcje renderowania
IDWriteTextFormat
ObiektIDWriteTextFormatsłuży do:
- Opisz format całego ciągu podczas renderowania. Aby renderować ciąg z wieloma formatami, użyj obiektu IDWriteTextLayout.
- Określ domyślny format tekstu podczas tworzenia obiektu IDWriteTextLayout.
Aby utworzyć obiekt IDWriteTextFormat, należy użyć IDWriteFactory::CreateTextFormat metody i określić rodzinę czcionek, kolekcję czcionek, wagę czcionki, rozmiar czcionki (w dips), nazwę ustawień regionalnych.
Modyfikowanie formatu IDWriteTextFormat
Po utworzeniu interfejsu IDWriteTextFormat nie można zmienić niektórych wartości: rodziny czcionek, kolekcji, wagi i rozmiaru, a także nazwy ustawień regionalnych. Aby zmienić te wartości, należy utworzyć nowy obiekt IDWriteTextFormat.
IDWriteTextLayout umożliwia zmianę powyższych właściwości bez ponownego tworzenia niczego. IDWriteTextFormat umożliwia wprowadzanie zmian w formacie, które mają zastosowanie do całego tekstu, na przykład wyrównania tekstu. Jeśli chcesz zastosować formatowanie do określonych zakresów znaków, należy to zrobić przy użyciu IDWriteTextLayout.
IDWriteTextFormat udostępnia metody ustawiania wyrównania tekstu, kierunku przepływu, przyrostowego zatrzymania tabulatora, odstępów między wierszami, wyrównania akapitu, przycinania i zawijania wyrazów. Te właściwości można zmienić w dowolnym momencie po utworzeniu obiektu IDWriteTextFormat.
IDWriteTextLayout
Interfejs IDWriteTextLayout, w przeciwieństwie do IDWriteTextFormat, reprezentuje zarówno blok tekstu, jak i skojarzone formatowanie. IDWriteTextFormat reprezentuje informacje o początkowym formatowaniu. W poniższym przykładzie pokazano, jak utworzyć obiekt IDWriteTextLayout przy użyciu IDWriteFactory::CreateTextLayout.
// Create a text layout using the text format.
if (SUCCEEDED(hr))
{
RECT rect;
GetClientRect(hwnd_, &rect);
float width = rect.right / dpiScaleX_;
float height = rect.bottom / dpiScaleY_;
hr = pDWriteFactory_->CreateTextLayout(
wszText_, // The string to be laid out and formatted.
cTextLength_, // The length of the string.
pTextFormat_, // The text format to apply to the string (contains font information, etc).
width, // The width of the layout box.
height, // The height of the layout box.
&pTextLayout_ // The IDWriteTextLayout interface pointer.
);
}
Nie można zmienić tekstu w obiekcie IDWriteTextLayout po utworzeniu obiektu. Aby zmienić tekst, należy usunąć istniejący obiekt i utworzyć nowy obiekt IDWriteTextLayout.
Aby sformatować określone zakresy tekstu, można użyć IDWriteTextLayout. IDWriteTextLayout również udostępnia metody zmiany stylu i wagi czcionki oraz dodawanie funkcji czcionek OpenType i testowania trafień. Aby uzyskać więcej informacji i pełną listę metod, zobacz stronę referencyjną IDWriteTextLayout.
Formatowanie zakresu tekstu
IDWriteTextLayout udostępnia kilka metod formatowania zakresów tekstu. Każda z tych metod przyjmuje strukturę DWRITE_TEXT_RANGE jako parametr, aby określić położenie tekstu początkowego w ciągu i długość zakresu do sformatowania. W poniższym przykładzie pokazano, jak ustawić wagę czcionki zakresu tekstu na pogrubioną.
// Set the font weight to bold for the first 5 letters.
DWRITE_TEXT_RANGE textRange = {0, 5};
if (SUCCEEDED(hr))
{
hr = pTextLayout_->SetFontWeight(DWRITE_FONT_WEIGHT_BOLD, textRange);
}
Opcje renderowania
Tekst z formatowaniem opisanym tylko przez obiekt IDWriteTextFormat można renderować za pomocą Direct2D, jednak istnieje kilka innych opcji renderowania obiektu IDWriteTextLayout.
Ciąg opisany przez obiekt IDWriteTextLayout można renderować przy użyciu poniższych metod.
- renderowania przy użyciuDirect2D.
- Renderowanie przy użyciu niestandardowego modułu renderowania tekstu.
- renderuj na powierzchnię GDI.