Win32API質問箱 Build43

このエントリーをはてなブックマークに追加
881デフォルトの名無しさん
自分でRegister&Createしたウィンドウ内にActiveXコントロールを入れ込む方法はどうやるのでしょうか?

1. RegisterClass() / g_hWndMain = CreateWindow("MyClass")
2. CoCreateInstance(CLSID_..., IID_IOleObject, &pOleObject)
3. pOleObject->SetClientSite(...) : コントロールに親ウィンドウのハンドルg_hWndMainを取得する手段を提供。
4. pOleObject->QueryInterface(IID_IOleInPlaceObject, &pOleinPlaceObject)
5. pOleinPlaceObject->SetObjectRects(...) : コントロールに親ウインドウの矩形と自分(コントロール)に割り当てられた矩形を教える。

ここまででコントロールに窓を表示する為の情報は教えたと思うのですが、表示できません・・・OrZ

ちなみにWebBrowserコントロールだとここまでで窓(非表示)が生成されるので、この後に無理矢理

pOleObject->QueryInterface(IID_IOleWindow, &pOleWindow);
pOleWindow->GetWindow(&g_hWndWBC)
ShowWindow(g_hWndWBC, SW_SHOW);

すればコントロールらしき白い空白が表示されます。(MyClassの背景は暗くしておく)
でもこれだけではこのコントロールはまともに使えないみたい・・・

それに他のActiveXコントロール(VB5CCEで自作)ではなぜかpOleObject->EnumVerbs()しないと窓が生成されないし(でもサイズは0)、g_hWndMainの子ウィンドウにならない・・・

OLEスレはあるんですが、余りに効率が悪いのでSDKレベルでOLEをやっている人はあまり居ないみたいです。