
本文来自于:
博客园的《叩响C#之门》RichTextBox修改字体大小的研究 (本文由李雨来提供)
请尊重与支持原创,谢谢!
今天跟一个朋友探讨了一下关于RichTextBox的一个问题,具体是这样的:在WinForm编程中,有一个用于编辑文本的RichTextBox控件,它有一个SelectionFont属性,我们可以用它来设置选中文本的字体。不过这个属性有一个问题,就是当选择的文本有2个以上字体时,这个属性的值为null,因此我们无法得到原来这段文字的字体对象,也就无法修改这段文本的字体大小的同时又不改变其字体。
比如下面的代码会出现问题:
//字号框(在组合框中输入字号,改变字体大小)
private void sizeToolStripComboBox_TextChanged(object sender, EventArgs e)
{
if (sizeToolStripComboBox.Text != "")
{
float fontSize = Convert.ToSingle(sizeToolStripComboBox.Text);
changeFontSize(fontSize);
}
}
private void changeFontSize(float fontsize)
{
Font oldFont = richTextBox.SelectionFont;
richTextBox.SelectionFont = new Font(oldFont, fontsize);
}
每一个判断条件都会对应一个节点类,如“==”对应的类为asteqnode,判断两个值是否相等的条件为:先取得等号两边的值,如果是数字,比较两个数字的大小是否相等,再判断两边的值是否都是null,都为null则相等,否则其中一个为null,肯定不等。上述代码可以这样理解,在foreach循环外定义了一个新变量 i,值为1,然后开始循环,在循环内部改变这个变量 i 的值为2,并且在循环内部加一个判断,如果这个变量i 值为1,那么就是第一个有效元素输出的时候。注意:当在页面上选中select标签的值或者checkbox的值,假如要在后台拿选择的情况,则必须定义相应的变量,命名必须和页面相应标签的名字相同,当是checkbox时,则action中定义拿值的变量必须是数组。

private void changeFontSize(float fontsize)
{
Font oldFont = richTextBox.SelectionFont;
if (oldFont != null)
richTextBox.SelectionFont = new Font(oldFont, fontsize);
}
对一部分文字进行字体、字号和颜色的设置,首先应选中这部分文字,这和上一节课文字块的移动、复制与删除方法相同。2.同样的,要对文字进行修饰,必须首先要选中需要添加动态效果的文字,然后依次单击菜单栏中的“格式”、“字体”,打开“字体”对话框,单击“文字效果”标签,就可以为选中的文字设置动态效果了。选中文本框内的全部文字,将颜色设置成“红色”,字体设置成“小标宋简体”,字号根据文本框的大小设置成相应字号,但要尽量充满该文本框,这样,宽为155mm、高为20mm、距上25mm的红头制作完成。
private void changeFontSize(float fontsize)
{
int selStart = this.richTextBox.SelectionStart;
int selLen = this.richTextBox.SelectionLength;
int selEnd = selStart + selLen;
for (int i = selStart; i < selEnd; i++)
{
this.richTextBox.Select(i, 1);
Font oldFont = richTextBox.SelectionFont;
if (oldFont != null)
{
richTextBox.SelectionFont = new Font(oldFont.Name, fontsize);
}
}
//在字体之后,我们还应该重新选中最初选中的文字区域,这样才得严谨了。
this.richTextBox.Select(selStart, selLen);
}
使用代码发帖,您可以改变文字的颜色、字体和大小。当文字和矩形大小差不多时,矩形不容易选择,此时可先全选文字和矩形,然后按住shift键的同时再点击文字即可选中矩形。(3)选中所有文字,设置文字字体、字号、颜色等。
设计公司会给你出几个稿子,在你选定某个风格的初稿以后,他们会继续修改知道你满意为止。可以看最近7天的被放大次数,这个数据很好地反应出了产品的无线端图片是否符合屏幕大小,被放大的次数多说明图片在手机端显示的不够清楚,可能是文字大小,图片不清晰,需要放大才能看仔细,可以根据这个数据反馈信息对无线端的图片进行优化,把文字字体和图片放大。所有这些操作都是在保证执行效率的前提下进行的,所以,假如在你使用了这些算法之后程序变得效率底下,首先一定不要怀疑这些算法本身,仔细检查一下程序的其他地方。
private void changeFontSize(float fontsize)
{
int selStart = this.richTextBox.SelectionStart;
int selLen = this.richTextBox.SelectionLength;
int selEnd = selStart + selLen;
if (richTextBox.SelectionFont != null)
{
Font oldFont = richTextBox.SelectionFont;
richTextBox.SelectionFont = new Font(oldFont.Name, fontsize);
}
else
{
for (int i = selStart; i < selEnd; i++)
{
this.richTextBox.Select(i, 1);
Font oldFont = richTextBox.SelectionFont;
if (oldFont != null)
{
richTextBox.SelectionFont = new Font(oldFont.Name, fontsize,);
}
}
}
this.richTextBox.Select(selStart, selLen);
}
在使用xib的过程中你是否碰到过这样的情景:你选中一个label,修改它的字体、颜色、大小,然后使用。这意味着,在不同屏幕上优化文本大小或者优化包含动态内容的文本大小比以往简单多了。将光标移动到”中间页脚文本”,点击”插入页码”,并可以在”字体”一栏调整页码数字的字体和大小以及颜色,选择以后在下方的预览框内便可查看效果,点击”确定”即完成,这就解决了文首场景2的问题。

很好,现在似乎已经接近完美了,不过这还不是最好的。如果选中的文本只有两种字体时,我们的算法效率是O(n)。而其实我们可以通过一些计算只修改两次字体即可。当然这些都是理想情况。不过我们仍然可以优化一下代码使之效率提升到O(LogN)。
那么是怎么一种算法呢?想想看,如果SelectionFont的返回值为null,那么我们就把选择区域分成两个部分,左边一半和右边一半。这样再分别判断左边和右边的SelectionFont是否为null,如果不是,那么修改字体大小,否则在分两半进行判断。没错,这就是二分法。下面我们用递归实现这种算法。
private void changeFontSize(float fontsize)
{
int selStart = this.richTextBox.SelectionStart;
int selLen = this.richTextBox.SelectionLength;
int selEnd = selStart + selLen;
changeHelp(selStart, selEnd, fontsize);
this.richTextBox.Select(selStart, selLen);
}
private void changeHelp(int start, int end, float fontsize)
{
this.richTextBox.Select(start, end - start); ;
if (richTextBox.SelectionFont != null)
{
Font oldFont = richTextBox.SelectionFont;
richTextBox.SelectionFont = new Font(oldFont.Name, fontsize);
}
else
{
int mid = (start + end) / 2;
changeHelp(start, mid, fontsize);
changeHelp(mid, end, fontsize);
}
}
在changeHelp()方法中,我们有两条路可以走:
1.当选择区域的SelectionFont不为null时,修改选中区域的字体大小。
2.当选择区域的SelectionFont为null时,二分选中区域,然后调用changeHelp()方法对左右两部分进行修改。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-108273-1.html
5%
诸葛亮老先生穿着开裆裤就跑出来了