コントロールボックスについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
源流

コントロールボックスについて

#1

投稿記事 by 源流 » 12年前

今DXライブラリでゲームをウインドウモード作っています。
フォームの最大、最小、閉じるボタンを非表示にしたいのですがどうすればいいでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: コントロールボックスについて

#2

投稿記事 by softya(ソフト屋) » 12年前

ウィンドウハンドルを得て、スタイル変更すれば出来るんですが、閉じるまで無くすと不便では?

コード:

	//	最大・最小・閉じるを無くす。
	HWND hwnd = GetMainWindowHandle();
	DWORD style = GetWindowLong(hwnd, GWL_STYLE);
	SetWindowLong(hwnd, GWL_STYLE, style & ~WS_SYSMENU );
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

てらす

Re: コントロールボックスについて

#3

投稿記事 by てらす » 12年前

DXライブラリには
int SetWindowStyleMode( int Mode );
なんてのもありますよ。
Modeに1か2か4を指定すれば一応、最小化、最大化、閉じるボタンは消えます。(タイトルバーごとですが)
引数による変化をまとめたものも貼っておくので、よろしければ参考にしてください。

コード:

 /*--------------------------------------------------
int SetWindowStyleMode( int Mode ); のMode ※Win7環境
	  縁 タイトル 最小化 最大化 閉じる
	 0 太 ○    ○   無   ○
	 1 太 ‐    ‐   ‐   ‐
	 2 細 ‐    ‐   ‐   ‐
	 3 特 特    ‐   ‐   特  ※全体的に角張っており、タスクバーに表示されない。
	 4 細 ‐    ‐   ‐   ‐  ※タスクバーに表示されない
	 5 細 ○    ‐   ‐   ○
	 6 太 ○    ○   無   ○
	 7 太 ○    ○   ○   ○
	 8 太 ○    ○   ○   ○  ※最大状態から始まる
	 9 細 ○    ○   無   ○
	10 細 ○    ○   ○   ○  ※最大状態から始まる

	無・・・表示されているが無効状態
	‐・・・表示もされていない
--------------------------------------------------*/
余談ですが、私は最小化や閉じるボタンは無効にするとユーザーに嫌われると思っています。
理由は、私がゲームをやるときに、それらが無効だと私自身がイライラするからです。
マウスを使ったアクションゲームでカーソルが画面外に出て行って誤クリックが頻発するなど、
無効にする理由がはっきりしているゲームなら話は別ですが、それでも環境設定で有効無効を選択できるようにして欲しいです。

源流

Re: コントロールボックスについて

#4

投稿記事 by 源流 » 12年前

一応ソフト屋さんの通りにやってみましたがSetWindowStyleModeを消さないと反映されないみたいなので縁の太さが最初は細の9を指定していたのですが標準に戻ってしまいます。どうすればいいでしょうか?

>私は最小化や閉じるボタンは無効にするとユーザーに嫌われると思っています。
私もあまり好きではないのですが、絶対に消えては困るウインドウなのでしょうがなくやっています。
でももう一つのソフトで閉じることができるようになっていますので大丈夫だと思います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: コントロールボックスについて

#5

投稿記事 by softya(ソフト屋) » 12年前

DxLib_Init()後じゃないと私のはダメですがどうでしょうか?
SetWindowStyleMode()は前なのかな?(未検証)
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

源流

Re: コントロールボックスについて

#6

投稿記事 by 源流 » 12年前

すいません。
できていました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: コントロールボックスについて

#7

投稿記事 by softya(ソフト屋) » 12年前

源流 さんが書きました:すいません。
できていました。
どちらをどうしたか書き残してくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

源流

Re: コントロールボックスについて

#8

投稿記事 by 源流 » 12年前

すいません。まだ終わってませんでした。
実際にコンパイルしたときは良かったのですが、exeをダブルクリックして開いた時コントーロールボックスが表示されてしましました。
しかし他のウインドウをアクティブにしてから今開いたウインドウをアクティブにすると消えます。最初から消しておくことはできないのでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: コントロールボックスについて

#9

投稿記事 by softya(ソフト屋) » 12年前

