Transparente PNG

18/10/2009 - 11:07 von Lothar Franke | Report spam
Hallo!

Ich habe in einer Windows Forms-Anwendung ein DataGridView mit
alternierender Background-Color. Darüber möchte ich nun eine transparente png
legen (Hintergrund für eine Art selbst gebasteltes Kontextmenü). Das
DataGridView soll aber noch durch die png durchscheinen.

Zunàchst dachte ich, dass ein Panel mit transparenter Background Color und
der png als BackgroundImage zum Ziel führen würde. Tat es aber nicht.

Wie komme ich nun zum Ziel?

Gruß,
Lothar
 

Lesen sie die antworten

#1 Frank Dzaebel
18/10/2009 - 12:25 | Warnen spam
Hallo Lothar,

Ich habe in einer Windows Forms-Anwendung ein DataGridView mit
alternierender Background-Color. Darüber möchte ich nun eine
transparente png legen (Hintergrund für eine Art selbst gebasteltes
Kontextmenü). Das DataGridView soll aber noch durch die png
durchscheinen.

Zunàchst dachte ich, dass ein Panel mit transparenter Background
Color und der png als BackgroundImage zum Ziel führen würde. Tat es
aber nicht.



Ich hatte hier bereits mal einen Ansatz gepostet, der hier
ggf. auch passt. Dabei wird ein TransparentPanel-
UserControl benutzt, dass auch über DataGridView's funktioniert.
Ein Aufruf-Beispiel wàre etwa:

TransparentPanel tp = new TransparentPanel(); // Code ist ungeprüft.
DataGridView dgv = new DataGridView();

private void Form1_Load(object sender, EventArgs e)
{
Button btn = new Button(); btn.Text = "FadeIn";
btn.Click += new EventHandler(Btn_Click);
dgv.Columns.Add("Spalte1", "Spalte1");
dgv.Columns.Add("Spalte2", "Spalte2");
dgv.Columns.Add("Spalte3", "Spalte3");
Controls.Add(dgv); dgv.Width = 400;
const int maxRows = 100;
for (int i = 0; i < maxRows; i++)
dgv.Rows.Add(i, i + 1, i + 2);
Controls.Add(tp); Controls.Add(btn);
btn.Left = 400;
}

void Btn_Click(object sender, EventArgs e)
{
tp.BringToFront();
tp.FadeInStandardSynchron();
}
_______________

Hier der Code für das UserControl:

// TransparentPanel.cs:

using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;
using System.Diagnostics;


public class TransparentPanel : Panel
{
public TransparentPanel()
{
brush = new SolidBrush(Color.FromArgb(alpha, SystemColors.Control));
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
UpdateStyles();
}

/// <summary>This method makes sure that the background is
/// what is directly behind the control and not what is
/// behind the form...</summary>
override protected CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= (int)ExStyles.WS_EX_TRANSPARENT;
return cp;
}
}

Brush brush;

protected override void OnPaint(PaintEventArgs pe)
{
Debug.WriteLine("in Paint: brush.Color = " +
((SolidBrush)brush).Color.ToString());
Debug.WriteLine("pe.ClipRectangle = " + pe.ClipRectangle.ToString());
pe.Graphics.FillRectangle(brush, pe.ClipRectangle);
}

int alpha = 128;
[Description("The Opacity Level [0-255]. The lower the more transparent")]
[DisplayName("Alpha-Value")]
[Category("Deine Firma")]
[RefreshProperties(RefreshProperties.Repaint)]
///<summary>The Opacity Level [0-255]. The lower the more
transparent</summary>
public int Alpha
{
get { return alpha; }
set
{
alpha = value;
if (alpha > 255) alpha = 255;
if (alpha < 0) alpha = 0;
if (brush != null) brush.Dispose();
this.brush = new SolidBrush(Color.FromArgb(alpha,
SystemColors.Control));
Debug.WriteLine("Alpha:" + alpha.ToString());
this.Invalidate();
}
}

int firstAlphaValue;
int lastAlphaValue;
int stepWidth;
int intervalMillisecondes;


/// <summary>Fades this Control through changing the opacity.
/// Does not return, until Alpha has reached lastAlphaValue!
/// Meanwhile doing 'Application.DoEvents()'</summary>
/// <param name="firstAlphaValue">first alpha value</param>
/// <param name="lastAlphaValue">last alpha value</param>
/// <param name="stepWidth">the firstAlphaValue will be incremented
/// each timer step by this value (or decrement, if lastAlphaValue
/// is lower than firstAlphaValue). </param>
/// <param name="intervalMilliseconds">the Refreshrate in milliseconds of
the opacity change</param>
public void FadeInOutSynchron(int firstAlphaValue, int lastAlphaValue, int
stepWidth, int intervalMilliseconds)
{
if (lastAlphaValue < firstAlphaValue && stepWidth > 0)
this.stepWidth = -stepWidth;

this.firstAlphaValue = firstAlphaValue;
this.lastAlphaValue = lastAlphaValue;
this.stepWidth = stepWidth;
this.intervalMillisecondes = intervalMilliseconds;

Timer t = new Timer();
t.Interval = intervalMilliseconds;
t.Tick += new EventHandler(t_Tick);
this.Alpha = firstAlphaValue;
t.Enabled = true; // startet den Timer
Application.DoEvents();
while (!IsOverLastAlphaValue())
Application.DoEvents();
}

/// <summary>Der gestartete Timer hat sein Ziel erreicht.
/// Der Alpha-Wert hat lastAlphaValue überschritten</summary>
bool IsOverLastAlphaValue()
{
if (lastAlphaValue > firstAlphaValue)
return (this.Alpha >= lastAlphaValue);
else
return (this.Alpha <= lastAlphaValue);
}

void t_Tick(object sender, EventArgs e)
{
Timer t = (Timer)sender;
this.Alpha += stepWidth;
if (stepWidth > 0)
{
if ((this.Alpha + stepWidth) > lastAlphaValue)
{
t.Enabled = false; t.Stop();
Application.DoEvents();
return;
}
}
else
{
if ((this.Alpha + stepWidth) < lastAlphaValue)
{
t.Enabled = false; t.Stop();
Application.DoEvents();
return;
}
}
Application.DoEvents();
}

/// <summary>From Transparent to semitransparent in 1 Seconds.
/// Does not return, until Alpha has reached lastAlphaValue!
/// Meanwhile doing 'Application.DoEvents()'</summary>
public void FadeInStandardSynchron()
{
this.FadeInOutSynchron(0, 50, 10, 50);
}

override protected void OnPaintBackground(PaintEventArgs e)
{
// do nothing
}

#region Extended Windows Styles [Winuser.h]
/// <summary>Extended Windows Styles [Winuser.h]</summary>
[Flags]
private enum ExStyles : long
{
WS_EX_TRANSPARENT = 0x00000020L
// ... weitere ... //
}
#endregion

}
_________________________________________________


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen