Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Innehåller en kort självstudiekurs om hur du lägger till träfftestning i ett DirectWrite--program som visar text med hjälp av IDWriteTextLayout--gränssnittet.
Resultatet av den här självstudien är ett program som understryker det tecken som klickas på med den vänstra musknappen, som du ser i följande skärmbild.
Denna guide innehåller följande delar:
- steg 1: Skapa en textlayout.
- Steg 2: Lägg till en OnClick-metod.
- steg 3: Utför träfftestning.
- steg 4: Understrykning av klickad text.
- Steg 5: Hantera meddelandet WM_LBUTTONDOWN.
Steg 1: Skapa en textlayout.
Till att börja med behöver du ett program som använder ett IDWriteTextLayout--objekt. Om du redan har ett program som visar text med en textlayout går du till Steg 2.
Om du vill lägga till en textlayout måste du göra följande:
Deklarera en pekare till ett IDWriteTextLayout- gränssnitt som medlem i klassen.
IDWriteTextLayout* pTextLayout_;I slutet av metoden CreateDeviceIndependentResources skapar du ett IDWriteTextLayout--gränssnittsobjekt genom att anropa metoden 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. ); }Sedan måste du ändra anropet till metoden ID2D1RenderTarget::DrawText till metoden ID2D1RenderTarget::DrawTextLayout enligt följande kod.
pRT_->DrawTextLayout( origin, pTextLayout_, pBlackBrush_ );
Steg 2: Lägg till en OnClick-metod.
Lägg nu till en metod i klassen som ska använda funktionen för träfftestning i textlayouten.
Deklarera en OnClick--metod i klasshuvudfilen.
void OnClick( UINT x, UINT y );Definiera en OnClick--metod i klassimplementeringsfilen.
void DemoApp::OnClick(UINT x, UINT y) { }
Steg 3: Utför kollisionstest.
För att avgöra var användaren har klickat på textlayouten använder vi metoden IDWriteTextLayout::HitTestPoint.
Lägg till följande i metoden OnClick som du definierade i steg 2.
Deklarera de variabler som vi skickar som parametrar till metoden.
DWRITE_HIT_TEST_METRICS hitTestMetrics; BOOL isTrailingHit; BOOL isInside;Metoden HitTestPoint matar ut följande parametrar.
Variabel Beskrivning hitTestMetrics Geometrin omsluter helt träfftestplatsen. ärInuti Anger om träfftestplatsen finns i textsträngen eller inte. När false returneras positionen närmast textens kant. isTrailingHit Anger om träfftestplatsen är på den inledande eller avslutande sidan av tecknet. Anropa metoden HitTestPoint för objektet IDWriteTextLayout.
pTextLayout_->HitTestPoint( (FLOAT)x, (FLOAT)y, &isTrailingHit, &isInside, &hitTestMetrics );Koden i det här exemplet skickar variablerna x och y för positionen utan någon ändring. Detta kan göras i det här exemplet eftersom textlayouten har samma storlek som fönstret och kommer från fönstrets övre vänstra hörn. Om så inte var fallet skulle du behöva fastställa koordinaterna i förhållande till textlayoutens ursprung.
Steg 4: Understrykning av klickad text.
Lägg till följande i OnClick- som du definierade i Steg 2, efter att du har anropat metoden HitTestPoint.
if (isInside == TRUE)
{
BOOL underline;
pTextLayout_->GetUnderline(hitTestMetrics.textPosition, &underline);
DWRITE_TEXT_RANGE textRange = {hitTestMetrics.textPosition, 1};
pTextLayout_->SetUnderline(!underline, textRange);
}
Den här koden gör följande.
Kontrollerar om träfftestpunkten fanns i texten med hjälp av variabeln isInside.
textPosition medlemmen i hitTestMetrics strukturen innehåller det nollbaserade indexet för tecknet som har klickats på.
Hämtar understrykningen för det här tecknet genom att skicka det här värdet till metoden IDWriteTextLayout::GetUnderline.
Deklarerar en DWRITE_TEXT_RANGE variabel med startpositionen inställd på hitTestMetrics.textPosition och en längd på 1.
Växlar understrykningen med hjälp av metoden IDWriteTextLayout::SetUnderline.
När du har angett understrykningen ritar du om texten genom att anropa metoden DrawD2DContent i klassen.
DrawD2DContent();
Steg 5: Hantera meddelandet WM_LBUTTONDOWN.
Lägg slutligen till WM_LBUTTONDOWN-meddelandet i meddelandehanteraren för ditt program och anropa metoden OnClick i klassen.
case WM_LBUTTONDOWN:
{
int x = GET_X_LPARAM(lParam);
int y = GET_Y_LPARAM(lParam);
pDemoApp->OnClick(x, y);
}
break;
GET_X_LPARAM och GET_X_LPARAM makron deklareras i huvudfilen windowsx.h. De hämtar enkelt x- och y-positionen för musklickningen.