それをダブルクリックすることでオブジェクトのウインドウを表示することに成功しました。操作性を望むならば、コンテナのウインドウ上でオブジェクトを操作したいと思うはずです。オブジェクトを子ウインドウとしてコンテナのウインドウに貼り付けるのです。オブジェクトの操作をシームレスに行える利点が生じます。図を描けるようになっています。UIアクティベーションと呼ばれる作業も同時に行われます。ツールバーをコンテナ上に表示したりすることを意味します。インプレースアクティベーションを行うためには、コンテナとサイトがそれ用のインターフェースを実装することになります。コンテナが実装すべきインターフェースはIOleInPlaceFrameです。このクラスがIOleInPlaceFrameを実装することになります。このサイトはIOleInPlaceSiteを実装することになります。IOleObject::DoVerbにOLEIVERB_PRIMARYを指定することで、インプレースアクティベーションが開始されるはずです。アウトプレース(独立したウインドウ)としてオブジェクトを起動したい場合は、OLEIVERB_OPENを指定するようにします。今回は、サイトが実装するIOleInPlaceSiteについて見ていくことにします。サイトの目的というのはオブジェクトからの通知を受けることでした。IAdviseSinkはオブジェクトが閉じられた際の通知を受け取ることができます。インプレースアクティベーション(及びUIアクティベーション)の発生や解除などが代表的です。次に、インプレースアクティベーション(及びUIアクティベーション)の発生に関する流れを示します。OnInPlaceActivateまでしか呼ばれないことがあります。これは、OLEIVERB_INPLACEACTIVATEがインプレースアクティベーションだけを行うことを目的にしているからです。OnUIActivateやGetWindowContextも呼ばれるはずです。それでは、CanInPlaceActivateから処理を順に確認します。S_OK;}CanInPlaceActivateは、インプレースアクティベーションを実行してもよいかを確認する目的で呼ばれます。S_OKを返すことでインプレースアクティベーションの実行を許可することができます。S_OK;}OnInPlaceActivateは、実際にインプレースアクティベーションが行われた際に呼ばれます。この時点でオブジェクトのウインドウはコンテナのウインドウの中に表示されています。QueryInterfaceで取得しておくことになります。S_OK;}OnUIActivateは、UIアクティベーションが行われた際に呼ばれます。この時点でコンテナのウインドウにはオブジェクトのツールバーなどが表示されています。今回は特に行うことがないので単純にS_OKを返しています。S_OK;}GetWindowContextは、コンテナの情報を取得する目的で呼ばれます。ppFrameは、IOleInPlaceFrameを実装しているコンテナのアドレスを指定します。AddRefで参照カウントを増加させておきます。ppDocは、MDIウインドウを作成しない場合はNULLでよいでしょう。lprcClipRectはオブジェクトを描画できる最大の範囲を指定します。これは、コンテナのクライアント領域全体でよいと思われるため、GetClientRectで初期化した値を指定します。今回はこれを持っていないので初期化していません。インプレースアクティベーションされたオブジェクトは、マウスで移動したりサイズを変更したりすることができます。した操作を行った場合は、OnPosRectChangeが呼ばれます。S_OK;}lprcPosRectには、オブジェクトの新しい位置情報が格納されています。オブジェクトの位置を実際に第1引数の位置に変更します。コンテナのクライアント領域を指定すれば問題ありません。新しい位置情報はオブジェクトの描画の際に必要となりますから、メンバ変数に保存しておきます。インプレースアクティベーションされたオブジェクトは、どのような状況で元に戻ることになるのでしょうか。一般的には、ユーザーがコンテナのウインドウのどこかをクリックした場合が妥当であると思われます。このメソッドでインプレースアクティベーションを解除することになります。NULL)m_pInPlaceObject->InPlaceDeactivate();}m_bSelectがFALSEである場合は、ユーザーがこのオブジェクトでない別の場所をクリックしたことを意味します。InPlaceDeactivateを呼び出すことでインプレースアクティベーションを解除します。それを通知するOnUIDeactivate(正確にはこの前にSetActiveObject(NULL))が呼ばれます。S_OK;}OnUIDeactivateが制御を返した場合は、UIアクティベーションが解除されることになります。SetMenuを呼び出して明示的に元に戻すようにしています。OnUIDeactivateの後には、インプレースアクティベーションが解除されたことを通知するOnInPlaceDeactivateが呼ばれます。IOleInPlaceObject::Releaseを呼び出すことでオブジェクトを開放することができます。