お世話になっております。
WebBrowser を 貼り付けたウインドウを作成するため WTLのCAxHostWindow
を使って作成しました。
以下のコードを呼び出したら、フラットなウインドウを作成していたのにも
かかわらず、凹だウインドウになってしまいました。
そのほかにも、右クリックを禁止していたのにもかかわらず、
使えるようになってしまいました。
IOleObjectPtr spIOleObject;
m_AxHost->QueryControl(IID_IOleObject, (void**)&spIOleObject);
hr = spIOleObject->SetClientSite(this);
if (FAILED(hr))
{
return E_FAIL;
}
どうして動作が変わってしまったのでしょうか
VisualStudio2005 と WTL で開発しています。
Atata!! です。
原因は以下の2点のどちらかに絞られます。
1. IOleObject::SetClientSite で渡しているクラスが IDocHostUIHandler を実装して
いない。
2. IDocHostUIHandler::GetHostInfo と IDocHostUIHandler::ShowContextMenu を期待
する動作通りに実装できていない。
# IDocHostUIHandler::GetHostInfo で DOCHOSTUIFLAG_NO3DBORDER を返していない。
通常は CAxHostWindow が実装している IDocHostUIHandler が使用されますが、
WebBrowser コントロールに対して IOleObject::SetClientSite を呼び出した場合、
SetClientSite したクラスで実装している IDocHostUIHandler が呼び出されるようにな
ります。
このため SetClientSite したクラスの実装が不完全であると質問の内容のような動作に
なります。
ここで注意点は SetClientSite で指定しているクラスが IDocHostUIHandlerDispatch
を実装していても、
WebBrowser コントロールは IDocHostUIHandlerDispatch を認識しません。(多分)
ただ、CAxHostWindow を直接使用できるレベルに達しているなら、
そもそも SetClientSite せずに、CAxHostWindow の派生クラスを作成した方が良いで
す。
Atata!!さん、ありがとうございます。
DOCHOSTUIFLAG_NO3DBORDER を返すことで無事に解決しました。
把握していない場所があるにもかかわらずCAxHostWindowを使用していたので
今回とても勉強になりました。
ありがとございました。