Я знаю, что ваш вопрос основан на C # , но из-за сходства и простоты преобразования из VB.NET я добавлю полный VB *Версия 1006 *, которая также позволяет обновлять фон элемента управления при его перемещении.
У вас уже есть ответ, но это для тех, кто находит этот пост поисковыми системами и хочет VB версии, или просто хотите найти ПОЛНЫЙ конвертируемый образец, если он им также нужен в C # .
Создайте новый Пользовательский класс управления и вставьтеследуя ему ... перезаписываем класс по умолчанию:
Пользовательский класс управления:
Public Class TransparentPictureBox
Private WithEvents refresher As Timer
Private _image As Image = Nothing
Public Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
refresher = New Timer()
'refresher.Tick += New EventHandler(AddressOf Me.TimerOnTick)
refresher.Interval = 50
refresher.Start()
End Sub
Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
cp.ExStyle = cp.ExStyle Or &H20
Return cp
End Get
End Property
Protected Overrides Sub OnMove(ByVal e As EventArgs)
MyBase.OnMove(e)
MyBase.RecreateHandle()
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
'Add your custom paint code here
If _image IsNot Nothing Then
e.Graphics.DrawImage(_image, CInt(Width / 2) - CInt(_image.Width / 2), CInt(Height / 2) - CInt(_image.Height / 2))
End If
End Sub
Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs)
' Paint background with underlying graphics from other controls
MyBase.OnPaintBackground(e)
Dim g As Graphics = e.Graphics
If Parent IsNot Nothing Then
' Take each control in turn
Dim index As Integer = Parent.Controls.GetChildIndex(Me)
For i As Integer = Parent.Controls.Count - 1 To index + 1 Step -1
Dim c As Control = Parent.Controls(i)
' Check it's visible and overlaps this control
If c.Bounds.IntersectsWith(Bounds) AndAlso c.Visible Then
' Load appearance of underlying control and redraw it on this background
Dim bmp As New Bitmap(c.Width, c.Height, g)
c.DrawToBitmap(bmp, c.ClientRectangle)
g.TranslateTransform(c.Left - Left, c.Top - Top)
g.DrawImageUnscaled(bmp, Point.Empty)
g.TranslateTransform(Left - c.Left, Top - c.Top)
bmp.Dispose()
End If
Next
End If
End Sub
Public Property Image() As Image
Get
Return _image
End Get
Set(value As Image)
_image = value
MyBase.RecreateHandle()
End Set
End Property
Private Sub refresher_Tick(sender As Object, e As System.EventArgs) Handles refresher.Tick
MyBase.RecreateHandle()
refresher.Stop()
End Sub
End Class
... сохраняем класс, затем очищаем ваш проект, ипостроить снова.Новый элемент управления должен появиться как новый инструмент Item.Найдите его и перетащите в свою форму.
У меня были проблемы с этим элементом управления, хотя ... Это происходит, когда я пытаюсь загрузить анимированное изображение "Загрузка" .gif .
Изображение не анимируется, а также возникают проблемы с отображением, когда вы скрываете элемент управления, а затем попробуйте отобразить его снова.
Разберитесь с этими проблемами, и у вас получится отличный класс пользовательского элемента управления,:)
РЕДАКТИРОВАТЬ:
Я не знаю, будет ли работать следующее в IDE C # или нет, но вот моя попыткапреобразование:
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
public class TransparentPictureBox
{
private Timer withEventsField_refresher;
private Timer refresher {
get { return withEventsField_refresher; }
set {
if (withEventsField_refresher != null) {
withEventsField_refresher.Tick -= refresher_Tick;
}
withEventsField_refresher = value;
if (withEventsField_refresher != null) {
withEventsField_refresher.Tick += refresher_Tick;
}
}
}
private Image _image = null;
public TransparentPictureBox()
{
// This call is required by the designer.
InitializeComponent();
// Add any initialization after the InitializeComponent() call.
refresher = new Timer();
//refresher.Tick += New EventHandler(AddressOf Me.TimerOnTick)
refresher.Interval = 50;
refresher.Start();
}
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | 0x20;
return cp;
}
}
protected override void OnMove(EventArgs e)
{
base.OnMove(e);
base.RecreateHandle();
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
base.OnPaint(e);
//Add your custom paint code here
if (_image != null) {
e.Graphics.DrawImage(_image, Convert.ToInt32(Width / 2) - Convert.ToInt32(_image.Width / 2), Convert.ToInt32(Height / 2) - Convert.ToInt32(_image.Height / 2));
}
}
protected override void OnPaintBackground(System.Windows.Forms.PaintEventArgs e)
{
// Paint background with underlying graphics from other controls
base.OnPaintBackground(e);
Graphics g = e.Graphics;
if (Parent != null) {
// Take each control in turn
int index = Parent.Controls.GetChildIndex(this);
for (int i = Parent.Controls.Count - 1; i >= index + 1; i += -1) {
Control c = Parent.Controls(i);
// Check it's visible and overlaps this control
if (c.Bounds.IntersectsWith(Bounds) && c.Visible) {
// Load appearance of underlying control and redraw it on this background
Bitmap bmp = new Bitmap(c.Width, c.Height, g);
c.DrawToBitmap(bmp, c.ClientRectangle);
g.TranslateTransform(c.Left - Left, c.Top - Top);
g.DrawImageUnscaled(bmp, Point.Empty);
g.TranslateTransform(Left - c.Left, Top - c.Top);
bmp.Dispose();
}
}
}
}
public Image Image {
get { return _image; }
set {
_image = value;
base.RecreateHandle();
}
}
private void refresher_Tick(object sender, System.EventArgs e)
{
base.RecreateHandle();
refresher.Stop();
}
}
Попробуйте и убедитесь сами, я думаю: P
ps: я не гуру, так что ожидайте всевозможных ошибок в C #, иВерсии VB.NET.лол