第20回 ウインドウの位置やサイズを保存/復元する (タブブラウザーを作る)

tabbrowser73.gif
今回は終了時にウインドウの位置やサイズを保存し、起動時にその位置やサイズをみ込むことで前回閉じた位置に前回のままの大きさで開く処理を実装する。情報の保存はレジストリに行う。

ウインドウの位置やサイズの取得/復元は以前に「ウインドウの位置情報を保存/復元するクラス」で作成したCDnpWindowPlacementクラスを利用する。

まずこのクラスを利用するために「DnpWindowPlacement.h」ファイルをプロジェクトに追加する。Visual Studio 2008で「プロジェクト」メニューから「既存の項目を追加」を選択する。このメニュー項目がない場合はソリューションウインドウを開いてからもういちどメニューを選択する。

tabbrowser74.gif
そして現われたウインドウで「DnpWindowPlacement.h」を追加する。

※このファイルは今回のサンプルプロジェクトもしくは「ウインドウの位置情報を保存/復元するクラス」からダウンロードしてください

tabbrowser75.gif 次に情報を保存するためのレジストリ位置を簡単に変えれるように「stdafx.h」にレジストリ位置用の定義を追加する。
#define	DNP_REGKEY		_T("software\\dinop\\tabbrowser")	//■追加

tabbrowser76.gif そして「TabBrowser100.cpp」のメインウインドウ生成後にレジストリから位置情報を読み込み、復元する処理を追加する。
int Run(LPTSTR /*lpstrCmdLine*/ = NULL, int nCmdShow = SW_SHOWDEFAULT)
{
	CMessageLoop theLoop;
	_Module.AddMessageLoop(&theLoop);

	CMainFrame wndMain;

	if(wndMain.CreateEx() == NULL)
	{
		ATLTRACE(_T("メイン ウィンドウの作成に失敗しました!\n"));
		return 0;
	}

	//wndMain.ShowWindow(nCmdShow);		//■削除

	//■追加
	//ウインドウサイズ/位置をレジストリから復元
	{
		bool	ret;
		CDnpWindowPlacement	cPlacement;

		ret = cPlacement.LoadFromReg(HKEY_CURRENT_USER,DNP_REGKEY,_T("WindowPlacement"));
		if(ret)
			ret = cPlacement.Restore(wndMain);
		if(ret == false)
			wndMain.ShowWindow(nCmdShow);
	}

	int nRet = theLoop.Run();

	_Module.RemoveMessageLoop();
	return nRet;
}

tabbrowser77.gif さらに「MainFrm.h」内にCDnpWindowPlacementを利用するためのincludeを追加する。
#include "DnpWindowPlacement.h"		//■追加

tabbrowser78.gif そして、OnDestroy()が呼ばれたときにレジストリへウインドウの位置/サイズを保存するようにする。
	LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
	{
		//■追加
		//現在のウインドウサイズ/位置をレジストリに保存
		{
			CDnpWindowPlacement	cPlacement;

			cPlacement.GetCurrentPos(m_hWnd);
			cPlacement.SaveToReg(HKEY_CURRENT_USER,DNP_REGKEY,_T("WindowPlacement"));
		}

		_cTabImageList.Destroy();

		// メッセージ フィルターおよび画面更新用のオブジェクト登録解除
		CMessageLoop* pLoop = _Module.GetMessageLoop();
		ATLASSERT(pLoop != NULL);
		pLoop->RemoveMessageFilter(this);
		pLoop->RemoveIdleHandler(this);

		bHandled = FALSE;
		return 1;
	}

tabbrowser79.gif
これでビルド/実行すると前回の位置に同じ大きさでタブブラウザが開くようになった。

次回はステータスバーにIEコントロールからのメッセージを表示する機能を追加する。

プロジェクトファイルをダウンロード


カテゴリー「タブブラウザーを作る」 のエントリー