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; namespace WindowsXP { public partial class Form1 : Form { public Form1() { InitializeComponent(); pictureBox5.Click += PictureBox5_Click; pictureBox8.Click += PictureBox8_Click; pictureBox11.Click += PictureBox11_Click; pictureBox4.Click += PictureBox4_Click; pictureBox7.Click += PictureBox7_Click; pictureBox10.Click += PictureBox10_Click; } private void PictureBox5_Click(object sender, EventArgs e) //收起菜單 { int i = 100; pictureBox5.Visible = false; pictureBox3.Visible = false; label3.Visible = false; label2.Visible = false; pictureBox6.Top -= i; pictureBox7.Top -= i; pictureBox8.Top -= i; pictureBox9.Top -= i; pictureBox10.Top -= i; pictureBox11.Top -= i; //SetControlPosition(); } private void PictureBox4_Click(object sender, EventArgs e) //展開菜單 { if (pictureBox5.Visible == false) { int i = 100; pictureBox5.Visible = true; pictureBox3.Visible = true; label3.Visible = true; label2.Visible = true; pictureBox6.Top += i; pictureBox7.Top += i; pictureBox8.Top += i; pictureBox9.Top += i; pictureBox10.Top += i; pictureBox11.Top += i; //SetControlPosition(); } } private void PictureBox8_Click(object sender, EventArgs e) //折疊菜單 { int i = 100; pictureBox8.Visible = false; pictureBox6.Visible = false; label5.Visible = false; label6.Visible = false; label10.Visible = false; pictureBox9.Top -= i; pictureBox10.Top -= i; pictureBox11.Top -= i; //SetControlPosition(); } private void PictureBox7_Click(object sender, EventArgs e) //展開菜單 { if (pictureBox8.Visible == false) { int i = 100; pictureBox8.Visible = true; pictureBox6.Visible = true; label5.Visible = true; label6.Visible = true; label10.Visible = true; pictureBox9.Top += i; pictureBox10.Top += i; pictureBox11.Top += i; // SetControlPosition(); } } private void PictureBox11_Click(object sender, EventArgs e) //折疊菜單 { pictureBox9.Visible = false; pictureBox11.Visible = false; label8.Visible = false; label9.Visible = false; //SetControlPosition(); } private void PictureBox10_Click(object sender, EventArgs e) //展開菜單 { if (pictureBox9.Visible == false) { pictureBox9.Visible = true; pictureBox11.Visible = true; label8.Visible = true; label9.Visible = true; //SetControlPosition(); } } private void Form1_Load(object sender, EventArgs e) { SetControlPosition(); } private void SetControlPosition() { SetStyle(ControlStyles.SupportsTransparentBackColor, true); label1.Parent = this.pictureBox4; label2.Parent = pictureBox3; label2.Location = new Point(45, 30); label3.Parent = pictureBox3; label3.Location = new Point(45, 62); label4.Parent = pictureBox7; label4.Location = new Point(45, 11); label5.Parent = pictureBox6; label5.Location = new Point(45, 20); label6.Parent = pictureBox6; label6.Location = new Point(45, 45); label10.Parent = pictureBox6; label10.Location = new Point(45, 65); label7.Parent = pictureBox10; label7.Location = new Point(45, 11); label8.Parent = pictureBox9; label8.Location = new Point(45, 30); label9.Parent = pictureBox9; label9.Location = new Point(45, 62); } } }
有時候,我們需要將控件的背景顏色設定為透明,比如說label(標簽)控件。那么,如何將控件的背景顏色設定為透明?是不是只要將控件的BackColor屬性設為Transparent(透明)就可以了呢?答案是否定的。看似很簡單,其實不然,在實際操作過程中,很讓人抓狂,抓狂到讓你懷疑人生。
關於透明
首先要解釋一下,什么叫做透明。在C#這里,透明就是指透過控件的背景,可以看到其父控件(容器)表面的顏色。所謂的透明,其實就是將父控件表面的顏色設定為自己的背景顏色。
設置控件背景顏色為透明的步驟和注意事項:
以pictureBox上的label控件為例,設置label的背景為透明,可以看到pictureBoxs上的圖片。
(1)首先,將label控件的背景顏色設為透明(Transparent)。在屬性窗口中設置,或者在代碼中設置:label1.BackColor=Color.Transparent;
(2)其次,將label控件的Parent屬性設定為picturebox,也就是說,將pictureBox設為label的父控件。在代碼中寫上:label1.Parent=pictureBox1;或者pictureBox1.Controls.Add(label1);
(3)最后,調整控件的位置。將label控件的位置(Location)重新設定一下,使其顯示在pictureBox中合適的位置:這一步是非常重要的!這常常是出問題的地方,如果Location屬性沒設置好,有可能看不到標簽。
注意事項:
(1)為什么將label控件的背景設為透明,透過背景看到的不是pictureBox的顏色,而是窗體的顏色?
其原因是:label控件的父控件默認是窗體,當將label的背景顏色設為透明之后,看到的將會是窗體的顏色,即使你已經把label控件拖到pictureBox控件上面也無濟於事。解決方法是,重新設置label的Parent屬性,使label控件的父控件為pictureBox。
(2)為什么將label的Parent屬性設置為pictureBox之后,運行時發現label控件不見了,或者顯示的位置不在拖放的位置?
原因是:
label等控件默認的父控件是窗體,一開始的時候,location屬性也是相對於窗體的。當運行時,label父控件改為了PictureBox,那么location屬性也將是改為相對於PictureBox。這里是重點,這是為什么標簽不見的原因:加了label1.parent=pictureBox1這段代碼之后,label的位置基准就變為PictureBox的了,但location的數值沒有變,當location的數值比PictureBox的size還大的時候,label不會顯示。因此,在設置完label1.parent=PictureBox1之后,還要設置location屬性,比如label1.location=new point(0,0)。這時label顯示在PictureBox的左上角。這是關於位置基准的問題,控件以誰為父親,它的位置基准就一父控件的左上角為基准。在切換父控件的時候,要注意把位置也得調一下。同樣是location=(100,100),以不同的控件作為父控件,顯示的位置是不一樣的。也就是說,顯示位置不但跟數值有關,還跟選擇的基准有關。
例子
在窗體上放一個pictureBox控件,並在其Image屬性中放入一張圖片,然后在pictureBox上拖放一個label控件。顯示效果:pictureBox上顯示圖片,上面的label控件的背景是透明的,透過label控件可以看到pictureBox上的圖片。