C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: コントロールが入力を受付ないようにするにはどうしたらいい?


(過去ログ 35 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■17261 / inTopicNo.1)  コントロールが入力を受付ないようにするにはどうしたらいい?
  
□投稿者/ オオカミ (1回)-(2008/04/20(Sun) 21:01:51)

分類:[.NET 全般] 

2008/04/20(Sun) 21:02:29 編集(投稿者)
2008/04/20(Sun) 21:02:20 編集(投稿者)

お世話になっております。オオカミといいます。
開発環境:VS2005 SP1  使用言語:C#(.Net FrameWork2.0)

モードレスダイアログに対して、その中にある全てのコントロールが入力を受け付けないようにする必要があります。グレイアウトするのが最も簡単な方法ですが、有効なったり無効になったりすると見た目上ちらつくように見えてしまうので、それ以外の方法をご教授ください。

イメージ的には、ボタンが押されても凹まない、ラジオボタンがクリックされてもON/OFFが切り替わらないという効果がほしいです。
ここで質問する前に以下のように考えましたが、それぞれの欠点があるため却下しました。
案1:隠れたモーダルダイアログを作ってそこにフォーカスをおく。
案1の欠点:現在のダイアログがフォーカスを失ってしまうためやはり見た目上が良くない。
案2:各UIに対してMouseなどの操作系イベントのハンドラをオーバーライドする
案2の欠点:Mouse以外にキーボード操作もあり、全てのイベントハンドラをオーバーライドするのが大変である。
勉強不足で大変申し訳ありませんが、どなたかご教授お願いいたします。

引用返信 編集キー/
■17262 / inTopicNo.2)  Re[1]: コントロールが入力を受付ないようにするにはどうしたらいい?
□投稿者/ やじゅ (311回)-(2008/04/20(Sun) 22:16:59)
やじゅ さんの Web サイト
2008/04/20(Sun) 23:01:20 編集(投稿者)
2008/04/20(Sun) 22:57:39 編集(投稿者)

No17261 (オオカミ さん) に返信

> イメージ的には、ボタンが押されても凹まない、ラジオボタンがクリックされても
> ON/OFFが切り替わらないという効果がほしいです。
>

案2ではあるのですが、
WndProcをオーバーライドして、すべての処理を無効にしてみてはいかがでしょうか
↓はマウス右と左を処理分けしてますが、処理分けしなければいいかなと
http://bbs.wankuma.com/index.cgi?mode=al2&namber=10826&KLOG=24

引用返信 編集キー/
■17263 / inTopicNo.3)  Re[1]: コントロールが入力を受付ないようにするにはどうしたらいい?
□投稿者/ 倉田 有大 (203回)-(2008/04/20(Sun) 22:44:24)
No17261 (オオカミ さん) に返信
> 2008/04/20(Sun) 21:02:29 編集(投稿者)
> 2008/04/20(Sun) 21:02:20 編集(投稿者)
>
> お世話になっております。オオカミといいます。
> 開発環境:VS2005 SP1  使用言語:C#(.Net FrameWork2.0)
>
> モードレスダイアログに対して、その中にある全てのコントロールが入力を受け付けないようにする必要があります。グレイアウトするのが最も簡単な方法ですが、有効なったり無効になったりすると見た目上ちらつくように見えてしまうので、それ以外の方法をご教授ください。
>
> イメージ的には、ボタンが押されても凹まない、ラジオボタンがクリックされてもON/OFFが切り替わらないという効果がほしいです。
> ここで質問する前に以下のように考えましたが、それぞれの欠点があるため却下しました。
> 案1:隠れたモーダルダイアログを作ってそこにフォーカスをおく。
> 案1の欠点:現在のダイアログがフォーカスを失ってしまうためやはり見た目上が良くない。
> 案2:各UIに対してMouseなどの操作系イベントのハンドラをオーバーライドする
> 案2の欠点:Mouse以外にキーボード操作もあり、全てのイベントハンドラをオーバーライドするのが大変である。
> 勉強不足で大変申し訳ありませんが、どなたかご教授お願いいたします。

フォームのコントロール、すべてenable = false
とかじゃだめなんでしょうか?
引用返信 編集キー/
■17264 / inTopicNo.4)  Re[2]: コントロールが入力を受付ないようにするにはどうしたらいい?
□投稿者/ やじゅ (312回)-(2008/04/20(Sun) 23:05:06)
やじゅ さんの Web サイト
No17263 (倉田 有大 さん) に返信
> フォームのコントロール、すべてenable = false
> とかじゃだめなんでしょうか?
>

