web-dev-qa-db-ja.com

PictureBoxの透過的なコントロール

私のC#フォームには、ダウンロードイベントでダウンロードの割合を表示するラベルがあります。

  this.lblprg.Text = overallpercent.ToString("#0") + "%";

LabelコントロールのBackColorプロパティは透明に設定されており、PictureBoxの上に表示する必要があります。しかし、それは正しく機能していないように見えます。灰色の背景が表示され、画像ボックスの上で透明に見えません。どうすれば修正できますか?

63
Derezzed

Labelコントロールは透明度をサポートします。それは、デザイナーがラベルを正しく配置させないということです。 PictureBoxコントロールはコンテナコントロールではないため、フォームはラベルの親になります。したがって、フォームの背景が表示されます。

フォームコンストラクターにコードを少し追加することで、簡単に修正できます。ラベルの親プロパティを変更し、フォームの代わりに画像ボックスを基準にしているため、場所を再計算する必要があります。このような:

    public Form1() {
        InitializeComponent();
        var pos = this.PointToScreen(label1.Location);
        pos = pictureBox1.PointToClient(pos);
        label1.Parent = pictureBox1;
        label1.Location = pos;
        label1.BackColor = Color.Transparent;
    }

実行時は次のようになります。

enter image description here


別のアプローチは、設計時の問題を解決することです。それはただ属性を取ります。 System.Designへの参照を追加し、プロジェクトにクラスを追加して、次のコードを貼り付けます。

using System.ComponentModel;
using System.Windows.Forms;
using System.Windows.Forms.Design;    // Add reference to System.Design

[Designer(typeof(ParentControlDesigner))]
class PictureContainer : PictureBox {}
150
Hans Passant

あなたはただ使うことができます

label1.Parent = pictureBox1;
label1.BackColor = Color.Transparent; // You can also set this in the designer, as stated by ElDoRado1239
37
crdy

TextRendererを使用して、背景なしでテキストを描画できます。

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    TextRenderer.DrawText(e.Graphics, 
                          overallpercent.ToString("#0") + "%", 
                          this.Font, 
                          new Point(10, 10), 
                          Color.Red);
}

全体のパーセント値が変更されたら、pictureBoxを更新します。

pictureBox1.Refresh();

Graphics.DrawStringを使用することもできますが、TextRenderer.DrawText(GDIを使用)はDrawString(GDI +)よりも高速です

別の答えもご覧ください here およびDrawTextリファレンス here

9
Maciej

あなたの設計のために簡単に。ラベルをパネル内に配置できます。パネルの背景画像を設定することは、あなたが望むすべての画像です。ラベルの背景を透明に設定

5
Grey Wolf