Form.ShowDialog()を使用してダイアログフォームを開くとき、アプリケーションの残りの部分を灰色の陰で暗くしたいと思います。
私自身の調査によると、背景が黒で不透明度が100%未満のフチなしのフォームを開く方法のようですが、すべての要素をまとめたわけではありません。 。
どんな提案も役に立ちます。ありがとう。
これは、開いているフォームを、フチなしで同じサイズの別のフォームでオーバーレイすることによって行うのが最適です。これにより、コントロールやタイトルバーを含め、フォーム全体を無効に見せることができます。プロジェクトに新しいクラスを追加し、次のコードを貼り付けます。
using System;
using System.Drawing;
using System.Collections.Generic;
using System.Windows.Forms;
class DialogOverlay : IDisposable {
public DialogOverlay() {
var cnt = Application.OpenForms.Count;
for (int ix = 0; ix < cnt; ++ix) {
var form = Application.OpenForms[ix];
var overlay = new Form { Location = form.Location, Size = form.Size, FormBorderStyle = FormBorderStyle.None,
ShowInTaskbar = false, StartPosition = FormStartPosition.Manual, AutoScaleMode = AutoScaleMode.None };
overlay.Opacity = 0.3;
overlay.BackColor = Color.Gray;
overlay.Show(form);
forms.Add(overlay);
}
}
public void Dispose() {
foreach (var form in forms) form.Close();
}
private List<Form> forms = new List<Form>();
}
そして、次のように使用します。
private void DialogButton_Click(object sender, EventArgs e) {
using (new DialogOverlay())
using (var dlg = new Dialog()) {
if (dlg.ShowDialog(this) == DialogResult.OK) {
// etc...
}
}
}
OpacityプロパティとBackColorプロパティを微調整して、効果を調整します。これは、OpenFileDialogのような組み込みのダイアログや、アプリケーションで開いているフォームのセットなど、あらゆる種類のダイアログで機能します。Application.OpenFormsは少しバグがあることに注意してください。
「アプリケーションの残りの部分」を暗くすることの意味はわかりませんが、不透明度が100%未満の灰色の陰影でアプリケーションを着色する方法を説明します。
コード(c#を使用していると仮定しています):
Graphics g = this.CreateGraphics(); // Creating graphics for this form.
g.FillRectangle(Color.FromArgb(80, 102, 90, 95), 0, 0, this.Width, this.Height);
// Draws a gray rectangle with an opacity of 30% over the whole form.
次に、灰色の長方形を取り除くために使用できます。
this.Invalidate();
フォームを再描画します。すべてのコントロールは同じままですが、灰色は消えます。
お役に立てれば!
このアプローチの代わりに、showDialogを非表示にする継承されたフォームインスタンスを使用することもできます。次に、現在のフォームを除くすべてのフォームを無効/有効にすることができます。ダミーフォームのコードは、ここで説明する問題に対処するためのものです。 フォームアクティブ化イベントを発生させることができません-無効化されたフォームで問題が発生します
このアプローチの利点の1つは、showDialogメソッドの通常の処理を変更する必要がないことです。ちょうどそれを次のように呼びます。
if (dlg.ShowDialog(this) == DialogResult.OK) {
// etc...
}
継承された形式で
public abstract class MyBaseForm : XtraForm
{
private DialogResult setFormsToBackground(Form fParent)
{
Form dummyForm = new Form();
dummyForm.ShowInTaskbar = false;
dummyForm.FormBorderStyle = FormBorderStyle.None;
dummyForm.Load += ((object sender, EventArgs e) => { (sender as Form).Size = new Size(0, 0); });
List<Form> lstFormsToEnable = new List<Form>();
for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
{
try
{
Form checkfrm = Application.OpenForms[i];
if (checkfrm != this && dummyForm != this && checkfrm.Enabled)
{
lstFormsToEnable.Add(checkfrm);
checkfrm.Enabled = false;
}
}
catch (Exception ex)
{
}
}
dummyForm.Show();
DialogResult result = DialogResult.None;
if (fParent == null) result = base.ShowDialog();
else result = base.ShowDialog(fParent);
for (int i = lstFormsToEnable.Count - 1; i >= 0; i--)
{
try
{
Form checkfrm = Application.OpenForms[i];
checkfrm.Enabled = true;
}
catch (Exception ex)
{
}
}
dummyForm.Close();
return result;
}
}