C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: TextBoxの枠線を破線にしたい。


(過去ログ 59 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■33510 / inTopicNo.1)  TextBoxの枠線を破線にしたい。
  
□投稿者/ Roman (1回)-(2009/03/02(Mon) 23:56:36)

分類:[.NET 全般] 

Windows付属のPaintでは指定位置にテキストを入力/表示させることができますが、現在私のアプリ内で
そのような機能を作成しています。

私のアプリでは、
 1.PictureBox上でクリックした位置に動的にTextBoxを表示
 2.ユーザはTextBoxにテキストを入力
 3.TextBox外のPictureBoxをクリックすることで入力確定とし、PicutureBoxにTextBoxの位置にテキストを
   描画
 4.TextBoxを消去
という手順で実現しています。

1.でTextBoxを表示する際に、「入力中であること、及び、サイズ可変であること」を示すために、Paintと
同様に枠線を破線にしたいと考えていますが、その方法がわかりません。
TextBoxのBorderStyleでは「3D/実線/なし」は選べますが、破線にしたい場合はどのようにすれば良いので
しょうか?

以下の開発環境で作成しています。

 Windows Vista
 Visual Studio 2005 Pro
 C#

よろしくお願いします。

引用返信 編集キー/
■33511 / inTopicNo.2)  Re[1]: TextBoxの枠線を破線にしたい。
□投稿者/ Azulean (312回)-(2009/03/03(Tue) 00:11:41)
> 1.でTextBoxを表示する際に、「入力中であること、及び、サイズ可変であること」を示すために、Paintと
> 同様に枠線を破線にしたいと考えていますが、その方法がわかりません。
> TextBoxのBorderStyleでは「3D/実線/なし」は選べますが、破線にしたい場合はどのようにすれば良いので
> しょうか?
>
BorderStyleは「なし」にして、自分でその破線を描くと言うことになりそう。
実際、「サイズが可変であること」を示すということは、小さな四角形も描画して、そこを掴めるように見せる必要もあるんですよね?
そのあたりは標準で実装されている部分ではないため、自作することになるはずです。

実現に向けての詳細なところは見られていませんので、検索してみて探ってみるところからでしょうか。
http://dobon.net/vb/bbs/log3-12/7160.html
引用返信 編集キー/
■33512 / inTopicNo.3)  Re[1]: TextBoxの枠線を破線にしたい。
□投稿者/ Jitta on the way (279回)-(2009/03/03(Tue) 07:05:09)
No33510 (Roman さん) に返信
> Windows付属のPaintでは指定位置にテキストを入力/表示させることができますが、現在私のアプリ内で
> そのような機能を作成しています。
>
> 私のアプリでは、
>  1.PictureBox上でクリックした位置に動的にTextBoxを表示
>  2.ユーザはTextBoxにテキストを入力
>  3.TextBox外のPictureBoxをクリックすることで入力確定とし、PicutureBoxにTextBoxの位置にテキストを
>    描画
>  4.TextBoxを消去
> という手順で実現しています。
>
> 1.でTextBoxを表示する際に、「入力中であること、及び、サイズ可変であること」を示すために、Paintと
> 同様に枠線を破線にしたいと考えていますが、その方法がわかりません。

textbox を使わず、自分で描画します。
あるいは、別のフォームでテキスト入力を行います。
引用返信 編集キー/
■33522 / inTopicNo.4)  Re[2]: TextBoxの枠線を破線にしたい。
□投稿者/ たくボン (150回)-(2009/03/03(Tue) 12:14:34)
No33511 (Azulean さん) に返信
> BorderStyleは「なし」にして、自分でその破線を描くと言うことになりそう。
> 実際、「サイズが可変であること」を示すということは、小さな四角形も描画して、そこを掴めるように見せる必要もあるんですよね?
> そのあたりは標準で実装されている部分ではないため、自作することになるはずです。

