Сделать контроль прозрачным
В настоящее время я разрабатываю простой инструмент для редактирования изображений с использованием Winforms и .NET 3.5
(рабочая среда).
У меня есть требование, что когда пользователь нажимает кнопку выбора инструмента, появляется квадрат (прямоугольник в C#), чтобы они могли масштабироваться между 100x100
а также 400x400
, Я исправил этот бит - проблема заключается в том, чтобы сделать фон прямоугольника прозрачным.
Мне немного неясно, поддерживается ли прозрачность в .NET 3.5
Я пробовал следующее:
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
pnlSelectArea.BackColor = Color.Transparent;
pnlSelectArea.ForeColor = Color.Transparent;
selectArea1.BackColor = Color.Transparent;
selectArea1.ForeColor = Color.Transparent;
Но это не имеет никакого эффекта - любой совет будет оценен.
4 ответа
Это мой специальный элемент управления, который содержит свойство непрозрачности, он работает на 100%:
using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;
public class TranspCtrl : Control
{
public bool drag = false;
public bool enab = false;
private int m_opacity = 100;
private int alpha;
public TranspCtrl()
{
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
SetStyle(ControlStyles.Opaque, true);
this.BackColor = Color.Transparent;
}
public int Opacity
{
get
{
if (m_opacity > 100)
{
m_opacity = 100;
}
else if (m_opacity < 1)
{
m_opacity = 1;
}
return this.m_opacity;
}
set
{
this.m_opacity = value;
if (this.Parent != null)
{
Parent.Invalidate(this.Bounds, true);
}
}
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | 0x20;
return cp;
}
}
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
Rectangle bounds = new Rectangle(0, 0, this.Width - 1, this.Height - 1);
Color frmColor = this.Parent.BackColor;
Brush bckColor = default(Brush);
alpha = (m_opacity * 255) / 100;
if (drag)
{
Color dragBckColor = default(Color);
if (BackColor != Color.Transparent)
{
int Rb = BackColor.R * alpha / 255 + frmColor.R * (255 - alpha) / 255;
int Gb = BackColor.G * alpha / 255 + frmColor.G * (255 - alpha) / 255;
int Bb = BackColor.B * alpha / 255 + frmColor.B * (255 - alpha) / 255;
dragBckColor = Color.FromArgb(Rb, Gb, Bb);
}
else
{
dragBckColor = frmColor;
}
alpha = 255;
bckColor = new SolidBrush(Color.FromArgb(alpha, dragBckColor));
}
else
{
bckColor = new SolidBrush(Color.FromArgb(alpha, this.BackColor));
}
if (this.BackColor != Color.Transparent | drag)
{
g.FillRectangle(bckColor, bounds);
}
bckColor.Dispose();
g.Dispose();
base.OnPaint(e);
}
protected override void OnBackColorChanged(EventArgs e)
{
if (this.Parent != null)
{
Parent.Invalidate(this.Bounds, true);
}
base.OnBackColorChanged(e);
}
protected override void OnParentBackColorChanged(EventArgs e)
{
this.Invalidate();
base.OnParentBackColorChanged(e);
}
}
Вам нужно будет использовать Opacity
свойство и установите его в ноль, чтобы сделать форму невидимой.
Если вы хотите сделать элемент управления прозрачным, как вы пытались в своем примере, см. Эту статью
Как: дать вашему контролю прозрачный фон
Это говорит, что код, который вы написали, должен быть в конструкторе элемента управления. Следовательно, я думаю, вам нужно будет создать собственный элемент управления, полученный из вашего pnlSelectArea
Тип скорее всего кнопка. В конструкторе этого пользовательского элемента управления вы можете написать код, чтобы установить его стиль и цвет.
Вот что сработало для меня, потому что другие решения не работали.
Это с прозрачным UserControl, добавленным в ListView/TreeView Control Collection
Я знаю, что это говорит ButtonRenderer, но это должно работать для любых элементов управления.
В пользовательском контроле:
protected override void OnPaint(PaintEventArgs e)
{
ButtonRenderer.DrawParentBackground(e.Graphics, this.ClientRectangle, this);
}
в родительском контроле:
protected override void WndProc(ref Message m)
{
if(m.Msg == 0xF)
foreach(Control c in this.Controls) { c.Invalidate(); c.Update(); }
base.WndProc(ref m);
}
Отличный!! Мне наконец-то удалось нарисовать прозрачные фигуры. Я добавил виртуальный метод
Draw(g);
прямо перед
bckColor.Dispose();
g.Dispose();
base.OnPaint(e);
и в конце объявление виртуального метода
protected virtual void Draw(Graphics g){ }
Теперь я могу продолжать создавать свои прозрачные фигуры, графику и т. Д.
Для этого есть одно простое решение. Вы можете создать изображение с прозрачным фоном (PNG) и добавить его в свойство Image значка. Это прекрасно работает, поскольку информация не имеет особой гибкости в стилизации. Иногда это может подойти не всем. Помните, что это только обходной путь.
PS: Добавьте текст на изображении и оставьте поле пустым для свойства text.