2004年08月17日

高さが特定の条件を常に満たしているウィンドウの作り方

環境
Visual C++.NET 2003
ライブラリ
MFC 7.1

今回説明するのは、高さが特定の条件を常に満たしているウィンドウの作り方です。 特定の条件は、ここでは例として「10の整数倍+5」としておきます。

応用すればこの条件に限らず色々な条件を指定できます。 高さが常にフィボナッチ数であるウィンドウなんていうのものも作れます。

具体的なコードの例を以下に示します。
ウィンドウを扱うクラスは、CFrameWndクラスの派生クラスCXxxFrameであるとします。 そこに、以下のようなWM_SIZINGメッセージハンドラを追加します。

void CXxxFrame::OnSizing(UINT fwSide, LPRECT pRect)
{
	const int N = 10;
	const int M = 5;
	CFrameWnd::OnSizing(fwSide, pRect);

	// ウィンドウの高さを越えない範囲でNの定数倍+Mを満たす最大の高さを求める。
	int iHeight = pRect->bottom - pRect->top;
	iHeight = ((iHeight - M) / N) * N + M;

	if (fwSide == WMSZ_BOTTOM || fwSide == WMSZ_BOTTOMLEFT || fwSide == WMSZ_BOTTOMRIGHT) {
		// 下方向にウィンドウを伸ばしている場合は、pRect->bottomの値を変更する。
		pRect->bottom = pRect->top + iHeight;
	}else if (fwSide == WMSZ_TOP || fwSide == WMSZ_TOPLEFT || fwSide == WMSZ_TOPRIGHT) {
		// 上方向にウィンドウを伸ばしている場合は、pRect->topの値を変更する。
		pRect->top = pRect->bottom - iHeight;
	}
}

なお、OnSizingが有効に働くのは、ユーザがウィンドウ枠をドラッグ&ドロップして サイズを変更しようとしているだけです。 CFrameWnd::CreateやSetWindowPos、MoveWindowなどでウィンドウのサイズを指定する場合、 高さが「10の定数倍+5」になるように注意しましょう。

投稿者 MASATO : 2004年08月17日 15:03 | トラックバック
コメント
コメントする









名前、アドレスを登録しますか?