プロが教えるわが家の防犯対策術!

C#で角が丸いテキストボックス

C#で角が丸いテキストボックスを作成したいと考えています。
グループ化されたラベルやテキストボックスを解り易くしたい為です。

どなたかアドバイスよろしくお願いします。

A 回答 (3件)

 こんばんは。


 ん? リージョンの事ですかねえ。
 http://dobon.net/vb/dotnet/form/formregion.html

 RoundRectangleのリージョンは存在しないので、チョッと面倒みたいです。
 http://www.geekpedia.com/code112_Draw-Rounded-Co …

 上記のソースを御拝借して書くと、こんな感じです。かなり雑ですが、参考程度に。
 後はTextBoxのBorderStyleをNoneにしておいて、TextBox用のペイントハンドラで、RoundRectangleの枠を描いて見てください。

private void SetRoundRect(Control ctl, float radius)
{
int width = ctl.Width;
int height = ctl.Height;

System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();

gp.AddLine(radius, 0, width - (radius * 2), 0); // Line
gp.AddArc(width - (radius * 2), 0, radius * 2, radius * 2, 270, 90); // Corner
gp.AddLine(width, radius, width, height - (radius * 2)); // Line
gp.AddArc(width - (radius * 2), height - (radius * 2), radius * 2, radius * 2, 0, 90); // Corner
gp.AddLine(width - (radius * 2), height, radius, height); // Line
gp.AddArc(0, height - (radius * 2), radius * 2, radius * 2, 90, 90); // Corner
gp.AddLine(0, height - (radius * 2), 0, radius); // Line
gp.AddArc(0, 0, radius * 2, radius * 2, 180, 90); // Corner
gp.CloseFigure();
ctl.Region = new Region(gp);
}

private void Form1_Load(object sender, EventArgs e)
{
SetRoundRect(this.textBox1, 20.0F);
}

この回答への補足

すいません。
上記コードを実行したのですが、角のラインがどうしてもうまく描けません。

塗りつぶしは角丸になっているのですが、ラインが消えてしまいます。
アドバイスお願いします。m(__)m

補足日時:2010/08/10 07:37
    • good
    • 0
この回答へのお礼

ありがとうございました。
非常に参考になりました。
上記ソースを参考に勉強します。

重ねてありがとうございました。m(__)m

お礼日時:2010/08/09 07:09

 こんばんは。

補足頂きました。
 チョッと正攻法では無理な様ですので、枠を描かせない様にして下さい。

 フォームデザイナで、黒いパネルコントロールを貼り付けて、そのパネルコントロールの上にテキストボックスを乗せてください。
 その黒いパネルコントロールも一緒に、リージョンをかければ、テキストボックスの枠の様に見せかけれるでしょう。
 パネルコントロールは、テキストボックスよりも、+2程大きめに調整します。これはプログラムの中で行った方が楽です。

 後、フォームデザイナでパネルコントロールを配置した時、テキストボックスが隠れてしまったら、パネルコントロールを右クリックし、「最背面へ移動」を選択してください。
 これで、パネルコントロールの上にテキストボックスが来る筈です。

 以下の様にして見てください。

private void Form1_Load(object sender, EventArgs e)
{
panel1.Location = new Point(textBox1.Location.X - 2, textBox1.Location.Y - 2);
panel1.Size = new Size(textBox1.Width + 4, textBox1.Height + 4);
SetRoundRect(this.textBox1, 20.0F);
SetRoundRect(this.panel1, 20.0F);
}
    • good
    • 0
この回答へのお礼

何度もすいません。アドバイスありがとうございます。

正攻法では無理なんですね。残念です。

背景を少し見せるテクニック、非常に参考になりました。
もう一度挑戦してみます。m(__)m

お礼日時:2010/08/11 08:14

何をアドバイスしてほしいのかわかりませんが、1つ。



考えているだけでは何も変わりませんよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A