다음을 통해 공유


표시 특성 제공

TSF(Text Services Framework)를 사용하면 텍스트 서비스에서 텍스트에 대한 표시 특성을 제공할 수 있습니다. 이렇게 하면 사용자에게 추가 시각적 피드백을 제공할 수 있습니다. 예를 들어 맞춤법 검사기 텍스트 서비스는 맞춤법이 틀린 단어를 빨간색 밑줄로 강조 표시할 수 있습니다. 제공된 표시 특성은 TF_DISPLAYATTRIBUTE 구조에 의해 정의되며 텍스트 색, 텍스트 배경색, 밑줄 스타일, 밑줄 색 및 밑줄 두께를 포함합니다.

이 표시 특성 정보를 사용하는 클라이언트는 대부분 애플리케이션이지만 텍스트 서비스를 포함할 수도 있습니다. TSF 관리자는 표시 특성 공급자와 클라이언트 간에 중재하고 특정 표시 특성의 표시 특성 공급자를 추적합니다.

표시 특성을 제공하려면 텍스트 서비스에서 다음을 수행해야 합니다.

  1. 첫 번째 매개 변수에 대한 텍스트 서비스의 클래스 식별자를 사용하여 ITfCategoryMgr::RegisterCategory 를 호출하여 텍스트 서비스를 표시 특성 공급자로 등록합니다. 두 번째 매개 변수에 대한 GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER 세 번째 매개 변수에 대해 텍스트 서비스의 클래스 식별자를 다시 지정합니다.
  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 lVal 멤버를 이전 단계에서 만든 TfGuidAtom 으로 설정합니다.
  5. 이전 단계에서 초기화된 읽기/쓰기 편집 쿠키, 범위 및 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;
}

표시 특성 정보 개체 제공

클라이언트는 두 가지 방법 중 하나로 ITfDisplayAttributeInfo 개체를 가져옵니다.

  1. 클라이언트는 표시 특성의 GUID 식별자를 사용하여 ITfDisplayAttributeMgr::GetDisplayAttributeInfo를 호출합니다. 클라이언트가 ITfDisplayAttributeMgr::GetDisplayAttributeInfo를 처음 호출할 때 TSF 관리자는 ITfCategoryMgr::RegisterCategory에 첫 번째 매개 변수로 전달된 클래스 식별자를 사용하여 CoCreateInstance를 호출하여 표시 특성 공급자의 instance 만듭니다. ITfDisplayAttributeMgr::GetDisplayAttributeInfo에 대한 후속 호출은 표시 특성 공급자 개체를 다시 사용합니다.

    그런 다음 TSF 관리자는 표시 특성 GUID를 사용하여 ITfDisplayAttributeProvider::GetDisplayAttributeInfo를 호출하여 ITfDisplayAttributeInfo 개체를 가져옵니다.

    그런 다음 TSF 관리자는 ITfDisplayAttributeInfo 개체를 클라이언트에 다시 전달합니다.

  2. 클라이언트는 ITfDisplayAttributeMgr::EnumDisplayAttributeInfo 를 호출하여 모든 표시 특성 공급자가 제공하는 모든 표시 특성을 포함하는 IEnumTfDisplayAttributeInfo 개체를 가져옵니다. TSF 관리자는 각 표시 특성 공급자를 열거하고 ITfCategoryMgr::RegisterCategory에 세 번째 매개 변수로 전달된 클래스 식별자를 사용하여 CoCreateInstance를 호출하여 각 공급자의 instance 만듭니다.

    그런 다음 TSF 관리자는 각 공급자의 ITfDisplayAttributeProvider::EnumDisplayAttributeInfo 를 호출하여 공급자가 제공하는 모든 표시 특성을 포함하는 IEnumTfDisplayAttributeInfo 개체를 가져옵니다.

    그런 다음, TSF 관리자는 공급자의 IEnumTfDisplayAttributeInfo::Next 메서드를 호출하여 공급자의 열거형이 끝날 때까지 관리자의 고유 열거자에 가져온 각 ITfDisplayAttributeInfo 개체를 추가합니다.

    모든 디스플레이 특성 공급자에 대한 모든 ITfDisplayAttributeInfo 개체가 TSF 관리자의 열거자에 추가되면 관리자는 해당 열거자를 클라이언트에 반환합니다. 그런 다음 클라이언트는 IEnumTfDisplayAttributeInfo::Next 를 한 번 이상 호출하여 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