Menyediakan Atribut Tampilan

Text Services Framework (TSF) memungkinkan layanan teks menyediakan atribut tampilan untuk teks. Ini memungkinkan umpan balik visual tambahan untuk diberikan kepada pengguna. Misalnya, layanan teks pemeriksa ejaan dapat menyoroti kata yang salah eja dengan garis bawah merah. Atribut tampilan yang disediakan ditentukan oleh struktur TF_DISPLAYATTRIBUTE dan menyertakan warna teks, warna latar belakang teks, gaya garis bawah, warna garis bawah, dan bobot garis bawah.

Klien yang menggunakan informasi atribut tampilan ini paling sering menjadi aplikasi, tetapi juga dapat menyertakan layanan teks. Manajer TSF memediasi antara penyedia atribut tampilan dan klien dan melacak penyedia atribut tampilan dari atribut tampilan tertentu.

Untuk menyediakan atribut tampilan, layanan teks harus melakukan hal berikut.

  1. Daftarkan layanan teks sebagai penyedia atribut tampilan dengan memanggil ITfCategoryMgr::RegisterCategory dengan pengidentifikasi kelas layanan teks untuk parameter pertama, GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER untuk parameter kedua dan pengidentifikasi kelas layanan teks lagi untuk parameter ketiga.
  2. Terapkan ITfDisplayAttributeProvider dan sediakan dari pabrik kelas.
  3. Terapkan IEnumTfDisplayAttributeInfo dan sediakan dari ITfDisplayAttributeProvider::EnumDisplayAttributeInfo.
  4. Terapkan objek ITfDisplayAttributeInfo untuk setiap jenis atribut tampilan yang disediakan layanan teks.

Menerapkan Atribut Tampilan

Layanan teks harus menerapkan atribut tampilan ke rentang teks. Layanan teks hanya dapat mengubah nilai properti selama sesi edit baca/tulis.

Dengan asumsi ini berada dalam sesi edit baca/tulis, atribut tampilan diterapkan dengan cara berikut.

  1. Dapatkan objek ITfRange yang mencakup teks tempat atribut tampilan akan diterapkan.
  2. Dapatkan objek ITfProperty untuk atribut teks dengan memanggil ITfContext::GetProperty dengan GUID_PROP_ATTRIBUTE.
  3. Buat TfGuidAtom dari GUID pengidentifikasi atribut tampilan yang ditentukan layanan teks dengan memanggil ITfCategoryMgr::RegisterGUID.
  4. Inisialisasi variabel VARIAN untuk VT_I4 dan atur anggota lVal ke TfGuidAtom yang dibuat pada langkah sebelumnya.
  5. Terapkan atribut tampilan ke rentang dengan memanggil ITfProperty::SetValue dengan cookie edit baca/tulis, rentang dan VARIAN yang diinisialisasi pada langkah sebelumnya.
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;
}

Menyediakan Objek Informasi Atribut Tampilan

Klien mendapatkan objek ITfDisplayAttributeInfo dengan salah satu dari dua cara.

  1. Klien memanggil ITfDisplayAttributeMgr::GetDisplayAttributeInfo dengan pengidentifikasi GUID dari atribut tampilan. Pertama kali klien memanggil ITfDisplayAttributeMgr::GetDisplayAttributeInfo, manajer TSF akan membuat instans penyedia atribut tampilan dengan memanggil CoCreateInstance dengan pengidentifikasi kelas yang diteruskan sebagai parameter pertama ke ITfCategoryMgr::RegisterCategory. Panggilan berikutnya ke ITfDisplayAttributeMgr::GetDisplayAttributeInfo akan menggunakan kembali objek penyedia atribut tampilan.

    Manajer TSF kemudian memanggil ITfDisplayAttributeProvider::GetDisplayAttributeInfo dengan atribut tampilan GUID untuk mendapatkan objek ITfDisplayAttributeInfo .

    Manajer TSF kemudian meneruskan objek ITfDisplayAttributeInfo kembali ke klien.

  2. Klien memanggil ITfDisplayAttributeMgr::EnumDisplayAttributeInfo untuk mendapatkan objek IEnumTfDisplayAttributeInfo yang berisi semua atribut tampilan yang disediakan oleh semua penyedia atribut tampilan. Manajer TSF menghitung setiap penyedia atribut tampilan dan membuat instans setiap penyedia dengan memanggil CoCreateInstance dengan pengidentifikasi kelas yang diteruskan sebagai parameter ketiga ke ITfCategoryMgr::RegisterCategory.

    Manajer TSF kemudian memanggil ITfDisplayAttributeProvider::EnumDisplayAttributeInfo masing-masing penyedia untuk mendapatkan objek IEnumTfDisplayAttributeInfo yang berisi semua atribut tampilan yang disediakan oleh penyedia.

    Manajer TSF kemudian memanggil metode IEnumTfDisplayAttributeInfo::Next penyedia, menambahkan setiap objek ITfDisplayAttributeInfo yang diperoleh ke enumerator manajer sendiri, hingga akhir enumerasi penyedia tercapai.

    Ketika semua objek ITfDisplayAttributeInfo untuk semua penyedia atribut tampilan ditambahkan ke enumerator manajer TSF, manajer mengembalikan enumeratornya ke klien. Klien kemudian memanggil IEnumTfDisplayAttributeInfo::Berikutnya satu atau beberapa kali untuk mendapatkan objek 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::Berikutnya