ウィンドウの最大化 – プログラミング – Home

通知
すべてクリア

[解決済] ウィンドウの最大化


ひで
 ひで
(@ひで)
ゲスト
結合: 23年前
投稿: 12
Topic starter  

環境は 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 でプログラムを実行すると、ウィンドウは最大化されるのですが、
実行ファイルを直接ダブルクリックして実行すると、ウィンドウは最大化されません。

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

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


引用未解決
トピックタグ
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 22年前
投稿: 280
 

他のスタイルのフラグがONしているからではないですか。
例えば、WS_MINIMIZEがONになっていたらOSはどう表示して良いか迷うでしょう。
スタイルの初期値は既に何らかの値が入っています。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 22年前
投稿: 280
 

ごめんなさい。私が、勘違いしているみたいです。
別の原因のようです。

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


返信引用
monkey
 monkey
(@monkey)
ゲスト
結合: 21年前
投稿: 70
 

起動時のフレームウィンドウの表示方法(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;
}


返信引用
ひで
 ひで
(@ひで)
ゲスト
結合: 23年前
投稿: 12
Topic starter  

アイススケーターさん、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; で
ウィンドウを最大化させたいというわけでは無いのですが、
原因が分からず、もやもやしていたので質問させていただきました。

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


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

開発環境から実行している EXE と、直接実行している EXE が違うとかいうポカミスを
たまにやってしまうことがありますが、その辺は大丈夫ですか?


返信引用
三毛猫
 三毛猫
(@三毛猫)
ゲスト
結合: 22年前
投稿: 7
 

手元の環境で試してみたところ、
IDEから起動した場合は nCmdShow に SW_SHOW が設定され、
エクスプローラ上から実行した場合は SW_SHOWNORMAL が設定されていました。

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

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


返信引用
Bosscat
 Bosscat
(@Bosscat)
ゲスト
結合: 23年前
投稿: 73
 

前に嵌ったことがあります。

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


返信引用
ひで
 ひで
(@ひで)
ゲスト
結合: 23年前
投稿: 12
Topic starter  

シャノンさん、三毛猫さん、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;
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました