前回は、新しく表示するモニタがモニタ外であれば、モニタ内に表示しようでしたが、今回はそもそも最初に表示するモニタがモニタ外で会った時の対処法を考えたいと思います。
背景
今作っている(仕事で)ソフトが、閉じられた位置を記録して、次の起動時に同じ位置で表示するように作っています。The 気遣いwww
今作っているソフトは人から人へ渡されていきますので、Aさんがデュアルディスプレイで、渡されたBさんはシングルディスプレイだった時、ソフトがモニタ外に表示されどうしようもなくなってしまう可能性があります。
人によっては、「運用でどうにかしよう!!」っていう人もいますが、分かっていてソフトで対応しないのは、いささか違うような気がします。
前回の方法を応用して、課題をクリアにしたいと思います。
モニタ内に表示されているか確認する
前回同様に、モニタの情報を取得し、フォームがモニタ内の有無を確認しましょう。
public frmMain()
{
//デザイナーの初期化
InitializeComponent();
int x = 3000; //表示する位置 X
int y = 5000; //表示する位置 Y
foreach (Screen scr in Screen.AllScreens)
{
if (scr.WorkingArea.Contains(x,y) == true)
{
//モニタ内
}
else
{
//モニタ外
}
}
//指定位置にフォームを表示
this.StartPosition = FormStartPosition.Manual;
this.Location = new Point(x, y);
}
Containsを使って判断です。今回は左側が少しでもモニタ内であればOKとします。
フォームが全てのモニタ内に入っていない時の処理
考え方として、フォームがモニタ内であればOKなので、Containsの結果がTrueであればループを抜けましょう。
モニタ外であれば、ループを回し続けます。
ループが回り切った時に、どのモニタにもフォームが属していない時は、表示位置を原点にしましょう。
public frmMain()
{
//デザイナーの初期化
InitializeComponent();
bool IsMonitor = false; //モニタに属してるときTrueにする
int x = 3000; //表示する位置 X
int y = 5000; //表示する位置 Y
foreach (Screen scr in Screen.AllScreens)
{
if (scr.WorkingArea.Contains(x,y) == true)
{
//モニタ内
IsMonitor = true;
break;
}
else
{
//モニタ外
}
}
//どのモニタにも属していない時
if(IsMonitor == false)
{
x = y = 0;
}
//指定位置にフォームを表示
this.StartPosition = FormStartPosition.Manual;
this.Location = new Point(x, y);
}
ループの前にbool型の変数(IsMonitor)を定義し、モニタ内で会った時は、Trueにして抜けます。
ループが抜けきった時に、IsMonitorがFalseのままの時は、メインフォームがどのモニタにも表示されていない事になるので、確実に表示できる位置に設定しなおしましょう。(今回の場合は原点)
まとめ
モニタ情報を取得して、モニタ内に有るか無いかの判定を使って、課題をクリアにしました。
今回はよく使うフラグ処理の考え方の方が大事です。
回数が分からないループ内に1つでも欲しい情報が有るか無いかの判定では、ループ前にフラグを設定し、ループで条件一致があればフラグを立てる。そして、ループが終わった後に、フラグの確認をして、ループ内に条件一致したものが1つ以上あったかを判別できます。
次回は、途中の迷路の続きをやりたいと考えているのですが、ちょいちょい小ネタをはさみながら迷路は作っていきたいと思います。
業務でプログラミング(C#/VB/Python)を作っている。
挫折を何回も繰り返し、幾度の壁を乗り越えてきた。
乗り越えてきた事を忘れないように記録に残す。
同じ思いをしている人への情報提供になれたらと思う。
基本は初心者に向けたプログラムの情報を提供する。
コメント