フォーム内のコントロールが全てグレー化されますが、
ちらつきが問題にならなければ、この方法でもいいかもね。
引用返信 編集キー/
■17265 / inTopicNo.5)  Re[3]: コントロールが入力を受付ないようにするにはどうしたらいい?
□投稿者/ れい (499回)-(2008/04/21(Mon) 04:00:44)
No17264 (やじゅ さん) に返信
> ■No17263 (倉田 有大 さん) に返信
>>フォームのコントロール、すべてenable = false
>>とかじゃだめなんでしょうか?
> >
>
> フォーム内のコントロールが全てグレー化されますが、
> ちらつきが問題にならなければ、この方法でもいいかもね。

フォームのコントロール全てにenable=falseするなら
Form.Enable = Falseのほうがいいかと。

案3 透明な窓を作って重ねる

案4 表示されてるフォームをキャプチャしてそのイメージを貼り付けたPictureBoxを上から重ねる

案5 メッセージをフックして殺す

案6 Form.Enable = Falseしたうえでシステムの「無効時の色」を変更する

んんー
ろくな案がないですね。
引用返信 編集キー/
■17306 / inTopicNo.6)  Re[4]: コントロールが入力を受付ないようにするにはどうしたらいい?
□投稿者/ オオカミ (2回)-(2008/04/21(Mon) 22:56:05)
お世話になっております。
オオカミです。
皆さんの御意見、どうもありがとうございました。

>>倉田さん、やじゅさん
グレイアウト方針を採ると、ちらつきがどうしても発生しますので、
見た目上格好がよくないですよ。

>>レイさん
案3と案4が面白そうですね。やってみたいと思います。

皆さん、ありがとうございました。
解決済み
引用返信 編集キー/
■17317 / inTopicNo.7)  Re[5]: コントロールが入力を受付ないようにするにはどうしたらいい?
□投稿者/ れい (501回)-(2008/04/22(Tue) 05:43:21)
No17306 (オオカミ さん) に返信
> >>倉田さん、やじゅさん
> グレイアウト方針を採ると、ちらつきがどうしても発生しますので、
> 見た目上格好がよくないですよ。

格好悪いほどちらつきが起こる状況ってのが
異常だと思います。

1秒間に10回切り替える、とかやってるのですか?

引用返信 編集キー/
■17319 / inTopicNo.8)  Re[6]: コントロールが入力を受付ないようにするにはどうしたらいい?
□投稿者/ 特攻隊長まるるう (125回)-(2008/04/22(Tue) 09:36:22)
No17306 (オオカミ さん) に返信
> >>倉田さん、やじゅさん
> グレイアウト方針を採ると、ちらつきがどうしても発生しますので、
> 見た目上格好がよくないですよ。

脱線ですが、ボクもグレイアウト方針です。

よっぽどコントロールを多く貼ったり、スプレッド系の描画処理が
重いコントロールを使ってるとかでないとちらつきは気になりませんが、
見た目上同じなのに入力できないほうが『どうして?』って問い合わせが
多いのでグレイアウトを使います。

解決済み
引用返信 編集キー/
■17425 / inTopicNo.9)  Re[7]: コントロールが入力を受付ないようにするにはどうしたらいい?
□投稿者/ オオカミ (3回)-(2008/04/23(Wed) 23:06:12)
オオカミです。

切り替わりは、
早い場合に1秒間数回、
遅い場合数秒間1回でやっています。
早いか遅いかが事前に分からないので、
ちらつきを防ぐために、
グレイアウトせずに、代わりにカーソルを砂時計にし、
入力できないようにしようと考えています。
引用返信 編集キー/
■17441 / inTopicNo.10)  Re[8]: コントロールが入力を受付ないようにするにはどうしたらいい?
□投稿者/ れい (508回)-(2008/04/24(Thu) 10:26:37)
No17425 (オオカミ さん) に返信
> オオカミです。
>
> 切り替わりは、
> 早い場合に1秒間数回、
> 遅い場合数秒間1回でやっています。
> 早いか遅いかが事前に分からないので、
> ちらつきを防ぐために、
> グレイアウトせずに、代わりにカーソルを砂時計にし、
> 入力できないようにしようと考えています。

