ウィンドウの最大化

[戻る]
ひで 2004/09/27(月) 19:09:04
環境は Win2000 SP4, Visual Studio .Net 2003 です。

起動時にウィンドウを最大化するために、次のように記述しました。

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    if( !CFrameWnd::PreCreateWindow(cs) )
        return FALSE;
    // TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
    //  修正してください。
    cs.style |= WS_MAXIMIZE;

    return TRUE;
}

ビルドし、Ctrl + F5 でプログラムを実行すると、ウィンドウは最大化されるのですが、
実行ファイルを直接ダブルクリックして実行すると、ウィンドウは最大化されません。

実行ファイルを直接ダブルクリックして実行しても、ウィンドウが最大化されるように
したいのですが、何が問題なのか分かりません。

ご教授のほど、よろしくお願いいたします。

アイススケーター 2004/09/27(月) 20:18:22
他のスタイルのフラグがONしているからではないですか。
例えば、WS_MINIMIZEがONになっていたらOSはどう表示して良いか迷うでしょう。
スタイルの初期値は既に何らかの値が入っています。

アイススケーター 2004/09/27(月) 20:48:30
ごめんなさい。私が、勘違いしているみたいです。
別の原因のようです。

私の環境で調べたのですが「VS6」
デバッガでも最大化しませんでした。

monkey 2004/09/27(月) 21:32:17
起動時のフレームウィンドウの表示方法(SW_XXX)は、アプリケーションクラス(以
下"CxxxApp"とする)のデータメンバ"m_nCmdShow"に保持されています。
ですから、CxxxAppクラスのInitInstance関数内で、m_nCmdShowの値
を"SW_SHOWMAXIMIZED"に書き替えれば良いです。

BOOL CxxxApp::InitInstance()
{

    (省略)

    m_nCmdShow = SW_SHOWMAXIMIZED; // ※の行でウィンドウが表示されるので、※よ
り前に書く

    if (!ProcessShellCommand(cmdInfo)) // ※
        return FALSE;
    
    m_pMainWnd->ShowWindow( m_nCmdShow ); // 実際は※の行で表示されてしまうの
で、省略しても可
    m_pMainWnd->UpdateWindow();

    return TRUE;
}

ひで 2004/09/28(火) 19:13:54
アイススケーターさん、monkey さん、ご返信ありがとうございます。

私の説明の仕方が不十分だったのだと思いますが、私の質問のポイントは、

"cs.style |= WS_MAXIMIZE; では、なぜ実行方法の違いにより、
          最大化される場合と、されない場合があるのか?" 

です。ウィンドウを最大化するには、monkey さんの方法で可能です。

// ウィンドウの最大化
BOOL CxxxApp::InitInstance()
{

    (省略)

    m_nCmdShow = SW_SHOWMAXIMIZED;

    if (!ProcessShellCommand(cmdInfo))
        return FALSE;
    
    //m_pMainWnd->ShowWindow(SW_SHOW); // .Net 2003 では必ず↓に変更しなければい
けない。
    m_pMainWnd->ShowWindow(m_nCmdShow);

    m_pMainWnd->UpdateWindow();

    return TRUE;
}

とくに、必ず cs.style |= WS_MAXIMIZE; で
ウィンドウを最大化させたいというわけでは無いのですが、
原因が分からず、もやもやしていたので質問させていただきました。

原因がお分かりになる方が居られましたら、ご教授願います。

シャノン 2004/09/29(水) 09:39:30
開発環境から実行している EXE と、直接実行している EXE が違うとかいうポカミスを
たまにやってしまうことがありますが、その辺は大丈夫ですか?

三毛猫 2004/09/29(水) 09:47:04
手元の環境で試してみたところ、
IDEから起動した場合は nCmdShow に SW_SHOW が設定され、
エクスプローラ上から実行した場合は SW_SHOWNORMAL が設定されていました。

なのでエクスプローラ上から実行した場合は
ShowWindow呼び出し時に最大化が解除されているのではないでしょうか。
この辺はショートカットの設定で実行時の大きさを設定できますので、
確実に最大化・最小化などをしたい場合は
ShowWindowで直接指定するべきかと。

# MFCは使ったことがないので良く分かりませんが、
# MFCの場合でも同じ流れですよね。

Bosscat 2004/09/29(水) 10:11:50
前に嵌ったことがあります。

WS_MAXIMIZE | WS_VISIBLE
にすると良い。
何故かは知らない。

ひで 2004/09/30(木) 18:45:20
[[解決]]
シャノンさん、三毛猫さん、Bosscatさん、ご返信ありがとうございます。

> シャノンさん
実行している EXE を間違えているということはありません。

> 三毛猫さん
有益な情報ありがとうございます。
エクスプローラ上から実行した場合は、どうやら最大化が解除されるようですね。
ショートカットの設定でも最大化、最小化の設定ができるわけですから、
エクスプローラ上から実行した場合にも、ウィンドウスタイルが指定される
可能性があると十分考えられますね。

> Bosscat さん
WS_MAXIMIZE | WS_VISIBLE で、うまくいきますか?
私の場合はうまくいきませんでした。

皆様、ありがとうございました。これで、解決にしたいと思います。

以上をまとめておきます。

環境 Win2000 SP4, Visual Studio .Net 2003, MFC, SDI

・エクスプローラ上から実行した場合は、ウィンドウスタイルが変更されてしまい、
  cs.style |= WS_MAXIMIZE; では最大化されなくなる。

・確実に最大化するには、次の様に ShowWindow で直接指定する。

// ウィンドウの最大化
BOOL CxxxApp::InitInstance()
{

    (省略)

    m_nCmdShow = SW_SHOWMAXIMIZED;

    if (!ProcessShellCommand(cmdInfo))
        return FALSE;

    m_pMainWnd->ShowWindow(m_nCmdShow);
    m_pMainWnd->UpdateWindow();

    return TRUE;
}

古いスレッドには追加発言できません。