うろ覚えだけど、サイズ変更用の破線とグリップを描画する関数は.NET1.0の時からあったような・・・。
System.Drawingのどっかだったと思う(うろ覚えでごめん)
コントロールの位置・サイズを動的に変更させるサンプルはゴロゴロ転がってるので、使いやすいのを使えばいいかも。

ちなみに俺は動的にコントロールにアタッチさせる方法でクラスを使いまわししてます。(継承とかにすると面倒くさいから。ただしグリップは出してないですw)
引用返信 編集キー/
■33541 / inTopicNo.5)  Re[3]: TextBoxの枠線を破線にしたい。
□投稿者/ よねKEN (282回)-(2009/03/03(Tue) 16:29:48)
> うろ覚えだけど、サイズ変更用の破線とグリップを描画する関数は.NET1.0の時からあったような・・・。
> System.Drawingのどっかだったと思う(うろ覚えでごめん)

ControlPaint クラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.controlpaint.aspx

ですかね。(どの程度有用かは実際にあまり利用したことがないので何とも言えませんが)
引用返信 編集キー/
■33550 / inTopicNo.6)  Re[2]: TextBoxの枠線を破線にしたい。
□投稿者/ Roman (2回)-(2009/03/03(Tue) 23:19:12)
ご回答いただき、ありがとうございます。
早速検証してみました。
こちらの認識違い等ありましたら、ご指摘願います。

#サイズ可変の部分については未調査で、まずは枠線から調査しています。

テキストボックスの枠線について、TextBoxを継承したクラスを実装する方向でとりあえず進めてみました。
OnPaint() の中で、Graphics.DrawRectangle() あるいは ControlPaint.DrawBorder() で枠線を書くことは
できました。
ただ、Azuleanさんご紹介の URL のページにもある通り、この枠線はテキストボックスの「内枠」となり、
通常の枠線とは見た目が異なってしまいます。
それに、SetStyle(ControlStyles.UserPaint, true) が必要であるため、テキストボックスの描画内容を
自前で実装するのは難しいかなと直観しました。

Jitta on the wayさんの仰るように、テキストボックスを使わない方が良かったのかもしれませんが、
現状で機能するところまで作成できており、破線ができなければ実線で妥協しようと思っています。

情報を探してみたところ、Panelの境界線を破線にする方法が以下のページで紹介されています。
http://youryella.wankuma.com/Library/Extensions/Control/BorderDraw.aspx

