表示属性の指定
Text Services Framework (TSF) を使用すると、テキスト サービスでテキストの表示属性を提供できます。 これにより、追加の視覚的フィードバックをユーザーに提供できます。 たとえば、スペル チェック テキスト サービスでは、スペル ミスのある単語を赤い下線で強調表示できます。 指定された表示属性は 、TF_DISPLAYATTRIBUTE 構造によって定義され、テキストの色、テキストの背景色、下線のスタイル、下線の色、下線の太さが含まれます。
この表示属性情報を使用するクライアントは、ほとんどの場合、アプリケーションですが、テキスト サービスを含めることもできます。 TSF マネージャーは、表示属性プロバイダーとクライアントの間を仲介し、特定の表示属性の表示属性プロバイダーを追跡します。
表示属性を指定するには、テキスト サービスで次の操作を行う必要があります。
- 最初のパラメーターのテキスト サービスのクラス識別子を使用して ITfCategoryMgr::RegisterCategory を呼び出し、2 番目のパラメーターにGUID_TFCAT_DISPLAYATTRIBUTEPROVIDERし、3 番目のパラメーターに対してテキスト サービスのクラス識別子をもう一度呼び出して、テキスト サービスを表示属性プロバイダーとして登録します。
- ITfDisplayAttributeProvider を実装し、クラス ファクトリから使用できるようにします。
- IEnumTfDisplayAttributeInfo を実装し、ITfDisplayAttributeProvider::EnumDisplayAttributeInfo から使用できるようにします。
- テキスト サービスが提供する表示属性の種類ごとに ITfDisplayAttributeInfo オブジェクトを実装します。
表示属性の適用
テキスト サービスは、表示属性をテキストの範囲に適用する必要があります。 テキスト サービスは、読み取り/書き込み編集セッション中にのみプロパティ値を変更できます。
これが読み取り/書き込み編集セッション内にあると仮定すると、表示属性は次のように適用されます。
- 表示属性が適用されるテキストをカバーする ITfRange オブジェクトを取得します。
- GUID_PROP_ATTRIBUTEを使用して ITfContext::GetProperty を呼び出して、テキスト属性の ITfProperty オブジェクトを 取得します。
- ITfCategoryMgr::RegisterGUID を呼び出して、テキスト サービス定義の表示属性識別子 GUID から TfGuidAtom を作成します。
- VARIANT 変数を初期化してVT_I4し、前の手順で作成した TfGuidAtom に lVal メンバーを設定します。
- 前の手順で初期化した読み取り/書き込み編集 Cookie、範囲、VARIANT を使用して ITfProperty::SetValue を呼び出して、範囲に表示属性を適用します。
STDAPI CEditSession::DoEditSession(TfEditCookie ec)
{
HRESULT hr;
ITfCategoryMgr *pCategoryMgr;
TfGuidAtom gaDisplayAttribute = TF_INVALID_GUIDATOM;
//Create a TfGuidAtom for the display attribute identifier.
hr = CoCreateInstance(CLSID_TF_CategoryMgr,
NULL,
CLSCTX_INPROC_SERVER,
IID_ITfCategoryMgr,
(void**)&pCategoryMgr);
if(SUCCEEDED(hr))
{
hr = pCategoryMgr->RegisterGUID(guidDisplayAttribute, &gaDisplayAttribute);
pCategoryMgr->Release();
}
//Apply the display attribute to the selected text.
if(TF_INVALID_GUIDATOM != gaDisplayAttribute)
{
TF_SELECTION tfSel;
ULONG cFetched;
//Get the selection.
hr = m_pContext->GetSelection(ec, TF_DEFAULT_SELECTION, 1, &tfSel, &cFetched);
if(SUCCEEDED(hr) && cFetched)
{
ITfProperty *pDisplayAttributeProperty;
//Get the display attribute property.
hr = m_pContext->GetProperty(GUID_PROP_ATTRIBUTE, &pDisplayAttributeProperty);
if(SUCCEEDED(hr))
{
VARIANT var;
VariantInit(&var);
//All display attributes are TfGuidAtoms and TfGuidAtoms are VT_I4.
var.vt = VT_I4;
var.lVal = gaDisplayAttribute;
//Set the display attribute value over the range.
hr = pDisplayAttributeProperty->SetValue(ec, tfSel.range, &var);
pDisplayAttributeProperty->Release();
}
tfSel.range->Release();
}
}
return S_OK;
}
表示属性情報オブジェクトの指定
クライアントは、2 つの方法のいずれかで ITfDisplayAttributeInfo オブジェクトを取得します。
クライアントは、表示属性の GUID 識別子を使用して ITfDisplayAttributeMgr::GetDisplayAttributeInfo を呼び出します。 クライアントが ITfDisplayAttributeMgr::GetDisplayAttributeInfo を初めて呼び出すと、TSF マネージャーは、 ITfCategoryMgr::RegisterCategory に最初のパラメーターとして渡されたクラス識別子を使用して CoCreateInstance を呼び出すことによって、表示属性プロバイダーのインスタンスを作成します。 ITfDisplayAttributeMgr::GetDisplayAttributeInfo の後続の呼び出しでは、表示属性プロバイダー オブジェクトが再利用されます。
その後、TSF マネージャーは、表示属性 GUID を使用して ITfDisplayAttributeProvider::GetDisplayAttributeInfo を呼び出して、ITfDisplayAttributeInfo オブジェクトを取得します。
その後、TSF マネージャーは ITfDisplayAttributeInfo オブジェクトをクライアントに渡します。
クライアントは ITfDisplayAttributeMgr::EnumDisplayAttributeInfo を呼び出して、すべての表示属性プロバイダーによって提供されるすべての表示属性を含む IEnumTfDisplayAttributeInfo オブジェクトを取得します。 TSF マネージャーは、各表示属性プロバイダーを列挙し、3 番目のパラメーターとして ITfCategoryMgr::RegisterCategory に渡されるクラス識別子を使用して CoCreateInstance を呼び出して、各プロバイダーのインスタンスを作成します。
その後、TSF マネージャーは各プロバイダーの ITfDisplayAttributeProvider::EnumDisplayAttributeInfo を 呼び出して、プロバイダーによって提供されるすべての表示属性を含む IEnumTfDisplayAttributeInfo オブジェクトを取得します。
その後、TSF マネージャーはプロバイダーの IEnumTfDisplayAttributeInfo::Next メソッドを呼び出し、プロバイダーの列挙が終了するまで、マネージャー自身の列挙子に取得された各 ITfDisplayAttributeInfo オブジェクトを追加します。
すべての表示属性プロバイダーのすべての ITfDisplayAttributeInfo オブジェクトが TSF マネージャーの列挙子に追加されると、マネージャーはその列挙子をクライアントに返します。 次に、クライアントは IEnumTfDisplayAttributeInfo::Next を 1 回以上呼び出して 、ITfDisplayAttributeInfo オブジェクトを 取得します。
関連トピック
-
IEnumTfDisplayAttributeInfo
-
ITfDisplayAttributeProvider::EnumDisplayAttributeInfo