WINCE系统Picturebox控件支持透明方法

来源:互联网 发布:脑供血不足 知乎 编辑:程序博客网 时间:2024/05/21 09:22

看到论坛里有这篇文章,特别有用,于是转了过来!


在WINCE中标准的PictureBox控件是不支持透明的,无论是否设置了Transparent属性。


使用如下方法可达到透明的效果。
1. 首先将PictureBox的Visible属性置为false,避免在透明效果未完成时显示出来。
2. 申请一个临时的Bitmap,大小与PictureBox相同。
3. 将PictureBox盖住的背景截图到Bitmap中。
4. 再将PictureBox的Image复制到Bitmap中,需要使用ImageAttributes对象指定透明色。
5. 将PictureBox的Image指向Bitmap。
6. 将PictureBox的Visible属性置为true。

    此方法的缺点是需要先将PictureBox隐藏,等生成完图片再显示出来。这样就造成PictureBox与窗体不能同时显示,但将生成图片的方法放在窗体的Load事件中应可以解决这个问题。
    第2个缺点是,此方法不支持真正的透明,而是将图片中的某个颜色当做透明色来处理,例如:将纯白作为透明,则图片中白色的部分将显示背景上的图片。

 
C# code
// WINCE PictureBox控件图片透明化 private void Transparent(PictureBox pic, PictureBox picBack) { // 生成一个与PictureBox一样大的缓冲区 Bitmap buffer = new Bitmap(pic.Width, pic.Height); // 创建图形对象,绘图区域为刚刚生成的缓冲区 Graphics g = Graphics.FromImage(buffer); // 背景上被PictureBox覆盖的区域区域。假定PictureBox覆盖在背景图之上 Rectangle scrRect = new Rectangle( pic.Left - picBack.Left, // 截图区域的左上角X坐标 pic.Top - picBack.Top, // 截图区域的左上角Y坐标 pic.Width, // 截图区域的宽度 pic.Height); // 截图区域的高度 // 将背景上被PictureBox覆盖的那块区域截图下来,保存在缓冲区中 g.DrawImage(picBack.Image, // 背景图 0, // 所截图片画在缓冲区中的左上角X坐标 0, // 所截图片画在缓冲区中的左上角Y坐标 scrRect, // 需要截图的区域 GraphicsUnit.Pixel); // 此参数表示本次调用传入的参数以像素为单位 // 指定被当做透明色的颜色值,这里使用纯白。 // MSDN中SetColorKey的低值和高值可不相同,但这里必须相同,否则报错。原因未知。 ImageAttributes imageAttr = new ImageAttributes(); imageAttr.SetColorKey(Color.FromArgb(255, 255, 255), Color.FromArgb(255, 255, 255)); // 将PictureBox的Image拷贝到Bitmap中,指定的颜色当做透明色 g.DrawImage(pic.Image, // 将PictureBox的图片绘制在缓冲区中 new Rectangle(0, 0, pic.Width, pic.Height), // 绘制区域,将PictureBox的图片按比例缩放绘制在这个区域内 0, // 截图区域的左边坐标,PictureBox必须覆盖为背景图之上 0, // 截图区域的上边坐标 pic.Width, // 截图区域的宽度 pic.Height, // 截图区域的高度 GraphicsUnit.Pixel, // 此参数表示本次调用传入的参数以像素为单位 imageAttr); // 透明色 pic.Image = buffer; }

原创粉丝点击