「それなら破線のPanelの中にテキストボックスを含めたコントロールを作ればいいのでは?」と考えて、
以下のようなクラスを作成してみたところ「外枠」が表示され、私の思っていたような見た目が一応は
実現できました。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public enum BorderStyle : int
    {
        None = 0,
        Dash = 2,
        DashDot = 4,
        DashDotDot = 5,
        Dot = 3,
        Solid = 1,
    }

    public class EmTextBox : Panel
    {
        private TextBox textBox = null;

        public EmTextBox()
        {
            base.BorderStyle = System.Windows.Forms.BorderStyle.None;
            this._BorderColor = Color.Black;
            this._BorderStyle = WindowsApplication1.BorderStyle.None;
            this._BorderWidth = 1;
            this.BackColor = Color.Transparent;

            textBox = new TextBox();
            textBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
            textBox.Location = new Point(0, 0);
            textBox.Multiline = true;

            this.Controls.Add(textBox);
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            if (this.BorderStyle != BorderStyle.None)
            {
                using (Pen p = new Pen(this.BorderColor, this.BorderWidth))
                {
                    p.DashStyle = this.ConvertToDashStyle(this.BorderStyle);
                    Rectangle r = this.ClientRectangle;
                    r.X += r.X + Convert.ToInt32(decimal.Floor(Convert.ToDecimal(this.BorderWidth / 2)));
                    r.Y += r.Y + Convert.ToInt32(decimal.Floor(Convert.ToDecimal(this.BorderWidth / 2)));
                    r.Width -= this.BorderWidth;
                    r.Height -= this.BorderWidth;
                    e.Graphics.DrawRectangle(p, r);
                }
            }
        }

        protected override void OnResize(EventArgs eventargs)
        {
            base.OnResize(eventargs);

            if (this.BorderStyle == BorderStyle.None)
            {
                textBox.Size = this.Size;
            }
            else
            {
                int padding = this.BorderWidth * 2;
                textBox.Size = new Size(this.Width - padding, this.Height - padding);
            }
        }

        protected override void OnLocationChanged(EventArgs e)
        {
            base.OnLocationChanged(e);

            if (this.BorderStyle == BorderStyle.None)
            {
                textBox.Location = new Point(0, 0);
            }
            else
            {
                textBox.Location = new Point(this.BorderWidth, this.BorderWidth);
            }
        }

        private DashStyle ConvertToDashStyle(WindowsApplication1.BorderStyle style)
        {
            return (DashStyle)style - 1;
        }

        private Color _BorderColor;
        [Category("表示")]
        [DefaultValue(typeof(Color), "Black")]
        [Description("コントロールの境界線色を取得または設定します。")]
        public Color BorderColor
        {
            get { return this._BorderColor; }
            set
            {
                this._BorderColor = value;
                this.Invalidate();
            }
        }

        private BorderStyle _BorderStyle;
        [Category("表示")]
        [DefaultValue(typeof(BorderStyle), "None")]
        [Description("コントロールの境界線スタイルを取得または設定します。")]
        public new BorderStyle BorderStyle
        {
            get { return this._BorderStyle; }
            set
            {
                this._BorderStyle = value;
                this.Invalidate();
            }
        }

        private int _BorderWidth;
        [Category("表示")]
        [DefaultValue(1)]
        [Description("コントロールの境界線の幅を取得または設定します。")]
        public int BorderWidth
        {
            get { return this._BorderWidth; }
            set
            {
                this._BorderWidth = value;
                this.Invalidate();

                if (this.BorderStyle == BorderStyle.None)
                {
                    textBox.Size = this.Size;
                }
                else
                {
                    int padding = this.BorderWidth * 2;
                    textBox.Size = new Size(this.Width - padding, this.Height - padding);
                }
            }
        }
    }
}


ただし、Panelを継承したテキストボックスというのが、私はとても気に入りません。
こういうやり方はよくないのでしょうか?

引用返信 編集キー/
■33551 / inTopicNo.7)  Re[4]: TextBoxの枠線を破線にしたい。
□投稿者/ たくボン (151回)-(2009/03/03(Tue) 23:34:19)
No33541 (よねKEN さん) に返信
> ControlPaint クラス
> http://msdn.microsoft.com/ja-jp/library/system.windows.forms.controlpaint.aspx
>
> ですかね。(どの程度有用かは実際にあまり利用したことがないので何とも言えませんが)

あ、そうそうこれこれ(笑)
標準のコントロールもどきを作る時は結構使えたと思うけど、もう何年も使ってないからどうだったか忘れたなぁ。
昼間は会社だったので、ソースが手元になくてSystem.DrawingとかDrawing2Dとか探しまくってたんだけど、見つからなくて「ムッキーッ」ってなるくらい悩んでました(笑)
引用返信 編集キー/
■33553 / inTopicNo.8)  Re[3]: TextBoxの枠線を破線にしたい。
□投稿者/ Azulean (313回)-(2009/03/04(Wed) 00:20:18)
言い訳になります。

-- ここから --

>実際、「サイズが可変であること」を示すということは、小さな四角形も描画して、そこを掴めるように見せる必要もあるんですよね?
>そのあたりは標準で実装されている部分ではないため、自作することになるはずです。
この一文は、「TextBoxに標準で実装されている部分ではない」ということを主張していました。

-- ここまで --

ControlPaintはDrawReversibleLineみたいにけったいなものも居るので敬遠してたなぁ。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -