EternalWindows
インプレースアクティベーション / ボーダースペース

前節では、UIアクティベーションの際に行われるメニューのマージが、 IOleInPlaceFrameのメソッドを通じて行われることを説明しました。 今回はIOleInPlaceFrameのメソッドの中でボーダースペースに関するものを取り上げます。 ボーダーとは、一般にメニューの下に作成されるツールバーのことです。

実を言うと、ツールバーを表示するためにアプリケーションが行うことはほとんどありません。 単純に表示を許可する戻り値を返すだけで、 オブジェクトがコンテナのウインドウにツールバーを表示するようになります。 ツールバーは親ウインドウ(コンテナのウインドウ)の子ウインドウという位置づけであり、 親ウインドウの再描画の際には子ウインドウにちらつきが発生します。 これを防ぐために、親ウインドウにはWS_CLIPCHILDRENが指定されていることが望まれます。

オブジェクトはツールバーを表示する段階になると、 ツールバーを表示してもよいかを確認するためにRequestBorderSpaceを呼び出します。

STDMETHODIMP CContainer::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths)
{
	return S_OK;
}

コンテナはツールバーの表示を許可する場合にS_OKを返し、許可しない場合にINPLACE_E_NOTOOLSPACEを返します。 ただし、オブジェクトによってはRequestBorderSpaceを呼び出さないこともあるため、 このメソッドでツールバーの表示を完全に制御できるわけではありません。 表示を許可するかどうかの判断は、引数のボーダースペース(ツールバーのサイズ)を基に行いますが、 今回は特に問わないためS_OKを返しています。

RequestBorderSpaceによってツールバーを表示できることが分かったオブジェクトは、 ツールバーを表示するためのスペースを確保するようコンテナに指示します。 これは、SetBorderSpaceで行われます。

STDMETHODIMP CContainer::SetBorderSpace(LPCBORDERWIDTHS pborderwidths)
{
	return S_OK;
}

今回は特に何も行わずにS_OKを返していますが、 コンテナがMDIウインドウを持っている場合はそう簡単にはいかないでしょう。 MDIウインドウを持っていれば、オブジェクトのツールバーによってMDIウインドウの一部が隠される可能性があるため、 隠されない程度にMDIウインドウをずらす処理が必要になります。

SetBorderSpaceは、ツールバーを表示するスペースを確保するためのものであり、 実際にツールバーをどこに表示すべきかを決定する権利はコンテナにあります。 コンテナはGetBorderが呼ばれた場合に、ツールバーを表示すべき範囲をオブジェクトに返します。

STDMETHODIMP CContainer::GetBorder(LPRECT lprectBorder)
{
	GetClientRect(m_hwnd, lprectBorder);

	return S_OK;
}

通常、ツールバーはウインドウの上端に表示するものであると思われます。 このような場合は、単純にウインドウのクライアント領域を返すだけで、 ツールバーがウインドウの上端に表示されることになると思われます。


戻る