次の方法で共有


表示属性の指定

Text Services Framework (TSF) を使用すると、テキスト サービスでテキストの表示属性を提供できます。 これにより、追加の視覚的フィードバックをユーザーに提供できます。 たとえば、スペル チェック テキスト サービスでは、スペル ミスのある単語を赤い下線で強調表示できます。 指定された表示属性は 、TF_DISPLAYATTRIBUTE 構造によって定義され、テキストの色、テキストの背景色、下線のスタイル、下線の色、下線の太さが含まれます。

この表示属性情報を使用するクライアントは、ほとんどの場合、アプリケーションですが、テキスト サービスを含めることもできます。 TSF マネージャーは、表示属性プロバイダーとクライアントの間を仲介し、特定の表示属性の表示属性プロバイダーを追跡します。

表示属性を指定するには、テキスト サービスで次の操作を行う必要があります。

  1. 最初のパラメーターのテキスト サービスのクラス識別子を使用して ITfCategoryMgr::RegisterCategory を呼び出し、2 番目のパラメーターにGUID_TFCAT_DISPLAYATTRIBUTEPROVIDERし、3 番目のパラメーターに対してテキスト サービスのクラス識別子をもう一度呼び出して、テキスト サービスを表示属性プロバイダーとして登録します。
  2. ITfDisplayAttributeProvider を実装し、クラス ファクトリから使用できるようにします。
  3. IEnumTfDisplayAttributeInfo を実装し、ITfDisplayAttributeProvider::EnumDisplayAttributeInfo から使用できるようにします。
  4. テキスト サービスが提供する表示属性の種類ごとに ITfDisplayAttributeInfo オブジェクトを実装します。

表示属性の適用

テキスト サービスは、表示属性をテキストの範囲に適用する必要があります。 テキスト サービスは、読み取り/書き込み編集セッション中にのみプロパティ値を変更できます。

これが読み取り/書き込み編集セッション内にあると仮定すると、表示属性は次のように適用されます。

  1. 表示属性が適用されるテキストをカバーする ITfRange オブジェクトを取得します。
  2. GUID_PROP_ATTRIBUTEを使用して ITfContext::GetProperty を呼び出して、テキスト属性の ITfProperty オブジェクトを 取得します。
  3. ITfCategoryMgr::RegisterGUID を呼び出して、テキスト サービス定義の表示属性識別子 GUID から TfGuidAtom を作成します。
  4. VARIANT 変数を初期化してVT_I4し、前の手順で作成した TfGuidAtomlVal メンバーを設定します。
  5. 前の手順で初期化した読み取り/書き込み編集 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 オブジェクトを取得します。

  1. クライアントは、表示属性の GUID 識別子を使用して ITfDisplayAttributeMgr::GetDisplayAttributeInfo を呼び出します。 クライアントが ITfDisplayAttributeMgr::GetDisplayAttributeInfo を初めて呼び出すと、TSF マネージャーは、 ITfCategoryMgr::RegisterCategory に最初のパラメーターとして渡されたクラス識別子を使用して CoCreateInstance を呼び出すことによって、表示属性プロバイダーのインスタンスを作成します。 ITfDisplayAttributeMgr::GetDisplayAttributeInfo の後続の呼び出しでは、表示属性プロバイダー オブジェクトが再利用されます。

    その後、TSF マネージャーは、表示属性 GUID を使用して ITfDisplayAttributeProvider::GetDisplayAttributeInfo を呼び出して、ITfDisplayAttributeInfo オブジェクトを取得します。

    その後、TSF マネージャーは ITfDisplayAttributeInfo オブジェクトをクライアントに渡します。

  2. クライアントは ITfDisplayAttributeMgr::EnumDisplayAttributeInfo を呼び出して、すべての表示属性プロバイダーによって提供されるすべての表示属性を含む IEnumTfDisplayAttributeInfo オブジェクトを取得します。 TSF マネージャーは、各表示属性プロバイダーを列挙し、3 番目のパラメーターとして ITfCategoryMgr::RegisterCategory に渡されるクラス識別子を使用して CoCreateInstance を呼び出して、各プロバイダーのインスタンスを作成します。

    その後、TSF マネージャーは各プロバイダーの ITfDisplayAttributeProvider::EnumDisplayAttributeInfo を 呼び出して、プロバイダーによって提供されるすべての表示属性を含む IEnumTfDisplayAttributeInfo オブジェクトを取得します。

    その後、TSF マネージャーはプロバイダーの IEnumTfDisplayAttributeInfo::Next メソッドを呼び出し、プロバイダーの列挙が終了するまで、マネージャー自身の列挙子に取得された各 ITfDisplayAttributeInfo オブジェクトを追加します。

    すべての表示属性プロバイダーのすべての ITfDisplayAttributeInfo オブジェクトが TSF マネージャーの列挙子に追加されると、マネージャーはその列挙子をクライアントに返します。 次に、クライアントは IEnumTfDisplayAttributeInfo::Next を 1 回以上呼び出して 、ITfDisplayAttributeInfo オブジェクトを 取得します。

TF_DISPLAYATTRIBUTE

ITfCategoryMgr::RegisterCategory

ITfDisplayAttributeProvider

IEnumTfDisplayAttributeInfo

ITfDisplayAttributeProvider::EnumDisplayAttributeInfo

ITfDisplayAttributeInfo

ITfRange

ITfProperty

ITfContext::GetProperty

TfGuidAtom

ITfCategoryMgr::RegisterGUID

ITfProperty::SetValue

ITfDisplayAttributeMgr::GetDisplayAttributeInfo

ITfDisplayAttributeProvider::GetDisplayAttributeInfo

ITfDisplayAttributeMgr::EnumDisplayAttributeInfo

IEnumTfDisplayAttributeInfo

ITfDisplayAttributeProvider::EnumDisplayAttributeInfo

IEnumTfDisplayAttributeInfo::Next