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

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

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

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

解決済

ユーザーコントロールの色をグラデーションしたいです。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

2回答

0リアクション

0クリップ

537閲覧

投稿2022/09/20 12:10

編集2022/09/20 12:41

前提・ 実現したいこと

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#

//描画先とするImageオブジェクトを作成する Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.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に表示する PictureBox1.Image = canvas;

試したこと

ユーザーコントロールのイベントpaintを使ったがグラデーションにならないです。

c#

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Drawing.Drawing2D; namespace tram { public partial class UserControl1 : UserControl { public Menu() { InitializeComponent(); }   private void UserControl1_Paint(object sender, PaintEventArgs e) { Form1 form = (Form1)this.FindForm(); // ビットマップとGraphicsオブジェクトの作成 Bitmap bmp = new Bitmap(form.panel3.Width, form.panel3.Height); Graphics g = Graphics.FromImage(bmp); // グラデーション・ブラシの作成 LinearGradientBrush gradBrush = new LinearGradientBrush( g.VisibleClipBounds, // ビットマップの領域サイズ Color.Navy, // 開始色 Color.Purple, // 終了色 LinearGradientMode.Vertical); // 縦方向にグラデーション // ビットマップをグラデーション・ブラシで塗る e.Graphics.FillRectangle(gradBrush, g.VisibleClipBounds); gradBrush.Dispose(); g.Dispose(); } }

補足情報(FW/ツールのバージョンなど)

Form1のソースコードはこのようになっています。

c#

public partial class Form1 : Form { //ユーザーコントロール1 public userControl1 page = new UserControl1(); //ユーザーコントロール2 public userControl2 page = new UserControl2(); public Form1() { InitializeComponent(); //ユーザーコントロールの画面を追加 panel3.Controls.Add(userControl1); panel3.Controls.Add(userControl2);   userControl1.Visible = false; userControl2.Visible = true; } }

また、これは個人的に気になったことであるが、 gradBrush.Dispose();など
Dispose()がなくても画面に図形が挿入されているが
Dispose()があるとないでどのように変わりますか?
自分で調べてもリソース?というものがあるかないか書かれてもの多いです。

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

2022/09/25 02:04

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

2022/09/20 14:09

こちらの質問が他のユーザーから「過去に投稿した質問と同じ内容の質問」という指摘を受けました。

退会済みユーザー

退会済みユーザー

2022/09/20 12:59 編集

まだ言語の理解などによって解決していないです。
Zuishin

2022/09/20 13:26

前のが解決してないのに進めちゃだめでしょう。
退会済みユーザー

退会済みユーザー

2022/09/20 13:37 編集

また質問にも書きましたが前回の場合はパネルが配置されていることがダメであると指摘を受けてしまい、再度質問しました。
Zuishin

2022/09/20 14:05

なぜ課題を他人にやらせてるのか知らないけど、同じ方法でできるので、前の回答を参考にすればできます。 理解せず先に進んでいるからできないだけです。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

C#

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