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

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

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

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

解決済

配置したpanel内の色をグラデーションしたいです。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

1回答

0グッド

0クリップ

441閲覧

投稿2022/09/14 14:14

前提

panel内の色をグラデーションしたいです。

プログラミング初心者です。

visual stadio2022を使ってc#でプログラミングしています。

VisualStudioでwindows formでショッピングサイトのサイドメニューのようにpanelがあり
panel内の色が紺色から紫に上から下へグラデーションをしたいです。

c#でプログラミングするとき、
panelの色を紺色から赤紫にグラデーションするにはどのようにコードを使用すれば
教えてください。

また、以下のサイトの2つ
1.https://dobon.net/vb/dotnet/graphics/lineargradientbrush.html
2.https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/advanced/how-to-create-a-linear-gradient?view=netframeworkdesktop-4.8

を参考にLinearGradientBrushというものでブラシを作成し、
配置した範囲のパネル全体をグラデーションを行いましたがうまくいきません。
Form1

private void panel1_Paint(object sender, PaintEventArgs e) { //描画先とするImageオブジェクトを作成する Bitmap canvas = new Bitmap(panel1.Width, panel1.Height); //ImageオブジェクトのGraphicsオブジェクトを作成する Graphics g = Graphics.FromImage(canvas); //縦に白から黒へのグラデーションのブラシを作成 //g.VisibleClipBoundsは表示クリッピング領域に外接する四角形 LinearGradientBrush gb = new LinearGradientBrush( g.VisibleClipBounds, Color.White, Color.Black, LinearGradientMode.Vertical); //四角を描く g.FillRectangle(gb, g.VisibleClipBounds); //リソースを解放する gb.Dispose(); g.Dispose(); //PictureBox1に表示する panel1.BackgroundImage = canvas; } }

c#のソースコードを教えてください。
できれば、例を出してわかりやすく説明があればうれしいです

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/09/25 02:03

こちらの質問が複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

YAmaGNZ

2022/09/14 15:24

「うまくいかない」とはどのようになってどううまくいかないのですか?
退会済みユーザー

退会済みユーザー

2022/09/14 15:37

グラデーションの仕方を理解して、 windowformに配置しているパネル内の色が上から下へグラデーションすることができなかったことをいいます。
KOZ6.0

2022/09/14 16:01 編集

Form_Load に書けば良いのでは? あとはコメントをちゃんと読めばやりたいことが出来るはずですけどね。
YAmaGNZ

2022/09/14 22:12

提示されているコードですとグラデーションが描画されるが、再描画され続けてちらつくといった現象になるのではないかと思います。 グラデーションができないわけではないはずです。 何も描画されていないのでしょうか? それとも違う動きなのでしょうか? 動作した結果を正確に書くようにしましょう。

回答1

0

ベストアンサー

参考サイト1の方法はImageを作成しているので、初めに1回やれば十分です。
参考サイト2の方法は注意書きにある通り、Paintイベントで直接描画しています。

パネルのサイズが固定ならば1(panel1)で、サイズが変わるなら2(panel2)がいいんじゃないですかね。

.NET6です^^(なにか指定があれば合わせます)

cs

1using System.Drawing.Drawing2D; 2 3namespace Q5mtt1e0e765dl0; 4 5public partial class Form1 : Form 6{ 7 public Form1() 8 { 9 InitializeComponent(); 10 11 var tableLayoutPanel1 = new TableLayoutPanel 12 { 13 ColumnCount = 2, 14 Dock = DockStyle.Fill, 15 Parent = this, 16 }; 17 tableLayoutPanel1.ColumnStyles.Add(new(SizeType.Percent, 50F)); 18 tableLayoutPanel1.ColumnStyles.Add(new(SizeType.Percent, 50F)); 19 20 21 var panel1 = new Panel 22 { 23 Dock = DockStyle.Fill, 24 Parent = tableLayoutPanel1, 25 }; 26 27 var canvas = new Bitmap(panel1.Width, panel1.Height); 28 using var g = Graphics.FromImage(canvas); 29 using var gb = new LinearGradientBrush(g.VisibleClipBounds, 30 Color.DarkBlue, Color.MediumVioletRed, LinearGradientMode.Vertical); 31 g.FillRectangle(gb, g.VisibleClipBounds); 32 panel1.BackgroundImage = canvas; 33 34 35 var panel2 = new Panel 36 { 37 Dock = DockStyle.Fill, 38 Parent = tableLayoutPanel1, 39 }; 40 panel2.Paint += Panel2_Paint; 41 panel2.Resize += (_, _) => panel2.Invalidate(); // Paintを呼ぶ 42 } 43 44 private void Panel2_Paint(Object? sender, PaintEventArgs e) 45 { 46 if (sender is Panel panel2) 47 { 48 using var gb = new LinearGradientBrush(e.Graphics.VisibleClipBounds, 49 Color.DarkBlue, Color.MediumVioletRed, LinearGradientMode.Vertical); 50 e.Graphics.FillRectangle(gb, e.Graphics.VisibleClipBounds); 51 } 52 } 53}

アプリ画像


コード片だけではどこに書いたらいいのかわかりませんよね^^;
なので私は全文あげる派です^^


追記(より絞った例&コメント追加)

1. Panelをフォームに追加する

2. Panelのプロパティを変更

Panelが可変サイズになればなんでもいいがAnchorにした。
プロパティを変更

3. Panelのイベントを追加する

PaintResizeイベントを追加
イベントを追加

4. コード

cs

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Drawing.Drawing2D; 7using System.Linq; 8using System.Text; 9using System.Threading.Tasks; 10using System.Windows.Forms; 11 12namespace Q5mtt1e0e765dl0 13{ 14 public partial class Form1 : Form 15 { 16 public Form1() 17 { 18 InitializeComponent(); 19 } 20 21 // パネルを描画するときに呼び出される 22 private void panel1_Paint(object sender, PaintEventArgs e) 23 { 24 // ブロック({})を抜けたら自動的に Dispose するC#構文 25 using ( 26 // グラデーションブラシ作成 27 var gb = new LinearGradientBrush( 28 // グラデーション範囲(表示クリッピング領域) 29 e.Graphics.VisibleClipBounds, 30 // グラデーション開始色(紺色) 31 Color.DarkBlue, 32 // グラデーション終了色(赤紫) 33 Color.MediumVioletRed, 34 // グラデーション方向(縦) 35 LinearGradientMode.Vertical)) 36 { 37 // 四角形の内部を塗りつぶす(表示クリッピング領域) 38 e.Graphics.FillRectangle(gb, e.Graphics.VisibleClipBounds); 39 } 40 // using構文を使用したため Dispose を書く必要はない 41 //リソースを解放する 42 //gb.Dispose(); 43 } 44 45 // パネルサイズが変わったときに呼び出される 46 private void panel1_Resize(object sender, EventArgs e) 47 { 48 // パネルの表面全体を無効化してパネルを再描画する 49 panel1.Invalidate(); 50 } 51 } 52}

アプリ画像

参考

using ステートメント - C# リファレンス | Microsoft Learn

LinearGradientBrush クラス (System.Drawing.Drawing2D) | Microsoft Learn

Graphics.VisibleClipBounds プロパティ (System.Drawing) | Microsoft Learn

Graphics.FillRectangle メソッド (System.Drawing) | Microsoft Learn

Control.Invalidate メソッド (System.Windows.Forms) | Microsoft Learn

投稿2022/09/14 21:42

編集2022/09/20 13:53
TN8001

総合スコア8046

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2022/09/20 11:31

解答していただきありがたいのですが、自分は初心者であるゆえになぜ tableLayoutPanel1.ColumnStyles.Add(new(SizeType.Percent, 50F)); や if (sender is Panel panel2) { using var gb = new LinearGradientBrush(e.Graphics.VisibleClipBounds, Color.DarkBlue, Color.MediumVioletRed, LinearGradientMode.Vertical); e.Graphics.FillRectangle(gb, e.Graphics.VisibleClipBounds); } であるなど なぜそのようなコードが必要であるか説明やコメントがあるとありがたいです。
TN8001

2022/09/20 12:31

了解しました。提示コード程度のコメントでよろしいでしょうか? その前にできるだけmitsutanさんの前提状態に近づけたいので、下記2点お答えください。 * Visual Studio 2022で作成しているプログラムはどちらでしょうか?(最初に選んだテンプレート) 1. Windows フォーム アプリ 2. Windows フォーム アプリケーション(.NET Framework) * グラデーションしたいパネルは 1. 固定サイズ(ウィンドウサイズが変わらないか・ウィンドウサイズが変わってもパネルサイズは変わらない) 2. 可変サイズ
退会済みユーザー

退会済みユーザー

2022/09/20 12:55

* Visual Studio 2022で作成しているプログラムはどちらでしょうか?(最初に選んだテンプレート) おそらく 2. Windows フォーム アプリケーション(.NET Framework) です。 * グラデーションしたいパネルは 2. 可変サイズ
退会済みユーザー

退会済みユーザー

2022/09/20 12:57

コメントについてお任せしますが、できればなぜ必要であるか初心者にわかるものでお願いしたいです。
退会済みユーザー

退会済みユーザー

2022/09/20 14:12

解答ありがとうございます。 もし、1. 固定サイズ(ウィンドウサイズが変わらないか・ウィンドウサイズが変わってもパネルサイズは変わらない)の場合は、Panelが可変サイズになればなんでもいいがAnchorプロパティを何もしないで大丈夫ですか
TN8001

2022/09/20 14:26

AnchorやDockをいじらなければ、デザイナで指定したLocationとSizeで表示されますので固定サイズになります。 固定サイズでもこの方法(参考サイト2の方法)も、もちろん使用可能です。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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