前回のウィンドウサイズで起動する

アプリケーションを終了した際、ウィンドウの位置を保存し
次回起動時に前の状態で起動するようにする方法です。

まずは終了時にウィンドウの位置を保存します。
メインウィンドウのクラスでWM_DESTROYのメッセージハンドラを追加し以下のように記述してください。


void CMainFrame::OnDestroy() 
{
    // ウィンドウ位置等の取得
    WINDOWPLACEMENT wpl;
    GetWindowPlacement(&wpl);

    // 保存
    CWinApp* pApp = AfxGetApp();
    pApp->WriteProfileInt(_T("Window"), _T("left"),   wpl.rcNormalPosition.left);
    pApp->WriteProfileInt(_T("Window"), _T("top"),    wpl.rcNormalPosition.top);
    pApp->WriteProfileInt(_T("Window"), _T("right"),  wpl.rcNormalPosition.right);
    pApp->WriteProfileInt(_T("Window"), _T("bottom"), wpl.rcNormalPosition.bottom);
    pApp->WriteProfileInt(_T("Window"), _T("show"),   wpl.showCmd);

    CFrameWnd::OnDestroy();
    
    // TODO: この位置にメッセージ ハンドラ用のコードを追加してください
}

通常は親クラスのOnDestroy()が呼ばれた後にコードを追加しますが
この場合は呼ばれる前に記述します。
CWnd::GetWindowPlacement()でウィンドウの状態と位置などの情報が取得できます。
たとえ最大化や最小化していてもOKです。
そしてウィンドウの位置と表示状態をレジストリやINIファイルに保存します。

次は起動時に前回のウィンドウ位置にする方法です。
OnCreate()内でウィンドウ位置を変更してやります。


int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
        :
        :

    // ウィンドウ位置の読み込み
    CWinApp* pApp = AfxGetApp();
    RECT rc = { pApp->GetProfileInt(_T("Window"), _T("left"), 0),
                pApp->GetProfileInt(_T("Window"), _T("top"), 0),
                pApp->GetProfileInt(_T("Window"), _T("right"), 0),
                pApp->GetProfileInt(_T("Window"), _T("bottom"), 0) };

    // ウィンドウ位置の変更
    if (!::IsRectEmpty(&rc))
        MoveWindow(&rc, FALSE);

    return 0;
}

ウィンドウの位置を読み込んでCWnd::MoveWindow()で変更してやっていますが
その前に前回のウィンドウ位置の情報が記録されていなかったときは
ウィンドウの位置を変更しないでデフォルトの位置で表示するようにしてます。

あとは、ウィンドウの表示状態を設定します。
これはメインアプリケーションクラスのInitInstance()内で行います。


BOOL CXxxApp::InitInstance()
{
        :
        :

    // 設定が保存される下のレジストリ キーを変更します。
    // TODO: この文字列を、会社名または所属など適切なものに
    // 変更してください。
    SetRegistryKey(_T("Local AppWizard-Generated Applications"));
    m_nCmdShow = GetProfileInt(_T("Window"), _T("show"), SW_SHOWNORMAL);

        :
        :

    // メイン ウィンドウが初期化されたので、表示と更新を行います。
//  m_pMainWnd->ShowWindow(SW_SHOW); ↓に変更。
    m_pMainWnd->ShowWindow(m_nCmdShow);
    m_pMainWnd->UpdateWindow();

    return TRUE;
}

m_nCmdShowはアプリケーション起動時のウィンドウの状態が格納されています。
これをウィンドウを作成する前に変更してやってください。
そうしないと最大化で起動した際、一瞬通常のウィンドウが表示されてしまいます。
その後、ShowWindow()でウィンドウを表示する際にm_nCmdShowを引数にして呼び出してください。

< 戻る << HOME ©1999-2001 by Akky, All right reserved.