ボタンによって、ウインドウスタイルを変更するには?

解決


陸奥  2003-10-31 02:36:59  No: 52361

VC++6.0です。

初期起動時は最小化・最大化・サイズ変更が不可能なダイアログで
ウインドウの中にあるボタンを押すと最小化・最大化・サイズ変更
が可能なダイアログに変更するようなアプリケーションを作りたい
のですが、どうやればいいのかさっぱりです。。

どなたかご教授ください。


ヘンゼルの記憶  URL  2003-10-31 19:15:00  No: 52362

初めまして。
ヘンゼルの記憶といいます。

VC++6.0 + MFC で試してみました。
最大化/最小化ボタンがなく、「サイズ変更枠」でもないダイアログにボタンを4つ配置、それぞれのハンドラにて

最大化
    ShowWindow( SW_SHOWMAXIMIZED );
最小化
    ShowWindow( SW_SHOWMINIMIZED );
元のサイズに戻す
    ShowWindow( SW_RESTORE );
サイズ変更(縦横10拡大)
    RECT  rect;
    GetWindowRect( &rect );
    rect.right += 10;
    rect.bottom += 10;
    MoveWindow( &rect );

を記述したところ、正常に動作しました。

  おそらく MFC を使わない場合でも同等(同名?)のAPIにウィンドウハンドルを渡して呼び出すことで実現できると思われますが、MFC なしでは生きていけない(?)人間なので確認についてはご容赦を。

  …とこんな感じでよろしいでしょうか?


三毛猫  2003-10-31 20:54:37  No: 52363

GetWindowLong、SetWindowLong を使うと
ウィンドウスタイルの取得・変更が出来ます。
ウィンドウスタイルの WS_MAXIMIZEBOX、WS_MINIMIZEBOX、WS_THICKFRAME を
変更してください。

スタイルを変えた後、 SetWindowPos に SWP_FRAMECHANGED フラグを
指定して呼び出すと変更が適用されます。


陸奥  2003-11-01 10:26:44  No: 52364

>>ヘンゼルの記憶さん
>>三毛猫さん

解答していただき、ありがとうございます。

>ヘンゼルの記憶さん
その方法で確かに動作したのですが、私がやりたいのとは少し違っていました^^;
ユーザーがD&Dでサイズを変更できないものからボタンを押すことによって変更できるものにしたいのです^^;

>>三毛猫さん
よろしければサンプルソースを書いてくれませんでしょうか?
あつかましいとは思いますが、未熟なものでうまくいきません。

どうかよろしくお願いいたします。


愚暗  2003-11-01 21:14:09  No: 52365

システムメニューに SC_MAXIMIZE や SC_SIZE が入っているかどうかで
実際に最大化やサイズ変更ができるかどうかが決まるようです。
GetSystemMenu(TRUE);
をお試しください。


陸奥  2003-11-04 09:18:46  No: 52366

出張などのため、返事が遅れてしまい申し訳ありません。

>>愚暗さん
解答ありがとうございます。

ですが、やっぱりうまくいきません。。
やはり私には無理なのでしょうか…。


愚暗  2003-11-04 10:13:54  No: 52367

ダイアログにシステムメニューは付いていますか?
システムメニューの内容を変更するためには、
WS_SYSMENU スタイルが含まれていなければなりません。
(一時的に付加するだけでも構いません)

もし WS_SYSMENU スタイルが含まれていて、三毛猫 さんの方法で
ダイアログの外観を変更し、更にシステムメニューの内容を
変更したにもかかわらずサイズ変更ができないなら、
なぜうまく行かないのか、興味がありますので、
うまく行かないコードを提示して頂けませんか?


ヘンゼルの記憶  URL  2003-11-04 19:01:15  No: 52368

失礼致しました。
質問を読み誤っていたようです。

ついでなので試してみました。
例によって VC++6.0 + MFC ですが(^^;

その1
最初からダイアログに「サイズ変更枠」をつけて作成。
メニューには「サイズ変更」が自動的に付く(リソースエディタが処理?)。
ボタンのハンドラ−にて、
    ModifyStyle( 0, WS_THICKFRAME ); // サイズ変更枠不可
または
    ModifyStyle( WS_THICKFRAME, 0 ); // サイズ変更枠除去
で、「サイズ変更可能」←→「サイズ変更不可能」を切り替えることが出来ました。

その2
通常の「ダイアログ枠」で作成。
ボタンのハンドラ−にて、
    ModifyStyle( 0, WS_THICKFRAME ); // サイズ変更枠不可
または
    ModifyStyle( WS_THICKFRAME, 0 ); // サイズ変更枠除去
で、はマウスカーソルは端で「サイズ変更可能」になるのですが、実際にはドラッグできず。

その3
通常の「ダイアログ枠」で作成。
    ModifyStyle( 0, WS_THICKFRAME ); // サイズ変更枠不可
    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if(pSysMenu != NULL) 
    {
        pSysMenu->AppendMenu( MF_STRING, SC_SIZE, "サイズ変更(&S)" );
    }
または
    ModifyStyle( WS_THICKFRAME, 0 ); // サイズ変更枠除去
    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if(pSysMenu != NULL)
    {
        pSysMenu->RemoveMenu( SC_SIZE, MF_BYCOMMAND );
    }
で、「サイズ変更可能」←→「サイズ変更不可能」を切り替えることが出来ました。

その4
通常の「ダイアログ枠」「システムメニューなし」で作成。
ボタンのハンドラ−にて、
    ModifyStyle( 0, WS_THICKFRAME ); // サイズ変更枠不可
または
    ModifyStyle( WS_THICKFRAME, 0 ); // サイズ変更枠除去
で、「サイズ変更可能」←→「サイズ変更不可能」を切り替えることが出来ました。

MFC使用での結果ですので、違うかもしれませんが参考までに。
なお OS で動作が異なることがあるかどうかは知りません。こちらは Win2k です。


ヘンゼルの記憶  URL  2003-11-04 20:11:12  No: 52369

申し訳ありません、校正漏れです。
>   ModifyStyle( 0, WS_THICKFRAME ); // サイズ変更枠不可

>   ModifyStyle( 0, WS_THICKFRAME ); // サイズ変更枠付加
と読み替えてください。


陸奥  2003-11-05 07:52:41  No: 52370

>>愚暗さん
助言していただき、ありがとうございます。
システムメニューをつけずにやっていました^^;

>>ヘンゼルの記憶さん
ModifyStyleでできました!
ありがとうございます。

>>ヘンゼルの記憶さん
>>三毛猫さん
>>愚暗さん

質問にお答えしてくださり、まことにありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加