none
テキストボックスでwordのように横倍角文字(または半角文字)を表示・入力することは可能でしょうか? RRS feed

  • 質問

  • 現在、windowsアプリケーションを作成中です。

    そこで、wordで文字の倍率指定ができる機能があるのを知っていたので同様のことができないか模索しています。(やりたいのは、全角文字を半角で表示、入力したいです)

    現状、textBoxを拡張し、onPaintイベントをハンドリングしGraphics.DrawStringで文字のサイズ指定をして描画すると表示は実現ました。

    しかし、キャレット位置がおかしくなるのと、移動するとサイズが元にもどってしまいます。

    実現方法の妥当性も含めご教授いただければ幸いです。

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Collections;
    
    
    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                InitializeTextBox();
            }
    
    #region TextBox メンバ
            TextBoxEx textBox1;
            private void InitializeTextBox()
            {
                this.textBox1 = new TextBoxEx();
                ((System.ComponentModel.ISupportInitialize)(textBox1)).BeginInit();
                // 
                // textBox1
                // 
                this.textBox1.Location = new System.Drawing.Point(0, 0);
                this.textBox1.Name = "textBox1";
                this.textBox1.Size = new System.Drawing.Size(300, 26);
                this.textBox1.Font = new System.Drawing.Font("MS ゴシック", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
                this.textBox1.TabIndex = 0;
    
                this.Controls.Add(this.textBox1);
                ((System.ComponentModel.ISupportInitialize)(textBox1)).EndInit();
    
                //this.textBox1.Enabled = false;
                this.textBox1.ReadOnly = true;
                this.textBox1.Text = "あいうえお亜亜亜亜亜亜亜";
            }
    #endregion
    
        }
    
    
    
        public partial class TextBoxEx : System.Windows.Forms.TextBox, ISupportInitialize
        {
            public TextBoxEx()
                : base()
            {
                this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
            }
    
            protected override void OnPaintBackground(PaintEventArgs pevent)
            {
                base.OnPaintBackground(pevent);
                using (Brush backBrush = new SolidBrush(this.BackColor))
                    pevent.Graphics.FillRectangle(backBrush, 0, 0, this.Width - 1, this.Height - 1);
            }
    
            protected override void OnPaint(PaintEventArgs e)
            {
    
                base.OnPaint(e);
                //using (Graphics g = CreateGraphics())
    	   using (Graphics g = e.Graphics)
    
    	   using (Brush backBrush = new SolidBrush(this.BackColor))
                {
                    g.ScaleTransform(0.5f, 1.0f);
                    Rectangle rect = this.ClientRectangle;
                    rect.Width = rect.Width / 2;
    
                    //TextRenderer.DrawText(g, this.Text, this.Font, this.ClientRectangle, this.DisableForeColor, tff);
    
                    StringFormat sf = new StringFormat();
                    sf.Alignment = StringAlignment.Near;
                    sf.FormatFlags = StringFormatFlags.NoWrap;
                    e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), this.ClientRectangle, sf);
    	  }
            }
        }
    
    }
    
    
    
    

     

     

    2010年4月5日 7:20