在高DPI设置下调整RichTextBox字体大小

23

我的C#应用程序包括具有简单文本框和富文本框的网格。通常,富文本框包含从其他地方复制并粘贴的富文本,并且rtf标记中通常包含硬编码字体大小(\fsXX,其中XX为半点)。在大多数情况下,富文本的字体大小与简单文本的字体大小相同或接近。

当DPI缩放设置为除默认96之外的任何值时,富文本会出现以下失真:

a) 当应用程序未设置为DPI感知时,富文本显示比简单文本小且模糊。

b) 当应用程序设置为DPI感知时,富文本比简单文本更大。

是否有一种方法可以允许或强制富文本与简单文本一起缩放,而无需直接编辑标记?


你试过 RichTextBox v5 吗? - Jerry
你能添加一些截图吗?这样可能会更容易帮助你... - Steve Sheldon
简单文本框的字体是如何定义的?它们是以点大小还是像素为单位的? - Steve Sheldon
还有一件事,Windows高dpi的世界比你目前看到的要稍微复杂一些。除了让应用程序在96 dpi下工作外,您还需要在96和149之间以及>150的dpi下进行测试。当dpi设置为false时,导致拉伸的dpi感知标志直到dpi至少为150才开始工作。 - Steve Sheldon
6个回答

1

有一件事可能可以解决这个问题,那就是将 RichTextBox 放在一个窗体上,并将窗体的 AutoScaleMode 属性设置为 NoneAutoScaleMode 枚举文档)。


0
尝试将其属性WordWrap设置为true

0
当然!这是一个在C#中向网格添加简单文本框的示例:
DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
column.HeaderText = "My Text Column";
column.Name = "MyTextColumn";
dataGridView1.Columns.Add(column);

这是一个在C#中向网格添加富文本框的示例:
DataGridViewRichTextBoxColumn column = new DataGridViewRichTextBoxColumn();
column.HeaderText = "My Richtext Column";
column.Name = "MyRichtextColumn";
dataGridView1.Columns.Add(column);

请注意,对于富文本框,您需要使用一个自定义的列类型来创建。以下是一个示例实现:
public class DataGridViewRichTextBoxColumn : DataGridViewColumn
{
    public DataGridViewRichTextBoxColumn() : base(new DataGridViewRichTextBoxCell())
    {

    }
}

public class DataGridViewRichTextBoxCell : DataGridViewCell
{
    public override Type ValueType
    {
        get { return typeof(string); }
    }

    public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    {
        base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
        var ctl = DataGridView.EditingControl as DataGridViewRichTextBoxEditingControl;
        if (Value == null)
            ctl.InitialText = string.Empty;
        else
            ctl.InitialText = Value.ToString();
    }

    public override Type EditType
    {
        get { return typeof(DataGridViewRichTextBoxEditingControl); }
    }

    public override object DefaultNewRowValue
    {
        get { return string.Empty; }
    }
}

public class DataGridViewRichTextBoxEditingControl : RichTextBox, IDataGridViewEditingControl
{
    private DataGridView dataGridView;
    private bool valueChanged = false;
    private int rowIndex;

    public DataGridViewRichTextBoxEditingControl()
    {
        this.BorderStyle = System.Windows.Forms.BorderStyle.None;
    }

    public object EditingControlFormattedValue
    {
        get { return this.Rtf; }
        set { this.Rtf = value as string; }
    }

    public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
    {
        return this.EditingControlFormattedValue;
    }

    public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
    {
        this.Font = dataGridViewCellStyle.Font;
        this.ForeColor = dataGridViewCellStyle.ForeColor;
        this.BackColor = dataGridViewCellStyle.BackColor;
        this.BorderStyle = dataGridViewCellStyle.BorderStyle == DataGridViewCellBorderStyle.None ? BorderStyle.None : BorderStyle.Fixed3D;
    }

    public int EditingControlRowIndex
    {
        get { return rowIndex; }
        set { rowIndex = value; }
    }

    public bool EditingControlWantsInputKey(Keys key, bool dataGridViewWantsInputKey)
    {
        switch (key & Keys.KeyCode)
        {
            case Keys.Left:
            case Keys.Up:
            case Keys.Down:
            case Keys.Right:
            case Keys.Home:
            case Keys.End:
            case Keys.PageDown:
            case Keys.PageUp:
                return true;

            default:
                return !dataGridViewWantsInputKey;
        }
    }

    public void PrepareEditingControlForEdit(bool selectAll)
    {
        
    }

    public bool RepositionEditingControlOnValueChange
    {
        get { return false; }
    }

    public DataGridView EditingControlDataGridView
    {
        get { return dataGridView; }
        set { dataGridView = value; }
    }

    public bool EditingControlValueChanged
    {
        get { return valueChanged; }
        set { valueChanged = value; }
    }

    public Cursor EditingPanelCursor
    {
        get { return base.Cursor; }
    }

    protected override void OnTextChanged(System.EventArgs e)
    {
        base.OnTextChanged(e);
        valueChanged = true;
        this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
    }
}

希望这能帮到你!如果有任何问题,请告诉我。

-1
<script type="text/javascript">
tinyMCE.init({
        mode: "textareas",
        theme: "advanced",
        plugins: "safari,spellchecker,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,imagemanager,filemanager",
        theme_advanced_buttons1: "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect,fontselect,fontsizeselect",
        theme_advanced_buttons2: "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,code,|,insertdate,inserttime,preview,|,forecolor,backcolor",
        theme_advanced_buttons3: "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen",
        theme_advanced_buttons4: "insertlayer,moveforward,movebackward,absolute,|,styleprops,spellchecker,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,blockquote,pagebreak,|,insertfile,insertimage",
        theme_advanced_toolbar_location: "top",
        theme_advanced_toolbar_align: "left",
        theme_advanced_statusbar_location: "bottom",
        theme_advanced_resizing: false,
        template_external_list_url: "js/template_list.js",
        external_link_list_url: "js/link_list.js",
        external_image_list_url: "js/image_list.js",
        media_external_list_url: "js/media_list.js"
    });
</script>


<td class="textboxmain" style="height:300px; "><asp:TextBox id="textbox1" TextMode="MultiLine" Height="100%" runat="server" placeholder="test............"></asp:TextBox></td>

下载 TinyMCE 3 的第三方工具。 - Rahul Choudhary

-1
也许您可以使用 WPF 表单,这样就不必担心不同屏幕的 DPI。

-3
请尝试以下操作,仅支持 .NET Framework 4.5.2 及以上版本。微软已经为 HighDpiAutoresizing 添加了更多控件的支持。
<appSettings>
   <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
</appSettings>

1
此功能在4.5.1版本中引入,但到目前为止还不支持将Richtextbox缩放到4.6.1版本。更多信息请参考https://msdn.microsoft.com/en-us/library/ms171868%28v=vs.110%29.aspx - Souhaieb Besbes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接