[戻る] [Top]

Windows Programming TIPS With MFC

メインウィンドウ位置/サイズの記憶

アプリケーションを開発している場合、アプリケーションのメインウィンドウの位置、サイズを記憶しておいて、次回起動時にも同じ位置、サイズで表示したい場合があります。

ウィンドウ位置、サイズの取り出しと設定

ウィンドウの位置情報の取得にはGetWindowPlacementを使用します。これを使用すると、最大化/最小化/通常表示の状態と、通常状態でのウィンドウサイズが一度に取れるので今回の用途には最適だと思います。

ウィンドウの位置情報の設定には、設定/復元したい内容によって、いくつかのAPIを使い分けます。便利なのは SetWindowPosや、ShowWindowだと思います。

サイズ取り出しのタイミング

CMainFrame::OnClose()かOnDestroyで行います。ダイアログアプリケーションでも同様です。

サイズ設定のタイミング

アプリケーションの作成方法によっていろいろです。以下のような方法があります。

 
・CWinApp::InitInstance()

アプリケーションのInitInstanceの最後のあたりで、フレームウィンドウに対するShowWindow()などウィンドウの表示に関する呼び出しがされている場合は、その直前でサイズを設定することができると思います。
ドキュメント/ビューサポートのMFCアプリケーションを作成したときにはドキュメントが作成されるタイミングでウィンドウが表示されてしまうので、ここで行ったばあい一瞬ウィンドウが表示されたのちに指定した表示状態になるという動作になってしまいます。

・CMainFrame::ActivateFrame()

通常のドキュメント/ビューサポートのMFCアプリケーションを作成した場合、メインフレームのActivateFrameを使用することができます。ActivateFrameはドキュメントが作成されるタイミングでフレームワークから呼び出されます。
この方法で行うときはデフォルトインプリメントの引数に表示状態を渡せばMFC側でうまく設定してくれます。
新規ドキュメントが作成されるたびに呼び出されるファンクションであるため、場合によってはフラグなどを用意しておいて、一度目の呼び出しのみ行われるようにするなど工夫する必要があります。
または、ここでの設定は行わずデフォルトインプリメントのnCmdShowにSW_HIDEを渡しておいて、上記CWinApp::InitInstanceのタイミングで設定するという方法もあります。
ただし、ドキュメントレスのアプリケーションを作成した場合上記タイミングでActivateFrameは呼び出されません。

・CDialog::OnInitDialog

ダイアログアプリケーションではCDialog::OnInitDialogで行えばよいでしょう。

------

更新履歴


このページについてのご意見、ご感想、ご質問、ご要望、間違いの指摘等は
西川真人: m-nishikawa@nifty.comまで