ActiveXコントロールの動作が変わってしまう。 – プログラミング – Home

ActiveXコントロールの動作が変わ...
 
通知
すべてクリア

[解決済] ActiveXコントロールの動作が変わってしまう。


キャップ
 キャップ
(@キャップ)
ゲスト
結合: 15年前
投稿: 2
Topic starter  

お世話になっております。

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!!
 Atata!!
(@Atata!!)
ゲスト
結合: 18年前
投稿: 25
 

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 の派生クラスを作成した方が良いで
す。


返信引用
キャップ
 キャップ
(@キャップ)
ゲスト
結合: 15年前
投稿: 2
Topic starter  

Atata!!さん、ありがとうございます。
DOCHOSTUIFLAG_NO3DBORDER  を返すことで無事に解決しました。
把握していない場所があるにもかかわらずCAxHostWindowを使用していたので
今回とても勉強になりました。

ありがとございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました