24

我正在开发 VS 2008 中的 Windows 窗体应用程序,我想在另一个图像的顶部显示一个图像,顶部图像是 gif 或带有透明部分的东西。

基本上我有一个大图像,如果它,我想在上面放一个小图像,这样它们就有点像一个图像给用户看。

我一直在尝试使用图片框,但这似乎不起作用,有什么建议吗?

4

6 回答 6

27

几天前我也遇到过类似的情况。您可以创建一个透明控件来托管您的图像。

using System;
using System.Windows.Forms;
using System.Drawing;

public class TransparentControl : Control
{
    private readonly Timer refresher;
    private Image _image;

    public TransparentControl()
    {
        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        BackColor = Color.Transparent;
        refresher = new Timer();
        refresher.Tick += TimerOnTick;
        refresher.Interval = 50;
        refresher.Enabled = true;
        refresher.Start();
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x20;
            return cp;
        }
    }

    protected override void OnMove(EventArgs e)
    {
        RecreateHandle();
    }


    protected override void OnPaint(PaintEventArgs e)
    {
        if (_image != null)
        {
            e.Graphics.DrawImage(_image, (Width / 2) - (_image.Width / 2), (Height / 2) - (_image.Height / 2));
        }
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
       //Do not paint background
    }

    //Hack
    public void Redraw()
    {
        RecreateHandle();
    }

    private void TimerOnTick(object source, EventArgs e)
    {
        RecreateHandle();
        refresher.Stop();
    }

    public Image Image
    {
        get
        {
            return _image;
        }
        set
        {
            _image = value;
            RecreateHandle();
        }
    }
}
于 2009-01-12T07:26:44.943 回答
6

PictureBox 有 2 层图像:BackgroundImage 和 Image,可以相互独立使用,包括绘图和清除。

于 2011-10-14T12:17:35.307 回答
4

将大/底部图像放在 a 上PictureBox,然后将处理程序添加到OnPaint事件并使用其中一个e.Graphics.DrawImage()重载。您可以使用加载图像Image.FromFile()

小/顶部图像必须有一个 Alpha 通道并且在背景中是透明的,这样叠加才能起作用。您应该能够在 Photoshop 或类似软件中轻松确保这一点。确保以支持 Alpha 通道的格式保存,例如 PNG。

于 2008-12-27T19:09:35.160 回答
3

vb.net 代码(所有归功于 Leon Tayson):

Imports System
Imports System.Windows.Forms
Imports System.Drawing

Public Class TransparentControl
    Inherits Control

    Private ReadOnly Local_Timer As Timer
    Private Local_Image As Image

    Public Sub New()
        SetStyle(ControlStyles.SupportsTransparentBackColor, True)
        BackColor = Color.Transparent
        Local_Timer = New Timer
        With Local_Timer
            .Interval = 50
            .Enabled = True
            .Start()
        End With

        AddHandler Local_Timer.Tick, AddressOf TimerOnClick

    End Sub

    Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
        Get
            Dim cp As CreateParams
            cp = MyBase.CreateParams
            cp.ExStyle = &H20
            Return cp
        End Get
    End Property

    Protected Overrides Sub OnMove(ByVal e As System.EventArgs)
        MyBase.OnMove(e)
        RecreateHandle()
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)

        If Local_Image IsNot Nothing Then _
            e.Graphics.DrawImage(Local_Image, New Rectangle(0, 0, (Width / 2) - (Local_Image.Width / 2), (Height / 2) - (Local_Image.Height / 2)))

    End Sub

    Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs)
        ' DO NOT PAINT BACKGROUND
    End Sub

    ''' <summary>
    ''' Hack
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub ReDraw()
        RecreateHandle()
    End Sub

    Private Sub TimerOnClick(ByVal sender As Object, ByVal e As System.EventArgs)
        RecreateHandle()
        Local_Timer.Stop()

    End Sub

    Public Property Image As Image
        Get
            Return Local_Image
        End Get
        Set(ByVal value As Image)
            Local_Image = value
            RecreateHandle()
        End Set
    End Property
End Class
于 2012-08-20T17:32:14.337 回答
2

此回复底部引用了类似帖子的列表。

此回复涉及图片框和 Winforms(在下面的其他帖子中,有几个重申 WPF 已经很好地解决了这个问题)

  1. 创建 Winform
  2. 创建 x2 图片框
    • foreground_pictureBox // “背景”的“前面”图片框
    • background_pictureBox // 图片框 'behind' 'foreground'
  3. 为每个图片框添加 'paint' 事件
    • 在“设计器”中选择对象
    • 选择“属性”选项卡(或右键单击并从弹出菜单中选择)
    • 选择事件按钮(小闪电)
    • 双击“paint”事件右侧的空白字段
  4. 将以下代码添加到主窗体的“加载”函数中(如果尚未添加,请使用步骤 3 中的方法并选择“加载时”而不是“绘制”)

=

private void cFeedback_Form_Load(object sender, EventArgs e)
{
    ...
    // Ensure that it is setup with transparent background
    foreground_pictureBox.BackColor = Color.Transparent;

    // Assign it's 'background'
    foreground_pictureBox.Parent = background_pictureBox;
    ...
}

5. 在 'background_pictureBox' 的 'paint' 调用中:

=

private void background_pictureBox_Paint(object sender, PaintEventArgs e)
{
    ...foreground_pictureBox_Paint(sender, e);
}

6. 在“foreground_pictureBox_Paint”调用中,添加您希望在前景中显示的任何图形调用。

这个话题似乎在几篇文章中重复出现:

如何使图片框透明

c-sharp-picturebox-transparent-background-doesnt-seem-to-work

在 c-net 中制作重叠图片框透明

图片框问题

于 2014-02-26T15:32:40.643 回答
0

我一直发现我必须自己合成图像,使用单个图片框或控件。拥有两个带有透明部分的图片框对我来说从来没有用过。

于 2008-12-28T20:21:43.860 回答