通常会在窗口中放置Label作为显示信息,但是如果与Label配合使用的其他控件比如PictureBox之类设置有背景颜色或图片的话,这些Label上被Label遮住的部分由于Label不是透明的,就会出现“补丁”。
可以通过如下方法将作为“补丁”出现的Label的背景设置为透明,这样一来,只有当Label上存在文字的时候,才会在对应的位置出现信息,并且对窗口整体的显示效果不会有影响。
- Label label1= new Label();
- pictureBox1.SendToBack();
- label1.BackColor = Color.Transparent;
- label1.Parent = pictureBox1;
- label1.BringToFront();
但是,在使用中发现一个问题,如果是在窗口设计器中直接拖一个Label控件放置到PictureBox上的话,这样设置就不会有效果,只有在构造的时候手动创建一个Label的对象,才能实现背景透明的设置。
猜想,这可能跟Label在控件中所处的层次有关,比如直接拖一个Label放置到窗口中,拖上去的这个Label可能处于Form的下层。而上述代码中所给的手动创建的Label对象,则这个Label可能处于PictureBox的下层,因此才可以通过设置BackColor来保证不覆盖PictureBox的显示效果。
之前在网上也看到有人说上述代码所描述的情况还需要设置Label对象的Parent为PictureBox对象才能实现效果,据此得出如上关于Label所处层次的推想。
上面的方法经验证,在PC下是好使的,但是放到WindowsMobile下就挂了。结果就是在“label1.Parent = pictureBox1;”这句这里会抛出异常
ArgumentException:"值不在预期的范围内。"
经过对PC和WM中MSDN的比较,发现PictureBox有一个Controls属性,其含义就行啊Form的一样,用于保存子控件集合。但是,这个属性在CF中式不存在的。所以我猜,只有具有Controls属性的控件,才能作为某个控件的父控件出现,否则,就会认为在组成的层次结构是错误的。再一次但是,如果没有设置Parent那句话,就不能实现把Label背景设置成透明的效果……ORZ……
OK,现在提供另外一种方法,这种方法是同时适用于PC和WM。
修改PictureBox的Paint事件响应方法
- private void pictureBox1_Paint(object sender, PaintEventArgs e)
- {
- if (IsDrawString != 0)
- {
- e.Graphics.DrawString(drawMessage.ToString(), this.Font, new SolidBrush(this.BackColor), (float)(Width * 0.7),
- (float)(Height * 0.3));
- }
- }
需要注意的是,这个Paint一定是要添加文字的控件的事件,比如一开始我加到了Form的Paint事件中,理所当然就不会达到想要的效果。另外,如果用Paint事件这种方法的话,貌似Label控件都不需要在窗口中添加了