【问题标题】:How to make a transparent Image in CF 2.0 without third party libraries?如何在没有第三方库的情况下在 CF 2.0 中制作透明图像?
【发布时间】:2010-10-26 18:40:57
【问题描述】:
有没有办法让CF2.0中的图片透明?我必须在文本框上放置一个小图像,但它必须是透明的,以便用户无论如何都能看到文本。你有想法吗?
非常感谢
twickl
编辑:
感谢您的回答,我会检查这些链接!
为了完成我的帖子,这是我想要做的:
我想显示一个小图像(该图像尚不存在,我必须制作 ist,所以我对所有格式完全开放),它是文本框右端的 X。通过单击 X,文本框内的文本将被删除……就像在 iPhone 上一样。但是我无法构建自己的控件,因为在我的项目中有太多的 TextBoxes 已经是带有 windows TextBox 的自定义控件,因此将它们全部切换到自定义控件将需要大量的工作和测试。所以我想在文本框上方制作一个小面板、图片框等等。但它必须是透明的。操作系统是带有 CF 2.0 的 Windows CE 5.0。
【问题讨论】:
标签:
c#
windows-mobile
compact-framework
bitmap
windows-ce
【解决方案1】:
根据您需要的透明度,您可以选择以下任意选项:
1.) 如果您的图像具有应完全透明的特定部分,您可以使用ImageAttributes.SetColorKey() 设置单一透明颜色,然后将其传递给 Graphics.DrawImage。您的图像需要具有一种完全透明的颜色(例如 Color.Cyan)。
2.) 如果您希望整个图像部分透明,例如对于淡入/淡出效果,您可以 P/Invoke AlphaBlend() 函数,如 here 所示。
3.) 如果您的图像内置了透明度信息,例如需要在各种背景颜色上渲染的透明PNG图像,以前的这些方法都不起作用,您需要使用基于COM的IImage接口。
来自 .NETCF 的 COM 互操作记录在 this page 上(在该页面上搜索“IImage 接口”)。
选项 3 最灵活,但也涉及最多的实施工作。如果您跟进有关您想要透明绘制的图像类型和您的目标平台的更多信息,我们可能会提供更多帮助。
【解决方案2】:
我通过从 PictureBox 派生一个类并处理 OnPaint 来做到这一点。关键是传递给 DrawImage 的 ImageAttributes 对象。我假设像素 0,0 是透明颜色,但你可以用不同的方式处理。
public partial class TransparentPictureBox : PictureBox
{
private Color tColor;
public TransparentPictureBox()
{
InitializeComponent();
}
public new Image Image
{
get { return base.Image; }
set
{
if (value == base.Image)
return;
if (value != null)
{
Bitmap bmp = new Bitmap(value);
tColor = bmp.GetPixel(0, 0);
this.Width = value.Width;
this.Height = value.Height;
}
base.Image = value;
}
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.Clear(this.BackColor);
if (Image == null)
return;
ImageAttributes attr = new ImageAttributes();
// Set the transparency color.
attr.SetColorKey(tColor, tColor);
Rectangle dstRect = new Rectangle(0, 0, base.Image.Width, base.Image.Height);
e.Graphics.DrawImage(base.Image, dstRect, 0, 0, base.Image.Width, base.Image.Height, GraphicsUnit.Pixel, attr);
}
}