前提・ 実現したいこと
Formやユーザコントロールなどの背景色をグラデーションに色が塗る方法が知りたいです。
visual stadio2022を使ってc#でプログラミングしています。
ショッピングサイトのようなシステムを作っています。
それを実装のとき、Windowサイズをマウスで大きさが変更するとき、
Form内のパネルに追加したユーザーコントロールのSizeの大きさも変わります。
VisualStudioでwindows formのForm上には
Panel1(左上)、Panel2(右上)、Panel3(左下)、Panel4(右下)で構成されています。
また、Panel3(左下)にはUserControl1からUserControl2へと画面遷移するために必要なユーザーコントロールが複数あります。
知りたいことはユーザコントロール内にPanelなどのコントロールの追加による表示ではなく、
サンプル写真のように赤丸のように直接、Formやユーザコントロールなどの背景色をグラデーションに色が塗る方法が知りたいです。
できれば解答する際にコードの解説やコメントがあるとわかりやすいのでお願いします。
発生している問題・エラーメッセージ
https://dobon.net/vb/dotnet/graphics/lineargradientbrush.html
https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/784gradbutton/gradbutton.html
を参考にしたが、
ユーザコントロール内にPanelやpictureboxなどのコントロールを追加による表示の仕方はユーザコントロールに色が塗られていない部分があるやサンプルのように配置されているボタンが消えてしまうと指摘を受けて
ユーザコントロール内の背景色をグラデーションに変えることがわからない。
該当のソースコード
c#
1//描画先とするImageオブジェクトを作成する 2Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height); 3//ImageオブジェクトのGraphicsオブジェクトを作成する 4Graphics g = Graphics.FromImage(canvas); 5 6//縦に白から黒へのグラデーションのブラシを作成 7//g.VisibleClipBoundsは表示クリッピング領域に外接する四角形 8LinearGradientBrush gb = new LinearGradientBrush( 9 g.VisibleClipBounds, 10 Color.White, 11 Color.Black, 12 LinearGradientMode.Vertical); 13 14//四角を描く 15g.FillRectangle(gb, g.VisibleClipBounds); 16 17//リソースを解放する 18gb.Dispose(); 19g.Dispose(); 20 21//PictureBox1に表示する 22PictureBox1.Image = canvas;
試したこと
ユーザーコントロールのイベントpaintを使ったがグラデーションにならないです。
c#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using System.Drawing.Drawing2D; 11 12namespace tram 13{ 14 public partial class UserControl1 : UserControl 15 { 16 public Menu() 17 { 18 InitializeComponent(); 19 20 } 21 private void UserControl1_Paint(object sender, PaintEventArgs e) 22 { 23 Form1 form = (Form1)this.FindForm(); 24 // ビットマップとGraphicsオブジェクトの作成 25 Bitmap bmp = new Bitmap(form.panel3.Width, form.panel3.Height); 26 Graphics g = Graphics.FromImage(bmp); 27 28 // グラデーション・ブラシの作成 29 LinearGradientBrush gradBrush = new LinearGradientBrush( 30 g.VisibleClipBounds, // ビットマップの領域サイズ 31 Color.Navy, // 開始色 32 Color.Purple, // 終了色 33 LinearGradientMode.Vertical); // 縦方向にグラデーション 34 35 // ビットマップをグラデーション・ブラシで塗る 36 e.Graphics.FillRectangle(gradBrush, g.VisibleClipBounds); 37 38 gradBrush.Dispose(); 39 g.Dispose(); 40 41 } 42}
補足情報(FW/ツールのバージョンなど)
Form1のソースコードはこのようになっています。
c#
1public partial class Form1 : Form 2 { 3 4 //ユーザーコントロール1 5 public userControl1 page = new UserControl1(); 6 //ユーザーコントロール2 7 public userControl2 page = new UserControl2(); 8 9 public Form1() 10 { 11 InitializeComponent(); 12 13 //ユーザーコントロールの画面を追加 14 panel3.Controls.Add(userControl1); 15 panel3.Controls.Add(userControl2); 16 17 userControl1.Visible = false; 18 userControl2.Visible = true; 19 20 } 21 22 } 23
また、これは個人的に気になったことであるが、 gradBrush.Dispose();など
Dispose()がなくても画面に図形が挿入されているが
Dispose()があるとないでどのように変わりますか?
自分で調べてもリソース?というものがあるかないか書かれてもの多いです。
こちらの質問が複数のユーザーから「調査したこと・試したことが記載されていない質問」という指摘を受けました。


回答2件