4

有没有办法让CF2.0中的图片透明?我必须在文本框上放置一个小图像,但它必须是透明的,以便用户无论如何都能看到文本。你有想法吗?

非常感谢你

twickl

编辑:

感谢您的回答,我会检查这些链接!为了完成我的帖子,这是我想要做的:

我想显示一个小图像(图像尚不存在,我必须制作 ist,所以我对所有格式完全开放),它是文本框右端的 X。通过单击 X,文本框内的文本将被删除……就像在 iPhone 上一样。但是我无法构建自己的控件,因为在我的项目中,有太多的 TextBoxes 已经是带有 windows TextBox 的自定义控件,因此将它们全部切换到自定义控件将需要大量的工作和测试。所以我想在文本框上方制作一个小面板、图片框等等。但它必须是透明的。操作系统是带有 CF 2.0 的 Windows CE 5.0。

4

2 回答 2

8

根据您需要的透明度,您可以选择以下任何选项:

1.) 如果您的图像具有应完全透明的特定部分,您可以使用ImageAttributes.SetColorKey()设置单个透明颜色,然后将其传递给 Graphics.DrawImage。您的图像需要有一种颜色(例如 Color.Cyan),该颜色将被绘制成完全透明的。

2.) 如果您希望整个图像部分透明,例如对于淡入/淡出效果,您可以 P/Invoke AlphaBlend()函数,如此处所示

3.) 如果你有一个内置了透明度信息的图片,例如一个透明的PNG图片,需要在各种背景颜色上渲染,这些之前的方法都行不通,你需要使用基于COM的IImage接口。.NETCF 的 COM 互操作记录在此页面上(在该页面上搜索“IImage 接口”)。

选项 3 是最灵活的,但也涉及最多的实施工作。如果您跟进有关您想要透明绘制的图像类型和目标平台的更多信息,我们可能会提供更多帮助。

于 2009-05-16T23:25:22.733 回答
3

我通过从 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);
    }
}
于 2009-05-16T21:47:17.307 回答