如何在打字过程中使文本框旋转 90(垂直)?

Posted

技术标签:

【中文标题】如何在打字过程中使文本框旋转 90(垂直)?【英文标题】:How to make textbox rotated 90 (vertical) during typing? 【发布时间】:2021-11-01 17:30:44 【问题描述】:

我需要制作一个像 excel 这样的垂直文本框。打字光标显示为垂直,如果我输入一些文本,文本将从上到下延伸。并且文本旋转了 90 度。(不溢出线)

如何在WinForm中创建垂直文本框?

【问题讨论】:

不可能。虽然您可以在键入时自行绘制文本,但用户将无法执行常规编辑操作,例如使用鼠标进行选择和视觉反馈。最好在属性编辑器中使用 TextBox 输入字段来伪造它。 【参考方案1】:

你的问题让我很好奇!所以我试图实现一些东西。事实证明,在winforms 中做起来有点复杂……

这是我的镜头,你需要改进它,但它有效(ish)。想法是画一个白色背景来隐藏TextBox绘制的文字,然后垂直绘制。

结果:

请注意,您可以使用另一种绘制文本的方法来改进结果 - this code for example。

代码:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

public class VerticalTextBox : TextBox

    private bool bFlip = true;

    public VerticalTextBox() 
    
        Multiline = true;
        SetStyle(ControlStyles.UserPaint, true);
        TextChanged += OnTextChanged;
    

    private void OnTextChanged(object sender, EventArgs eventArgs) 
    
        Invalidate(); // repaint all
    

    protected override void OnPaintBackground(PaintEventArgs e)
    
        var g = e.Graphics;
        g.FillRectangle(new SolidBrush(BackColor), ClientRectangle);

        var stringFormat = new StringFormat 
            Alignment = StringAlignment.Center,
            Trimming = StringTrimming.None,
            FormatFlags = StringFormatFlags.DirectionVertical
        ;

        Brush textBrush = new SolidBrush(ForeColor);

        var storedState = g.Transform;

        if (bFlip)
        
            g.RotateTransform(180f);
            g.TranslateTransform(-ClientRectangle.Width,-ClientRectangle.Height);  
        
        g.DrawString(
            Text,
            Font,
            textBrush,
            ClientRectangle,
            stringFormat);

        g.Transform = storedState;
    



    [Description("When this parameter is true the VLabel flips at 180 degrees."),Category("Appearance")]
    public bool Flip180
    
        get => bFlip;
        set
        
            bFlip = value;
            Invalidate();
        
    


参考文献

    VerticalLabel

    SetStyle 告诉 TextBox 调用 Paint 事件。

更好的(?)替代品

    为了获得更好的结果,在winforms中,我建议你了解FastColoredTextBox并使用它。

    迁移到 WPF,apparently is easy。

【讨论】:

以上是关于如何在打字过程中使文本框旋转 90(垂直)?的主要内容,如果未能解决你的问题,请参考以下文章

Python:在文本文件中将数据从垂直旋转到水平

Word文本框里面的文字如何让它垂直居中?

Visio中旋转文本框与箭头平行

如何让Word文本框中的文字垂直上下居中

在文本框中使单词加粗

如何让word文本框中的文字垂直上下居中