Comment effectuer des tests d’accès sur une disposition de texte
Fournit un court tutoriel sur l’ajout de tests d’accès à une application DirectWrite qui affiche du texte à l’aide de l’interface IDWriteTextLayout.
Le résultat de ce tutoriel est une application qui souligne le caractère sur lequel est cliqué le bouton gauche de la souris, comme illustré dans la capture d’écran suivante.
Voici comment contenir les parties suivantes :
- Étape 1 : Créer une disposition de texte.
- Étape 2 : Ajouter une méthode OnClick.
- Étape 3 : Effectuer un test d’accès.
- Étape 4 : Soulignez le texte cliqué.
- Étape 5 : Gérer le message WM_LBUTTONDOWN.
Étape 1 : Créer une disposition de texte.
Pour commencer, vous aurez besoin d’une application qui utilise un objet IDWriteTextLayout . Si vous avez déjà une application qui affiche du texte avec une disposition de texte, passez à l’étape 2.
Pour ajouter une disposition de texte, vous devez effectuer les opérations suivantes :
Déclarez un pointeur vers une interface IDWriteTextLayout en tant que membre de la classe.
IDWriteTextLayout* pTextLayout_;
À la fin de la méthode CreateDeviceIndependentResources, créez un objet d’interface IDWriteTextLayout en appelant la méthode 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. ); }
Ensuite, vous devez remplacer l’appel à la méthode ID2D1RenderTarget::D rawText par ID2D1RenderTarget::D rawTextLayout , comme indiqué dans le code suivant.
pRT_->DrawTextLayout( origin, pTextLayout_, pBlackBrush_ );
Étape 2 : Ajouter une méthode OnClick.
Ajoutez maintenant une méthode à la classe qui utilisera la fonctionnalité de test d’accès de la disposition de texte.
Déclarez une méthode OnClick dans le fichier d’en-tête de classe.
void OnClick( UINT x, UINT y );
Définissez une méthode OnClick dans le fichier d’implémentation de classe.
void DemoApp::OnClick(UINT x, UINT y) { }
Étape 3 : Effectuer un test d’accès.
Pour déterminer où l’utilisateur a cliqué sur la disposition de texte, nous allons utiliser la méthode IDWriteTextLayout::HitTestPoint .
Ajoutez ce qui suit à la méthode OnClick que vous avez définie à l’étape 2.
Déclarez les variables que nous passerons en tant que paramètres à la méthode.
DWRITE_HIT_TEST_METRICS hitTestMetrics; BOOL isTrailingHit; BOOL isInside;
La méthode HitTestPoint génère les paramètres suivants.
Variable Description hitTestMetrics Géométrie englobant entièrement l’emplacement de test d’accès. isInside Indique si l’emplacement du test d’accès se trouve à l’intérieur de la chaîne de texte ou non. Lorsque la valeur est FALSE, la position la plus proche du bord du texte est retournée. isTrailingHit Indique si l’emplacement du test d’accès se trouve au début ou à la fin du caractère. Appelez la méthode HitTestPoint de l’objet IDWriteTextLayout .
pTextLayout_->HitTestPoint( (FLOAT)x, (FLOAT)y, &isTrailingHit, &isInside, &hitTestMetrics );
Le code de cet exemple passe les variables x et y pour la position sans aucune modification. Cela peut être effectué dans cet exemple, car la disposition de texte est de la même taille que la fenêtre et provient du coin supérieur gauche de la fenêtre. Si ce n’était pas le cas, vous devrez déterminer les coordonnées par rapport à l’origine de la disposition du texte.
Étape 4 : Soulignez le texte cliqué.
Ajoutez ce qui suit à l’onClick que vous avez défini à l’étape 2, après l’appel à la méthode HitTestPoint .
if (isInside == TRUE)
{
BOOL underline;
pTextLayout_->GetUnderline(hitTestMetrics.textPosition, &underline);
DWRITE_TEXT_RANGE textRange = {hitTestMetrics.textPosition, 1};
pTextLayout_->SetUnderline(!underline, textRange);
}
Ce code effectue les opérations suivantes.
Vérifie si le point de test d’accès se trouvait à l’intérieur du texte à l’aide de la variable isInside .
Le membre textPosition de la structure hitTestMetrics contient l’index de base zéro du caractère cliqué.
Obtient le soulignement de ce caractère en passant cette valeur à la méthode IDWriteTextLayout::GetUnderline .
Déclare une variable DWRITE_TEXT_RANGE dont la position de début est définie sur hitTestMetrics.textPosition et une longueur de 1.
Bascule le soulignement à l’aide de la méthode IDWriteTextLayout::SetUnderline .
Après avoir défini le soulignement, redessinez le texte en appelant la méthode DrawD2DContent de la classe .
DrawD2DContent();
Étape 5 : Gérer le message WM_LBUTTONDOWN.
Enfin, ajoutez le message WM_LBUTTONDOWN au gestionnaire de messages de votre application et appelez la méthode OnClick de la classe .
case WM_LBUTTONDOWN:
{
int x = GET_X_LPARAM(lParam);
int y = GET_Y_LPARAM(lParam);
pDemoApp->OnClick(x, y);
}
break;
les macros GET_X_LPARAM et GET_X_LPARAM sont déclarées dans le fichier d’en-tête windowsx.h. Ils récupèrent facilement les positions x et y du clic de la souris.