我想在窗體的擴展玻璃框上繪製文本框。我不會描述這種技術,這是衆所周知的。以下是一些沒有聽說過的例子:http://www.danielmoth.com/Blog/Vista-Glass-In-C.aspx在沒有WPF的擴展玻璃框中繪製文本框
問題是,畫這個玻璃框很複雜。由於黑色被認爲是0-alpha顏色,黑色消失。
有明顯的方法來解決這個問題:繪製複雜的GDI +形狀不受這個alpha-ness的影響。例如,該代碼可以被用來繪製在玻璃上的標籤(注:GraphicsPath
爲了避開可怕的ClearType問題是用來代替DrawString
):
public class GlassLabel : Control
{
public GlassLabel()
{
this.BackColor = Color.Black;
}
protected override void OnPaint(PaintEventArgs e)
{
GraphicsPath font = new GraphicsPath();
font.AddString(
this.Text,
this.Font.FontFamily,
(int)this.Font.Style,
this.Font.Size,
Point.Empty,
StringFormat.GenericDefault);
e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
e.Graphics.FillPath(new SolidBrush(this.ForeColor), font);
}
}
類似地,這樣的方法可以用於在玻璃區域創建一個容器。請注意使用多邊形而不是矩形 - 使用矩形時,其黑色部分被視爲alpha。
public class GlassPanel : Panel
{
public GlassPanel()
{
this.BackColor = Color.Black;
}
protected override void OnPaint(PaintEventArgs e)
{
Point[] area = new Point[]
{
new Point(0, 1),
new Point(1, 0),
new Point(this.Width - 2, 0),
new Point(this.Width - 1, 1),
new Point(this.Width -1, this.Height - 2),
new Point(this.Width -2, this.Height-1),
new Point(1, this.Height -1),
new Point(0, this.Height - 2)
};
Point[] inArea = new Point[]
{
new Point(1, 1),
new Point(this.Width - 1, 1),
new Point(this.Width - 1, this.Height - 1),
new Point(this.Width - 1, this.Height - 1),
new Point(1, this.Height - 1)
};
e.Graphics.FillPolygon(new SolidBrush(Color.FromArgb(240, 240, 240)), inArea);
e.Graphics.DrawPolygon(new Pen(Color.FromArgb(55, 0, 0, 0)), area);
base.OnPaint(e);
}
}
現在我的問題是:如何繪製文本框? 經過大量的谷歌搜索,我想出了以下解決方案:
- 子類文本框的
OnPaint
方法。這是可能,雖然我無法讓它正常工作。它應該涉及繪製一些我不知道該怎麼做的魔術。 - 製作我自己的自定義
TextBox
,或許在TextBoxBase
。如果有人有好,有效和工作的例子,並認爲這可能是一個很好的整體解決方案,請告訴我。 - 使用
BufferedPaintSetAlpha
。 (http://msdn.microsoft.com/en-us/library/ms649805.aspx)。這種方法的缺點可能是文本框的角落看起來很古怪,但我可以忍受。如果有人知道如何從Graphics對象中正確實現該方法,請告訴我。我個人不這樣做,但這似乎是迄今爲止最好的解決方案。說實話,我發現了一篇很棒的C++文章,但我懶得轉換它。 http://weblogs.asp.net/kennykerr/archive/2007/01/23/controls-and-the-desktop-window-manager.aspx
注:如果我曾經與BufferedPaint方法成功了,我發誓S/O,我會做一個簡單的DLL與所有常見的Windows窗體控件可繪製在玻璃上。
回答自己在另一個線程:http://stackoverflow.com/questions/7061531/rendering-controls-on-glass-solution-found-needs-double-buffering-perfecting – Lazlo 2012-01-12 04:54:23