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

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

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

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

3561閲覧

カスタムコントロールの半透明背景が正常に表示されない

dawan

総合スコア0

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2021/01/08 08:20

編集2021/01/09 07:59

前提・実現したいこと

C#フォームアプリケーションにて
カスタムコントロール:パネルを作成し、それらが影を落としつつ重ねて表示できるようにしたい。

発生している問題・エラーメッセージ

影自体は完成したが、影部分の半透明が重なっている他のパネルもろとも透け、背景が表示される。
説明しづらいけど画像みてもらえれば伝わるかと思う。
参考画像:https://gyazo.com/d3cca3671bb45ea6500f2089c2124e56
網目は背景、フォーム3つが重なり、右側と下側に影が落ちてる。

該当のソースコード

panel.Control.Add(new CostomControl(){Location = new Point(30, 30)}); panel.Control.Add(new CostomControl(){Location = new Point(60, 60)}); panel.Control.Add(new CostomControl(){Location = new Point(90, 90)});

という感じの状態。

public class CostomControl : Panel

背景Bitmapはbackground[]に格納
コンストラクタにて
Paint += CostomControl_Paint;

影描画部分 (下側/右下/右側/パネル)

private void CostomControl_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; using (TextureBrush brush = new TextureBrush(background[0])) { brush.TranslateTransform(0, Height - background[0].Height); g.FillRectangle(brush, new Rectangle(0, Height - background[0].Height, Width - background[1].Width, background[0].Height)); } using (TextureBrush brush = new TextureBrush(background[1])) { brush.TranslateTransform(Width - background[1].Width, Height - background[1].Height); g.FillRectangle(brush, new Rectangle(Width - background[1].Width, Height - background[1].Height, background[1].Width, background[1].Height)); } using (TextureBrush brush = new TextureBrush(background[2])) { brush.TranslateTransform(Width - background[2].Width, 0); g.FillRectangle(new TextureBrush(background[2]), new Rectangle(Width - background[2].Width, 0, background[2].Width, Height - background[1].Height)); } g.FillRectangle(new SolidBrush(Color.FromArgb(255, 47, 47, 47)), new Rectangle(0, 0, Width - background[2].Width, Height - background[0].Height)); }

試したこと

doublebufferをしていたので回避してみたり
マウスイベントで各コントロールをRefreshするようにしたけど、変わらず

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

Win10 / VisualStudio2019 / .Net framework 4.7
フォームアプリケーションを触りなれていないので、情報不足ありましたらご指摘ください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/01/08 08:52

コードは ``` と ``` で囲ってください(``` はバッククォート 3 つ)。インデントされて見やすくなりますので。インデントされてないコードは質問者さん自身でさえ読む気がしないのでは? 閲覧者・回答者はなおさらです。読んでもらえないと話が始まらないのですから、読んでもらえる努力をしましょう。
TN8001

2021/01/08 15:09

試してないのでこちらに書きますが、 [方法: コントロールに透明な背景を指定する - Windows Forms .NET Framework | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/how-to-give-your-control-a-transparent-background >注意 >Windows フォーム コントロールは、完全な透過性はサポートしていません。 透明な Windows フォーム コントロールの背景は、その親によって描画されます。 この問題なのではないでしょうか? 親のpanelのほうを自作し、子をZオーダー順に影をつけつつ描画みたいな話になるのではないでしょうか。 WPFなら簡単なのですが^^;
退会済みユーザー

退会済みユーザー

2021/01/09 02:18 編集

WinFormsのコントロールは、半透明的な処理をやる前提で設計されていないので、基本的に向いてないです。昔VB.NETで作ったサンプルはありますが、コントロールの重なりとかがあると割と簡単に破綻します。 http://radian.hateblo.jp/entry/2014/11/13/140503 半透明的な演出が必要であれば素直にWPFを使った方が良いと思われます。
dawan

2021/01/09 08:10

SurferOnWwwさん ご指摘、ありがとうございます。勝手がわかっておらず、見づらくなっておりました。 TN8001さん ありがとうございます。 その情報にたどり着けておりませんでした。仕様なのですか、悲しいです。 radianさん その通りのようです。WPFも考慮したのですが、既存のフォームのデザインのみを更新となると、WPFで書き直すより手間が少ないかな、という経緯でした。
guest

回答1

0

自己解決

WN8001さんのご指摘の通り、フォームアプリケーションの仕様でした。
[方法: コントロールに透明な背景を指定する - Windows Forms .NET Framework | Microsoft Docs]https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/how-to-give-your-control-a-transparent-background

注意
Windows フォーム コントロールは、完全な透過性はサポートしていません。 透明な Windows フォーム コントロールの背景は、その親によって描画されます。

既に作ったものの手間もあるので、影のない状態で描画した上で、その上に影のみのPictureBoxなりを重ねて表示...など、もう少し粘ってみようと思います。

投稿2021/01/09 08:14

dawan

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問