ダイアログボックスを常にアクティブ状態にする方法について

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

ダイアログボックスを常にアクティブ状態にする方法について

#1

投稿記事 by プロトタイプるるん » 6年前

win32apiとC++で、ダイアログボックスを使ったGUIアプリを作っています。


デバッグをしてみたのですが他のウィンドウをクリックすると、
ダイアログボックスが薄く表示されてウィンドウの背後へ隠れてしまいます。

コード:

 
ダイアログのプロシージャで、

case WM_COMMAND:
wmId = LOWORD( wParam );// パラメータ数値を代入

			switch ( wmId )
			{
				case IDM_EXIT:// アプリケーション終了
					EndDialog( hWnd, IDOK );
					break;

				case IDM_BEFORE:// 常に手前に表示
					// チェックされているかチェック
					uState = GetMenuState( hMenu, IDM_BEFORE, MF_BYCOMMAND );
					if( uState & MFS_CHECKED )
					{
						// チェックされてたからはずす
						CheckMenuItem( hMenu, IDM_BEFORE, MF_BYCOMMAND | MFS_UNCHECKED );// メニューのチェックマークの表示を変更
						SetWindowPos( hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );// 常に手前じゃない
					
					}
					else
					{
						// チェックされてなかったからチェックする
						CheckMenuItem( hMenu, IDM_BEFORE, MF_BYCOMMAND | MFS_CHECKED );// メニューのチェックマークの表示を変更
						SetWindowPos( hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );// 手前に表示
					EnableWindow( hWnd, TRUE );
					}
					break;

 

プロトタイプるるん

Re: ダイアログボックスを常にアクティブ状態にする方法について

#2

投稿記事 by プロトタイプるるん » 6年前

すいません。
入力途中で書き込みをしてしまいました。

改めてこちらの書き込みさせて頂きます。

プロトタイプるるん

Re: ダイアログボックスを常にアクティブ状態にする方法について

#3

投稿記事 by プロトタイプるるん » 6年前

c++とwin32apiでダイアログボックスを使ったGUIアプリケーションを作っています。

他のウィンドウをクリックした時でも、
ダイアログボックスが薄く表示されずに常にアクティブ状態のような表示になっているアプリケーションをみて、
自分のプログラムもそうしたく思いググッてみたのですが、いい関数がみつかりませんでした。

試しに今作っているものをデバッグして他のウィンドウをクリックしてみると、
ダイアログボックスがそのウィンドウの背後に隠れて、薄い表示になりました。
これはアクティブ状態ではないからでしょうか?

試しに、

コード:

 
SetWindowPos( hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );// 常に手前に表示
これを入れてみたのですが、常に手前に表示されるだけで他のウィンドウをクリックすると、
ダイアログボックスが薄く表示されてしまいます。

ダイアログボックスを常にアクティブ状態にする関数、または方法はないでしょうか?
よろしくお願いいたします。

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: ダイアログボックスを常にアクティブ状態にする方法について

#4

投稿記事 by へにっくす » 6年前

アクティブにできるウィンドウは一つだけです。
なぜなら入力できるウィンドウも一つだけだからです。
貴方が何人もいて、同時にそれぞれ別のウィンドウに入力するようなことができないことと同じです。

なので、
| ダイアログボックスが薄く表示されずに常にアクティブ状態のような表示になっているアプリケーションをみて、
これはおそらく自前で描画しているからです。
アクティブが外れた状態を描画していないからそう見えるだけだと思います。
written by へにっくす

アバター
へろりくしょん
記事: 92
登録日時: 9年前
住所: 福岡

Re: ダイアログボックスを常にアクティブ状態にする方法について

#5

投稿記事 by へろりくしょん » 6年前

やりたい事がちょっと分かりません。

単純に、見た目の問題なのか。 それとも、システムモーダルなダイアログを作りたいのか。

前者の場合は、WM_NCPAINT あたりを処理すれば良いのでは。

後者の場合は、昔は SetSysModalWindow() API で出来たのですが、今時の Windows はシステムモーダルなんて根本的に存在しません。
ので、どうしてもやりたいと言うのであれば、システムフックをかけて他のアプリケーションがフォーカスを受け取れないようにする。
とか、ちょっと泥臭い事をすれば可能じゃないでしょうか。

プロトタイプるるん

Re: ダイアログボックスを常にアクティブ状態にする方法について

#6

投稿記事 by プロトタイプるるん » 6年前

>アクティブにできるウィンドウは一つだけです。
>なぜなら入力できるウィンドウも一つだけだからです。

アクティブにできるウィンドウは1つだけなんですね。
勉強になりました。

非アクティブの時は処理がとまって、アクティブにすると処理が動くという
アプリケーションを思い出してしまったのが悪かったです。

参考にしたアプリケーションは時間を表示するもので、
他のウィンドウをクリックした状態でも
時間の数値が更新されて表示し続けていたのでアクティブになっていると思ってしまいました。

よーくみてみると他のウィンドウがアクティブの時は、縁の部分が薄く表示されていました。

自分の勘違いでした。へろりんごさん、へにっくすさんありがとうございました。

閉鎖

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