テキスト ストア
ACP は、テキスト ストリーム内の文字 (または文字) の位置であり、テキスト ストリームの先頭からの文字数として表されます。 ACP モデルは 0 から始まるため、テキスト ストリームの最初の文字の ACP は 0 です。 次に例を示します。
Text Stream H | e | l | l | o | | W | o | r | l | d
ACP 0 1 2 3 4 5 6 7 8 9 10
テキスト ストアは 、ITextStoreACP インターフェイスをサポートする オブジェクトを実装します。これにより、テキスト ストリームを ACP で表現できます。 ITextStoreACP インターフェイス メソッドは、テキスト ストリームの ACP 範囲を使用してテキストを変更します。
マネージャーは、ACP ベースのメソッドをネイティブに使用してテキストを操作します。 ただし、アンカーをサポートするMicrosoft Active Accessibility クライアントではアンカーベースのアプローチを使用できます。これにより、マネージャーは ITextStoreAnchor メソッドと ITextStoreAnchorSink メソッドを使用して ITextStoreACP メソッドと ITextStoreACPSink メソッドをラップします。
テキスト ストアは、 ドキュメント ロックを使用してテキスト ストリームへのアクセスを制御します。 テキスト ストアの読み取りまたは変更を行うには、まず、 ITextStoreACP::AdviseSink メソッドを呼び出し、アドバイズ シンクへのポインターを渡すことによって 、ITextStoreACPSink インターフェイスをサポートするアドバイズ シンクをインストールする必要があります。 アドバイス シンクを使用すると、マネージャーはテキスト ストアに対するドキュメント ロックを取得し、アプリケーションを介したユーザー入力など、マネージャー以外の何かによってテキスト ストアが変更されたときに通知を受け取ることができます。 アドバイズ シンクについては、このトピックの後半で説明します。
アプリケーションは、次の手順を実行してテキスト ストアを初期化します。
スレッド マネージャー オブジェクトへのポインターを使用して CoCreateInstance 関数を呼び出して、ITfThreadMgr インターフェイスに基づいてスレッド マネージャー オブジェクトを作成します。 スレッド マネージャー オブジェクトを実装するコード例を次に示します。
hr = CoCreateInstance (CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, IID_ITfThreadMgr, (void**)&pThreadMgr);
ITfThreadMgr::Activate メソッドを呼び出して、スレッド マネージャー オブジェクトをアクティブ化します。 このメソッドは、コンテキスト オブジェクトの作成に使用される クライアント識別子 へのポインターを提供します。 スレッド マネージャーは、ドキュメント マネージャー オブジェクトを実装するために使用されます。
ITfThreadMgr::CreateDocumentMgr メソッドをドキュメント マネージャー オブジェクトへのポインターで呼び出して、ITfDocumentMgr インターフェイスに基づいてドキュメント マネージャー オブジェクトを作成します。 ドキュメント マネージャー オブジェクトは、テキスト ストアであるコンテキスト オブジェクトを実装するために使用されます。
テキスト ストア オブジェクトへのポインターと、スレッド マネージャーをアクティブ化するクライアント識別子へのポインターを使用して ITfDocumentMgr::CreateContext メソッドを呼び出して、ドキュメント マネージャーからコンテキスト オブジェクトを作成します。 コンテキスト オブジェクトを作成する例を次に示します。
hr = pDocumentMgr->CreateContext(m_ClientID, 0, (ITextStoreACP*)this, &pContext, pEditCookie);
ITfDocumentMgr::P ush メソッドを使用して、コンテキスト オブジェクトをスタックにプッシュします。 コンテキスト オブジェクトをスタックにプッシュする例を次に示します。
hr = pDocumentMgr->Push(pContext);
ITfDocumentMgr::P ush メソッドは、新しいアドバイズ シンクをインストールするか、既存のアドバイズ シンクを変更するために、アドバイス シンク インターフェイスへのポインターを使用して ITextStoreACP::AdviseSink を呼び出します。 アドバイス シンクは、アプリケーションへのユーザー入力など、マネージャー以外の何かによってテキスト ストアが変更されたときに通知を受け取ります。 アプリケーションは、入力メソッドがフォーカスを取得するときに ITfThreadMgrEventSink::OnSetFocus メソッドを呼び出す必要があります。 スレッド マネージャーへのその他の通知は、適切な ITextStoreACPSink インターフェイス メソッドを呼び出すことによって提供されます。
ただし、アプリケーションは ITextStoreACP インターフェイス メソッドに応答して ITextStoreACPSink インターフェイス メソッドを呼び出さないでください。 アプリケーションは、テキスト ストアがマネージャー以外の何かによって変更された場合にのみ 、ITextStoreACPSink インターフェイス メソッドを呼び出す必要があります。
テキスト ストアの内容は、 コンポジションと呼ばれる一時的な入力状態で変更できます。