سؤال

أنا أعمل على تطبيق Windows Forms في VS 2008، وأريد عرض صورة واحدة فوق الجزء العلوي من آخر، مع أن الصورة العليا هي GIF أو شيء ما مع أجزاء شفافة.

في الأساس، لدي صورة كبيرة وأريد وضع صورة صغيرة على القمة إذا كان ذلك، بحيث تظهر كيندا كصورة واحدة للمستخدم.

لقد كنت أحاول استخدام صورة شخصية، ولكن هذا لا يبدو أنه عمل، أي اقتراحات؟

هل كانت مفيدة؟

المحلول

كنت في موقف مماثل قبل يومين. يمكنك إنشاء عنصر تحكم شفاف لاستضافة صورتك.

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();
        }
    }
}

نصائح أخرى

يحتوي PictureBox على طبقتين من الصور: الخلفية والصورة، والتي يمكنك استخدامها بشكل مستقل عن بعضها البعض بما في ذلك الرسم والتخليص.

وضع الصورة الكبيرة / أسفل على PictureBox, ، ثم أضف معالج إلى OnPaint الحدث واستخدام واحد من e.Graphics.DrawImage() الزائد. يمكنك تحميل الصورة باستخدام Image.FromFile().

سيتعين على الصورة الصغيرة / العليا أن تحتوي على قناة ألفا وتكون شفافة في الخلفية للتراكب للعمل. يجب أن تكون قادرا على ضمان هذا بسهولة في فوتوشوب أو شيء مماثل. تأكد من حفظ بتنسيق يدعم قناة Alpha، مثل PNG.

رمز VB.NET (جميع الاعتمادات إلى ليون تايسون):

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

تتم الإشارة إلى قائمة الوظائف المماثلة في الجزء السفلي من هذا الرد.

يتناول هذا الرد على الصرافين و WinForms (في الوظائف الأخرى أدناه، مضرر عدة أن WPF يحل هذا جيدا بالفعل)

  1. إنشاء WinForm.
  2. قم بإنشاء X2 PictureBoxes.
    • Forefrund_PictureBox // مربع الصورة "في المقدمة" من "الخلفية"
    • Background_PictureBox // مربع الصورة "وراء" الأمامية "
  3. أضف حدث "الطلاء" لكل صندوق صور
    • حدد كائن في "مصمم"
    • اختر علامة التبويب "الخصائص" (أو النقر بزر الماوس الأيمن واختر من القائمة المنبثقة)
    • حدد زر الأحداث (الترباس الصغير الصغير)
    • انقر نقرا مزدوجا في الحقل الفارغ إلى يمين حدث "الطلاء"
  4. أضف التعليمات البرمجية التالية إلى وظيفة "تحميل" النموذج الرئيسي (إن لم تكن مصنوعة بالفعل، استخدم النهج في الخطوة 3 وحدد "On Load" بدلا من "الطلاء")

=

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":

=

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

6. داخل "Forefer_PictureBox_paint"، أضف إلى أي مكالمات رسومات تريد أن يتم عرضها في المقدمة.

يكرر هذا الموضوع نفسه في العديد من المشاركات يبدو:

كيفية جعل - جعل صورة شفاف

C-Sharp-PictureBox-خلفية شفافة-لا يعمل-للعمل

جعل متداخلة - picturebox-in-c-net

مشكلة PictureBox

لقد وجدت دائما أنني اضطررت إلى مركب الصور بنفسي، باستخدام صورة شخصية واحدة أو عنصر تحكم. وجود صندوقين صورتي مع أجزاء شفافة لم يعمل أبدا من أجلي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top