フォームの拡張ガラス フレームに TextBox を描画しようとしています。この手法については説明しませんが、よく知られています。聞いたことがない人のために例を示します: http://www.danielmoth.com/Blog/Vista-Glass-In-C.aspx
問題は、このガラス フレームに描画するのは複雑なことです。黒は 0 アルファ カラーと見なされるため、黒はすべて消えます。
この問題に対抗する方法は明らかにあります: 複雑な GDI+ シェイプの描画は、このアルファネスの影響を受けません。たとえば、次のコードを使用して、ガラスにラベルを描画できます (注:恐ろしい ClearType 問題を回避するためにGraphicsPath
代わりに使用されます)。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);
}
}
同様に、このようなアプローチを使用して、ガラス領域にコンテナーを作成できます。長方形の代わりに多角形を使用していることに注意してください。長方形を使用すると、その黒い部分がアルファと見なされます。
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);
}
}
今私の問題は次のとおりです: TextBox を描画するにはどうすればよいですか? 多くのグーグル検索の後、次の解決策を思いつきました。
- TextBox の
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 メソッドで成功した場合は、ガラスに描画可能なすべての一般的な Windows フォーム コントロールを備えた単純な DLL を作成することを誓います。