5

次のコードを使用して、高さ調整可能で垂直方向に位置合わせ可能なテキストボックスを作成しています。これを行う必要がある理由は、winformテキストボックスの高さを調整可能にすることはできますが、テキストボックス内のテキストを垂直方向に揃えることができないためです。そこで、テキストOnPaintイベントを描画する必要があると判断しました。テキストボックスは現在正しい配置を示していますが、カーソルはテキストボックスの上にあります。この位置を制御する方法もありますか?

public class TextBoxHeightAdjustable : System.Windows.Forms.TextBox
{

    public TextBoxHeightAdjustable()
    {
        this.AutoSize = false;
        this.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
        this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        // This never runs no matter what I try!
        base.OnPaint(e);
        // Create a StringFormat object with the each line of text, and the block 
        // of text centered on the page.
        StringFormat stringFormat = new StringFormat();
        stringFormat.Alignment = StringAlignment.Center;
        stringFormat.LineAlignment = StringAlignment.Center;

        e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle, stringFormat);
    }
}
4

1 に答える 1

0

ハンスのアドバイスにもかかわらず、テキストボックスには単純な数値のようなテキストが含まれるため、続行しました。ハンスが言ったように、元のカーソルと活発に表示されたテキストを処理するためのオプションはあまりありません。そこで、次の拡張方法を使用し、ダブルクリックとキー押下の更新を無効にすることで、それらを非表示にしました。

    [DllImport("user32.dll")]
    static extern bool HideCaret(IntPtr hWnd);
    public static void HideCaret(this TextBox textBox)
    {
        HideCaret(textBox.Handle);
    }

したがって、最終的に次のコードは私の目的には機能しますが、完全であるとは言えません。私はまだ自分のカーソルを描く方法を理解するかもしれません。これが同様の問題を抱えている他の人に役立つことを願っています。

public class TextBoxHeightAdjustable : System.Windows.Forms.TextBox
{
    const int WM_DBLCLICK = 0xA3;
    const int WM_LBUTTONDBLCLK = 0x203;


    public TextBoxHeightAdjustable() : base()
    {
        this.AutoSize = false;
        this.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
        this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);
    }
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        //base.OnKeyPress(e);
        if (e.KeyChar == (char)Keys.Back)
        {
            Text = Text.Remove(Text.Length-1);
        } 
        else
        {
            Text += e.KeyChar;
        }
        e.Handled = true;
    }
    protected override void WndProc(ref Message m)
    {
        if ((m.Msg == WM_DBLCLICK) || (m.Msg == WM_LBUTTONDBLCLK))
        {
        }
        else
        {
            base.WndProc(ref m);
        }
    }
    protected override void OnTextChanged(System.EventArgs args)
    {
        //KeyEventArgs kpe = (KeyEventArgs) args;
        //this.Font = new Font(this.Font.FontFamily, 0);
        using (Graphics g = this.CreateGraphics())
        {
            g.FillRectangle(Brushes.White, ClientRectangle);
            StringFormat stringFormat = new StringFormat();
            stringFormat.Alignment = StringAlignment.Center;
            stringFormat.LineAlignment = StringAlignment.Center;
            g.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle, stringFormat);

        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        this.HideCaret();
        e.Graphics.FillRectangle(Brushes.White, ClientRectangle);
        // This never runs no matter what I try!
        //base.OnPaint(e);
        // Create a StringFormat object with the each line of text, and the block 
        // of text centered on the page.
        StringFormat stringFormat = new StringFormat();
        stringFormat.Alignment = StringAlignment.Center;
        stringFormat.LineAlignment = StringAlignment.Center;

        e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle, stringFormat);
    }
}
于 2012-12-21T23:44:29.643 に答える