Как сделать прозрачный образ в CF 2.0 без сторонних библиотек? - PullRequest
4 голосов
/ 17 мая 2009

есть ли способ сделать изображение прозрачным в CF2.0? Я должен положить небольшое изображение поверх текстового поля, но оно должно быть прозрачным, чтобы пользователь мог видеть текст в любом случае. У вас есть идея?

Большое спасибо

twickl

Edit:

Спасибо за ваши ответы, я проверю эти ссылки! Чтобы завершить мой пост, вот что я пытаюсь сделать:

Я хочу показать маленькое изображение (изображение еще не существует, и я должен сделать ist, так что я полностью открыт для всех форматов), которое представляет собой X в правом конце текстового поля. При нажатии этого X текст внутри текстового поля будет удален ... как на iPhone. Но я не могу создать свой собственный элемент управления, потому что в моем Project так много TextBox-ов, которые уже являются пользовательскими элементами управления с окнами TextBox на нем, так что будет много работы и тестирования, чтобы переключить все их на пользовательские элементы управления. Итак, у меня есть идея сделать небольшую панель, Picturebox, что угодно, что лежит над Textbox. Но это должно быть прозрачно. ОС Windows CE 5.0 с CF 2.0.

Ответы [ 2 ]

8 голосов
/ 17 мая 2009

В зависимости от того, какая прозрачность вам нужна, вы можете выбрать один из следующих вариантов:

1.) Если у вас есть изображение с определенной частью, которая должна быть полностью прозрачной, вы можете использовать ImageAttributes.SetColorKey () , чтобы установить один прозрачный цвет, а затем передать его в Graphics.DrawImage. Ваше изображение должно иметь один цвет (например, Color.Cyan), который будет нарисован полностью прозрачным.

2.) Если вы хотите, чтобы все изображение было частично прозрачным, например, для эффекта постепенного появления / исчезновения вы можете P / Invoke использовать функцию AlphaBlend () , как показано здесь .

3.) Если у вас есть изображение со встроенной информацией о прозрачности, например, Прозрачное PNG-изображение, которое должно отображаться на различных цветах фона, эти предыдущие методы не будут работать, и вам нужно использовать интерфейс IImage на основе COM. Взаимодействие COM из .NETCF описано на этой странице (поиск "IImage interface" на этой странице).

Вариант 3 является наиболее гибким, но он также включает в себя большую часть усилий по внедрению. Если вы получите дополнительную информацию о типе изображения, которое вы хотите прозрачно нарисовать, и вашей целевой платформе, мы сможем помочь вам больше.

3 голосов
/ 17 мая 2009

Я сделал это путем извлечения класса из PictureBox и обработки OnPaint. Ключ - это объект ImageAttributes, переданный в DrawImage. Я предполагаю, что пиксель 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);
    }
}
...