コードの流れが見えませんので回答が困難です。
現在のコードを説明してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

源流

Re: コントロールボックスについて

#10

投稿記事 by 源流 » 12年前

プログラムが長いのでウインドウの設定をDXライブラリの初期化の部分だけ載せます。
コンパイルしたソフトを起動して非アクティブにしてからじゃないとコントロールボックスが消えないのです。

コード:

	// ウインドウモードで起動
	ChangeWindowMode( TRUE );
	SetWindowStyleMode( 9 ) ;


	// DXライブラリの初期化
	if( DxLib_Init() < 0 ) return -1;
    //  最大・最小・閉じるを無くす。
    HWND hwnd = GetMainWindowHandle();
    DWORD style = GetWindowLong(hwnd, GWL_STYLE);
    SetWindowLong(hwnd, GWL_STYLE, style & ~WS_SYSMENU );

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: コントロールボックスについて

#11

投稿記事 by softya(ソフト屋) » 12年前

両方書いたんですね。片方だけにしたらどうなりますか?
ちなみに私のやつは試した時に一拍遅れて反応してました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

てらす

Re: コントロールボックスについて

#12

投稿記事 by てらす » 12年前

源流 さんが書きました:私もあまり好きではないのですが、絶対に消えては困るウインドウなのでしょうがなくやっています。
でももう一つのソフトで閉じることができるようになっていますので大丈夫だと思います。
なるほど、もう一つのソフトというのに若干の違和感を感じますが2つのウィンドウを持つゲームなんですね。
それならひとつのウィンドウの閉じるボタンが無効なのも納得です。
softya(ソフト屋) さんが書きました:SetWindowStyleMode()は前なのかな?(未検証)
SetWindowStyleMode()はDxLib_Init()の前でも後でもいけるはずです。
ソフト屋さんの方法とSetWindowStyleMode()を組み合わせる場合は、
「SetWindowStyleMode()→DxLib_Init()→SetWindowLong()」でうまいこと行くようです。
源流 さんが書きました:exeをダブルクリックして開いた時コントーロールボックスが表示されてしましました。
DxLib_Init()からSetWindowLong()まではタイムラグがあるので、一瞬だけ各ボタンやコントロールボックスが表示されますがそのことでしょうか?
もしそれのことでしたら、残念ながら自前のウィンドウを用意するしか方法はないように思います。
ちなみに、一瞬表示されるボタンは多分押せない(カーソルが砂時計状態になる)ので、見えてても効果はないはずです。

追記:
書き込みが前後してしまいました。申し訳ない・・・
とりあえずソフト屋さんの質問に対する回答を待ちます。

源流

Re: コントロールボックスについて

#13

投稿記事 by 源流 » 12年前

ソフト屋さん
私の場合は一泊じゃなくて他のウインドウをアクティブにしないと何時まで経っても変わりません。
ボタンは無効化しているのですが、非表示になっていません。
どちらも片方ずつやってみましたがダメでした。
私の環境はwindows7でスタイルはクラシックです。
最初から消えてないと見た目がどうも納得いきません。

テラスさん
他のウインドウをアクティブにしないと何時まで経っても変わりません。
どうしてでしょうか。
私のパソコンが変なのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: コントロールボックスについて

#14

投稿記事 by softya(ソフト屋) » 12年前

アクティブなウィンドウしかボタンは消えないと思いますが、そういう状況でしょうか?
2つのウィンドウがどういう関係に成っているか分からないので曖昧な答えしか返答できませんが、2つウィンドウが有るのが原因ではないかと思います。

【補足】やめろとかそんな話じゃなくて、発生の条件を確定してほしいのです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: コントロールボックスについて

#15

投稿記事 by ISLe » 12年前

SetWindowLongでウィンドウスタイルを変更したあとは、SetWindowPosを使ってフレームの再描画をリクエストする必要があると思います。

SetWindowLongの直後に
SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED | SWP_DRAWFRAME);
を入れてみてください。

ちなみにボタンを無くしてもユーザー操作できないようになるだけです。
機能そのものが無くなるわけではないので、対策しなくても良いということにはなりません。

