TSF UILess ITfUIElementSinkをAdviseSinkできません
-
2011年3月23日 5:29
Win7 VC++ 2010 Win32プロジェクトにてTSF対応アプリを作成しています。
ITextStoreACPを実装してエディットコントロールもどきを作成しています。
現状、 キーボード入力から文字の描画し、表示属性を取得して入力中文字列に対してアンダーラインを引くところまでできています。
TIPはOffice標準のOffice IME 2010です。
アプリ作成の参考にしたのはSDK sampleのwinui/tsfappです。
課題はUILess Modeの適用です。
今はTIPが変換候補一覧ウィンドウ(Candidate Window)を表示していますが、自前で候補ウィンドウを作成したいと思っています。
そこで下記サイト等を参考にUILessにしたいと思っているのですが、うまく行きません。
http://msdn.microsoft.com/en-us/library/aa966970.aspx#
ITextStoreACPを実装したクラスにITfUIElementSinkを実装し、以下のようにAdviseSinkしているのですが
AdviseSinkがE_FAILEを返してインストールできません。
以下の処理はWM_CREATEハンドラで行っています。
// ITfThreadMgrExPtr mThreadMgr; // ←メンバ変数でCoCreateInstance,ActivateEx済み ITfUIElementMgrPtr aUIMgr; HRESULT hr = mThreadMgr->QueryInterface(&aUIMgr); if (FAILED(hr)) return; ITfSourcePtr aSource; hr = aUIMgr->QueryInterface(&aSource); if (FAILED(hr)) return; hr = aSource->AdviseSink(IID_ITfUIElementSink, static_cast<ITfUIElementSink *>(this), &mCookie); if (FAILED(hr)) return;
※ ITf***Ptrは_COM_SMARTPTR_TYPEDEFでtypedefした型です。
※ 接頭語の[a]や[m]はそれぞれ[auto]、[member]を意味しています。
どなたかご教示のほど、よろしくお願いいたします。
回答
-
2011年3月23日 8:35
流れは正しいです。
aSource->AdviseSinkを呼ぶと static_cast<ITfUIElementSink *>(this)に対してIUnknown::QueryInterfaceでITfUIElementSinkを問い合せてきます。
その処理は正しいですか?Errorを返していませんか?- 回答としてマーク yield break 2011年3月23日 10:37
- 回答としてマークされていない yield break 2011年3月23日 10:38
- 回答としてマーク yield break 2011年3月23日 10:44
すべての返信
-
2011年3月23日 8:35
流れは正しいです。
aSource->AdviseSinkを呼ぶと static_cast<ITfUIElementSink *>(this)に対してIUnknown::QueryInterfaceでITfUIElementSinkを問い合せてきます。
その処理は正しいですか?Errorを返していませんか?- 回答としてマーク yield break 2011年3月23日 10:37
- 回答としてマークされていない yield break 2011年3月23日 10:38
- 回答としてマーク yield break 2011年3月23日 10:44
-
2011年3月23日 10:41
kozzさん、ご返信ありがとうございます。
QueryInterfaceにてITfUIElementSinkへの問い合わせ対応が抜けていました。
QueryInterfaceを対応したところ、正常にインストールでき、UILessを実現できました。
確認不足の早合点、大変失礼いたしました。
誠にありがとうございました。
追記)
[回答としてのマーク ]をつけたり外したりと見苦しい動作、申し訳ございません。
このForumにまだ慣れていないもので。。。
- 回答としてマーク yield break 2011年3月23日 10:41
- 回答としてマークされていない yield break 2011年3月23日 10:43

