FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

CDHtmlDialog で Windows XP luna テーマを表示させる方法

MFC の CDHtmlDialog で Windows XP luna テーマを表示させる方法。

たったこれだけのことが、なかなか分からず苦労したため、メモしておく。
(実は最後の (6)結論 以外は読む必要なし。)



(1) CDHtmlDialog で検索

最初、「cdhtmldialog manifest」といったキーワードで検索した。
テーマを反映させるにはmanifestだろう、と考えたためだ。
この考えは全然違うようであった。

「Code Project」でこんな↓のを見つけた。
Dialog with HTML skin using CDHtmlDialog and SetWindowRgn
http://www.codeproject.com/KB/MFC/HtmlSkinCDHtmlDialog.aspx
だがこれは単にHTMLダイアログベースで非矩形のウィンドウを作るためのものであった。
luna風コントロールは表示されない。

最近の CodeProject はダウンロード時のログインだけでなく、さらに余計な確認までさせられるようになっている。orz



(2)IWebBrowser で検索してみた

色々なキーワードを試してみた。
「iwebbrowser luna」というキーワードで得るものがあった。

2ちゃんねるのスレを発見した。
http://ir9.jp/prog/ayu/datlog/tech_ie_component/982930049/982930049_03.html
546-550でまさにその話題が

2ちゃんねるなのであんまり詳しくは教えてくれないが、MSDNのこの↓ページが紹介されていた。
http://msdn.microsoft.com/workshop/browser/hosting/reference/enum/dochostuiflag.asp
DOCHOSTUIFLAG_THEME を指定すれば良いのだそうだが、情報としてはそれだけ。


(3)DOCHOSTUIFLAG_THEME とやらは、どうやって指定するのか?

さて、DOCHOSTUIFLAG_THEME とやらは、どうやって指定すればいいというのだ?
SetDocHostUIFlag() といったような関数があるのか?

で、
IDocHostUIHandler インターフェイスを自分で(!)用意して、その中のGetHostInfoメソッドでそのフラグを返してやる、ということがわかった。
この程度のことを実現するのに、なんてことをさせるのだろう。
orz orz orz

と、思いついて、unDonut (及び派生品)のソースコードをダウンロードして調べてみた。
が、該当箇所だけ取り出して使えるような規模ではなかった。
(unDonutのソースコードのダウンロード場所が非常にわかりにくい。ソースを見たがる人なんてあまりいないのだろう。orz)


(4) じっくり腰を据えて調べる

じっくり腰を据えてMSDNのこちら↓などを読みながら、基本からやろうと思った。
http://www.dotnet247.com/247reference/a.aspx?u=http://msdn.microsoft.com/workshop/browser/hosting/wbcustomization.asp

これによると、WebBrowserコントロールはインスタンス化されるとすぐに、コンテナ側の IOleClientSite に対して IDocHostUIHandler 取得要求を出すらしい。
ということは、IOleClientSite のQueryInterface に細工をすれば良いはず。
CDHtmlDialogはWebBrowserコントロールのコンテナなので、IOleClientSite を持っているはず。

ということで、もう一度、ちょっとCDHtmlDialogを調べてみることに。



(5) 青い鳥はすぐそばに

デバッガでCDHtmlDialogベースのスケルトンを作って追いかけて行ったら、CDHtmlDialogのコンストラクタで、
void CDHtmlDialog::Initialize()
というメンバを呼んでいる。

Initalize内で、なんと!!
SetHostFlags(DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_SCROLL_NO);
などという呼び出しがあるではないか。

ここで設定された値は、
CDHtmlDialog::m_dwHostFlags;
に保持されて、必要に応じてWebBrowserコントロールに渡されるというしくみであった。orz



(6) 結論

CDhtmlDialogの派生クラスを作り、コンストラクタで次のようにすればよい。

SetHostFlags(m_dwHostFlags | DOCHOSTUIFLAG_THEME);

スポンサーサイト
コメント
コメントの投稿
管理者にだけ表示を許可する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。