質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

7572閲覧

C# 処理中にフォーム上に薄い膜を張りたい

Zenasp1401

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

2クリップ

投稿2019/06/07 06:21

編集2019/06/07 07:36

C#でFORMアプリケーションでボタンを押下した際など何かの処理中に、フォームに薄いグレーの膜を張り、その薄い膜の中央で、くるくると回るインジケーターを表示しようとしてますが、フォーム全体を覆うような薄い膜を張る方法はないでしょうか。
Opacity を80% ほどに設定したFORMを表示すれば、見た目はそれっぽくなるのですが、ShowDialogでは後続の処理がとまり、Showでは、先頭のFORMを切り替える事ができるため、実現できませんでした。
また、ShowでTopMostをtrueにすることも試してみましたが、他のアプリケーションのウインドウにも掛かってしまい、うまくいきませんでした。
なにかよい方法なないでしょうか。

追記

C#

1 // 半透明にしたいコントロール 2 public class CPanel : Panel 3 { 4 public CPanel() 5 { 6 //SetStyle(ControlStyles.SupportsTransparentBackColor, true); 7 this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); 8 //this.BackColor = Color.Transparent; // 透明 9 this.BackColor = Color.FromArgb(80, 0, 0, 0); // 半透明 10 } 11 } 12 13  // 半透明にしたいコントロールコントロールの配置 14 private void Btn_Click(object sender, EventArgs e) 15 { 16 var f = new CPanel(); 17 f.Location = new Point(0, 0); 18 this.Controls.Add(f); 19 f.Parent = this; 20 f.BringToFront(); 21 }

上記のコードを実行しても、半透明になっていないpanelがformに表示されるだけでした。
f.Parent = this;

f.Parent = Button01;
の様に、form上の別のコントロールを指定すると、そのコントロール(Button01)の上では半透明で表示されています。
希望としては、form全体に半透明で覆いたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/06/07 06:34

フォームの子として半透明のユーザーコントロールを作り、それを前面に出す、と言って通じますか?
Zenasp1401

2019/06/07 07:01

Zuishinさま、ご回答ありがとうございます。 半透明のユーザーコントロールを作成し、表示することも考え試してみたのですが、うまくいきませんでした。 試したのは、SupportsTransparentBackColorをtrueにした、panelやlabelをform上に配置してみましたが、思ったような結果になりませんでした。 半透明のユーザーコントロールの作成方法が間違っているのでしょうか?
Zuishin

2019/06/07 07:26

質問を編集してやってみたコードを追記し、期待とどこが違うのかを具体的に書いてください。コードはマークダウンのコードブロックを使ってください。
Q71

2019/06/07 08:00 編集

ShowDialog ではなく、Show かつ、Owner指定
guest

回答2

0

簡単に考えていましたが、思ったより手ごわかったです。

C#

1using System; 2using System.Drawing; 3using System.Windows.Forms; 4 5namespace WindowsFormsApp1 6{ 7 public partial class Form1 : Form 8 { 9 public Form1() 10 { 11 InitializeComponent(); 12 } 13 14 class TranslucentPanel : Panel 15 { 16 public TranslucentPanel() 17 { 18 SetStyle(ControlStyles.OptimizedDoubleBuffer, false); 19 } 20 21 protected override CreateParams CreateParams 22 { 23 get 24 { 25 var result = base.CreateParams; 26 result.ExStyle |= 0x20; 27 return result; 28 } 29 } 30 31 protected override void OnPaintBackground(PaintEventArgs e) 32 { 33 using (var brush = new SolidBrush(BackColor)) 34 { 35 e.Graphics.FillRectangle(brush, e.ClipRectangle); 36 } 37 } 38 } 39 40 private void Button1_Click(object sender, EventArgs e) 41 { 42 var panel = new TranslucentPanel() 43 { 44 Parent = this, 45 Dock = DockStyle.Fill, 46 BackColor = Color.FromArgb(128, 128, 0, 0) 47 }; 48 new Button() 49 { 50 Parent = panel, 51 Location = new Point(15, 8), 52 Text = "Close" 53 }.Click += (s, a) => 54 { 55 panel.Parent = null; 56 panel = null; 57 }; 58 panel.BringToFront(); 59 panel.Focus(); 60 panel.Invalidate(); 61 } 62 } 63}

投稿2019/06/07 11:53

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zenasp1401

2019/06/10 01:09

Zuishinさま、Q71さま お礼が遅くなり大変申し訳ございません。 サンプルを作成していただき、ありがとうございます。 お二方のお手を煩わせてしまいまして、大変申し訳ございません。 お教えいただきましたサンプルの内容をしっかり勉強していくようにいたします。 Q71さま 大変申し訳ございません。 先にご回答いただきました、Zuishinさまをベストアンサーとさせていただきます。 お二方ともに、実際に動作するコードを作成していただいてありがとうございました。
guest

0

ベストアンサー

もう一つ。フォームを上に貼り付ける方法。
NumericUpDown と、Button、Timer を1つずつ貼り付けています。
Form.Show メソッドを、IWindow32 引数付きで呼び出すと、そのウィンドウが親となり、必ず親より前に表示されます。
Form.Activated イベントで、Owner プロパティから親の表示位置、大きさを取得し、同じになるように設定します。
あとは、フォームリサイズを禁止しないといけないかな。
Form1.Shown イベントをハンドルしているのは、curtain を初めて表示したときに位置がとれなかったからです。その後、いろいろ変えたので、不要かもしれない。

C#

1namespace teratail_193679 2{ 3 public partial class Form1 : Form 4 { 5 Form curtain; 6 7 public Form1() 8 { 9 InitializeComponent(); 10 curtain = new Form(); 11 curtain.Size = this.Size; 12 curtain.Opacity = 0.4; 13 curtain.MaximizeBox = false; 14 curtain.MinimizeBox = false; 15 curtain.ControlBox = false; 16 17 numericUpDown1.Value = 2; 18 timer1.Tick += this.Timer1_Tick; 19 this.Shown += this.Form1_Shown; 20 this.FormClosed += this.Form1_FormClosed; 21 curtain.Activated += this.Curtain_Activated; 22 } 23 24 private void Form1_FormClosed(Object sender, FormClosedEventArgs e) 25 { 26 curtain.Dispose(); 27 } 28 29 private void Curtain_Activated(Object sender, EventArgs e) 30 { 31 if (sender is Form me) 32 { 33 me.Location = me.Owner.Location; 34 me.Opacity = 0.6; 35 me.Size = me.Owner.Size; 36 } 37 } 38 39 private void Form1_Shown(Object sender, EventArgs e) 40 { 41 this.Shown -= Form1_Shown; 42 curtain.Hide(); 43 } 44 45 private void Timer1_Tick(Object sender, EventArgs e) 46 { 47 curtain.Hide(); 48 } 49 50 private void button1_Click(Object sender, EventArgs e) 51 { 52 timer1.Interval = (int)(numericUpDown1.Value * 1000); 53 timer1.Start(); 54 curtain.Show(this); 55 } 56 } 57}

投稿2019/06/07 12:32

Q71

総合スコア995

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問