源流

Re: コントロールボックスについて

#16

投稿記事 by 源流 » 12年前

ISLeさん
ありがとうございました!!
出来ました!!


完成したプログラムです。(コントロール非表示のみ)

コード:


	// ウインドウモードで起動
	ChangeWindowMode( TRUE );
	SetWindowStyleMode( 9 ) ;


	// DXライブラリの初期化
	if( DxLib_Init() < 0 ) return -1;
    //  最大・最小・閉じるを無くす。
    HWND hwnd = GetMainWindowHandle();
    DWORD style = GetWindowLong(hwnd, GWL_STYLE);
    SetWindowLong(hwnd, GWL_STYLE, style & ~WS_SYSMENU );
	SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED | SWP_DRAWFRAME);

ソフト屋さん
とりあえずなんでもいいので最小化でもいいので非アクティブにしないとコントロールが非表示にならないということでした。

皆さん有難う御座いました。

最後になんですけど、SetWindowLongとかSetWindowPosとかは皆さんはどのように習得したのでしょうか。
ネットで探してもなかなか見つからないと思うのですが・・・私はなかなか見つけられなかった。
何か良いサイトでもあるのでしょか?

アバター
spaaaark・∀・
記事: 66
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: コントロールボックスについて

#17

投稿記事 by spaaaark・∀・ » 12年前

横入り失礼しますorz

DxLibにはリファレンスに載っている関数以外にも大量の関数が用意されています。
DxLibの場合、これらの関数はDxLib.hファイルからこれらの関数、#defineマクロを直接確認することが可能です。
各関数にはコメントが割り振られていますので、検索機能で目的を検索し、関数を探すことも可能だったりします。

さて、そのDxLib.hですが、VC++の場合であればライブラリの関数上でF12を押していただければ、すぐ出てきますよ。
今まで知らなかった機能もあると思うので、ぜひ一度ご覧になってみてはどうでしょうか。
クリエイティブな生活で刺激的な毎日を!

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: コントロールボックスについて

#18

投稿記事 by ISLe » 12年前

源流 さんが書きました:最後になんですけど、SetWindowLongとかSetWindowPosとかは皆さんはどのように習得したのでしょうか。
ネットで探してもなかなか見つからないと思うのですが・・・私はなかなか見つけられなかった。
何か良いサイトでもあるのでしょか?
「ウィンドウスタイル 変更」でググるといっぱい見付かります。

てらす

Re: コントロールボックスについて

#19

投稿記事 by てらす » 12年前

クラシックなんですね。それだと確かに、私の環境でもアクティブを移さないとボタンは消えませんでした。
これについてはISLeさんの方法で改善できると思いますが、どうしてもボタンは一瞬表示されてしまいます。

最初から消えていないと納得できないのでしたら、ウィンドウの作成をDXライブラリに任せるのではなく、自前のウィンドウとメッセージ処理を用意して
int SetUserWindow( HWND WindowHandle ) ;
を利用するのが一番はやいのではないでしょうか。

SetUserWindow()についての参考になりそうなURLも貼っておきます。
DXライブラリプログラム&プログラム質問掲示板:子ウインドウでDxLibを…
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=1556

P.S.
このレスを書いている途中で解決されたようですね。
無事に解決できて何よりなんですが、せっかく書いたので投稿させていただきます。
最後に編集したユーザー てらす on 2013年8月02日(金) 22:53 [ 編集 1 回目 ]

源流

Re: コントロールボックスについて

#20

投稿記事 by 源流 » 12年前

皆さん有難う御座いました。
これで、最後の解決とします。
ありがとうございました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: コントロールボックスについて

#21

投稿記事 by softya(ソフト屋) » 12年前

SetWindowLongとかSetWindowPosはWindowsAPIの関数ですね。
DXLIB内部では、WindowsAPIとDirectXが動作していますので内部の動作まで手を出すと知識が必要になります。

あれ?遅かったですか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

源流

Re: コントロールボックスについて

#22

投稿記事 by 源流 » 12年前

ソコまでなると大変ですね。
WindowsAPIをかは知っておいたほうがいいですよね。
ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る