あー。それは厳しいですね…。
理由は知りませんが、異常なシチュエーションなわけですね。

グレイアウトするのは入力できないことを明示するためで、
100msecやそこらでは普通入力できないので、
そこまでちらつきは考慮されていない、と。

WinFormの設計がそういう入力を考慮してない、ともいえます。
とすると、だいぶ工夫しないとダメなのは当然ですよね。

本当にその設計でいいのか、考慮してみる価値はあるかと。

で、それでもそうせざるを得ないのなら、
「ごまかす」か「より低レベルから自分で作る」の2択になりますね。

ごまかすなら、
前にいったような手はありますが…。
ごまかしているので、
将来にわたって動くか、他のOSでも動くのか、
そういったことがかなり不安です。

より低レベルから自分でつくるなら、
ボタンやテキストボックスみたいなコントロールで、
切り替えてもチラつかないようなものを自分で作ることになります。

いずれにせよ、いろいろ問題ですよね。

そんなに高速な切り替えが必要でないように、設計を変えられれば一番です。

例えば。
そんなに高速に切り替えてもどうせ入力できないのですから、
モードレスダイアログは「入力できるかどうか」問い合わせるというのはどうですか?
1秒に1回問い合わせれば大体用は足りるのでは?
引用返信 編集キー/
■17508 / inTopicNo.11)  Re[9]: コントロールが入力を受付ないようにするにはどうしたらいい?
□投稿者/ オオカミ (4回)-(2008/04/26(Sat) 01:32:21)
オオカミです。
いつもお世話になっております。

> で、それでもそうせざるを得ないのなら、
> 「ごまかす」か「より低レベルから自分で作る」の2択になりますね。
>
> ごまかすなら、
> 前にいったような手はありますが…。
> ごまかしているので、
> 将来にわたって動くか、他のOSでも動くのか、
> そういったことがかなり不安です。
その通りです。
ごまかしがよくないと思います。
実装が楽になるかもしれないですが、
今後のメンテを考えると、トータルでは損すると思います。

> より低レベルから自分でつくるなら、
> ボタンやテキストボックスみたいなコントロールで、
> 切り替えてもチラつかないようなものを自分で作ることになります。
この方針で行こうとしています。
ほぼ決定ですね。

> そんなに高速な切り替えが必要でないように、設計を変えられれば一番です。
>
> 例えば。
> そんなに高速に切り替えてもどうせ入力できないのですから、
> モードレスダイアログは「入力できるかどうか」問い合わせるというのはどうですか?
> 1秒に1回問い合わせれば大体用は足りるのでは?

高速に切り替えるときは、
確かにテキストの入力などができないですが、ボタンの連打は発生し得ます。
更に、ラジオボタン・トラックバーの操作なども可能だと思います。
ある事情によって、一つ前の操作が終わるまで次の操作が発生してはいけないので、今回のように苦労しているわけですね。

引用返信 編集キー/
■17512 / inTopicNo.12)  Re[10]: コントロールが入力を受付ないようにするにはどうしたらいい?
□投稿者/ 渋木宏明(ひどり) (718回)-(2008/04/26(Sat) 08:59:25)
渋木宏明(ひどり) さんの Web サイト
>格好悪いほどちらつきが起こる状況ってのが
>異常だと思います。

同感。実物見てないのでアレですが、そもそもこういう状況が発生するような UI 設計を避けるべきと思います。

> グレイアウト方針を採ると、ちらつきがどうしても発生しますので、
> 見た目上格好がよくないですよ。

そう頻繁に enable/disable が切り替わったとしても、どうせそんな状況でまともな入力なんかできるわけないですよね。

であれば、タイマでも使って disable → enable の遷移を適当に遅延させてみるとか。(disable → disable の時はタイムアウト延長)
引用返信 編集キー/
■17516 / inTopicNo.13)  Re[11]: コントロールが入力を受付ないようにするにはどうしたらいい?
□投稿者/ 出水 (37回)-(2008/04/26(Sat) 14:09:15)
何かが入力不能になったとしても、画面まで入力不能にする必要はないと思います

時間が経てば入力可能になるなら、常時入力可能にしておいて
入力可能になったタイミングで入力したものとみなして処理をすればよいかな、と

むしろ、ボタンを押したのにそのタイミングで入力禁止になってしまい
押したつもりなのに操作が完了していない、という事態のほうがはるかに問題かと…

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -