richtextbox关于中英文使用同一种字体

kmsch 2011-02-27 05:12:19
richtextbox有没有什么属性让中文和英文都是同一种字体。
否则英文总是Arial字体,即使我在代码里把他切换过来,但再打入的英文又变成了Arial字体
我试过在richTextBox1_TextChanged里写入代码,让每次修改都改变一次字体,但感觉这样打字会卡。
所以想问richtextbox有没有什么属性实现统一
...全文
681 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyofmy 2011-12-11
  • 打赏
  • 举报
回复
private void BaseText_KeyUp(object sender, KeyEventArgs e)
{
if((e.KeyValue>=65 &&e.KeyValue<=90) || (e.KeyValue>=97 &&e.KeyValue<=122))
{
try
{
try
{
BaseText.Font = new Font("宋体", 12, GraphicsUnit.Pixel);
}
catch
{
BaseText.Font = new Font("Arial", 12, GraphicsUnit.Pixel);
}
}
catch { }
}
}

用这个吧,,我研究好久想出来的,,效率很不错,,,这个算是微软BUG了
qldsrx 2011-03-03
  • 打赏
  • 举报
回复
qq:33603759
qldsrx 2011-03-02
  • 打赏
  • 举报
回复
找到方法了,原来那个内部方法提供了隐式调用,之前一直没发现,通过对SelectionFont的设置,即调用了那个内部方法了,这样修改字体的效率比全文修改高得多。
操作方法如下(有加分吗?):

int start = 0;
int end = 0;
public testForm()
{
InitializeComponent();
richTextBox1.TextChanged +=new EventHandler(richTextBox1_TextChanged);
richTextBox1.SelectionChanged += new EventHandler(richTextBox1_SelectionChanged);
}

void richTextBox1_SelectionChanged(object sender, EventArgs e)
{
start = end;
end = richTextBox1.SelectionStart;
}

void richTextBox1_TextChanged(object sender, EventArgs e)
{
if (end > start)
{
richTextBox1.Select(start, end - start);
}
richTextBox1.SelectionFont = new Font("宋体", 12);
richTextBox1.Select(start, 0);
}
kmsch 2011-03-02
  • 打赏
  • 举报
回复
如果你有心情的话加我q下,我发文件你帮我试一下。
kmsch 2011-03-02
  • 打赏
  • 举报
回复
我做了一个记事本,在字体选项里比如选择了宋体(我字体是让全文都使用同一种字体),所有字都变了,可你之后打进去的英文还是变成了那种格式的
qldsrx 2011-03-02
  • 打赏
  • 举报
回复
啥不行,速度吗?我这里试下来一点延迟也没有的。
kmsch 2011-03-02
  • 打赏
  • 举报
回复
不管了,还是不行啊
kmsch 2011-03-01
  • 打赏
  • 举报
回复
回11楼,那怎么调用?
weakey 2011-02-27
  • 打赏
  • 举报
回复
到Form1.Designer.cs里面修改
private void InitializeComponent()
{
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.richTextBox2 = new System.Windows.Forms.RichTextBox();
this.SuspendLayout();
//
// richTextBox1
this.richTextBox1.Font = new Font("隶书", 13, System.Drawing.FontStyle.Regular)
}
qldsrx 2011-02-27
  • 打赏
  • 举报
回复
RichTextBox内部提供了一个方法用来修改单个字符的字体,但是并未公开,如果要使用这个方法,只能利用消息机制,利用API的SendMessage发送消息,这比起你修改全文速度要快。
反编译后研究得到的相关函数如下:

[StructLayout(LayoutKind.Sequential), ComVisible(true)]
public struct HandleRef
{
internal object m_wrapper;
internal IntPtr m_handle;
public HandleRef(object wrapper, IntPtr handle)
{
this.m_wrapper = wrapper;
this.m_handle = handle;
}

public object Wrapper
{
get
{
return this.m_wrapper;
}
}
public IntPtr Handle
{
get
{
return this.m_handle;
}
}
public static explicit operator IntPtr(HandleRef value)
{
return value.m_handle;
}

public static IntPtr ToIntPtr(HandleRef value)
{
return value.m_handle;
}
}

[StructLayout(LayoutKind.Sequential, Pack=4)]
public class CHARFORMATA
{
public int cbSize = Marshal.SizeOf(typeof(CHARFORMATA));
public int dwMask;
public int dwEffects;
public int yHeight;
public int yOffset;
public int crTextColor;
public byte bCharSet;
public byte bPitchAndFamily;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=0x20)]
public byte[] szFaceName = new byte[0x20];
}

[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, [In, Out, MarshalAs(UnmanagedType.LPStruct)] CHARFORMATA lParam);

不行了,再看下去头晕了,有关CHARFORMATA类的赋值操作,你要是有兴趣的话,自己反编译了研究吧。
qldsrx 2011-02-27
  • 打赏
  • 举报
回复
我试了下,貌似是因为字体找不到,所以它找了个默认字体。
因为如果你选择了宋体,但是宋体不包含英文字体,因此英文字体就去默认的字体(Arial)里去找了。你要是选择了Arial,但是Arial里面不包含中文,因此中文就到默认的字体(宋体)里去找了。所以你会发现,输入的字体里面是含有两种字体的。
北京的雾霾天 2011-02-27
  • 打赏
  • 举报
回复
这是个Bug
kmsch 2011-02-27
  • 打赏
  • 举报
回复
回7楼,你自己试下啊,你messagebox你选中的文本啊,它英文的就是会自动变成Arial字体
qldsrx 2011-02-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kmsch 的回复:]
我在richTextBox1_TextChanged中写过
this.richTextBox1.Font = new Font(fontname, fontsize, fs);
这样成功了,但是输入文字的时候很卡,特别文本长一点的话感觉很明显
[/Quote]
我的意思是,设置那个属性为啥要放在事件中,难道每次设置之后又会自动变掉,为啥会变掉研究下,没理由你不去修改它就自动变掉啊(除非是复制进去的文本,带了外面的格式)。
kmsch 2011-02-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yalan 的回复:]
用正则表达式处理吧
[/Quote]
求给个示范
kmsch 2011-02-27
  • 打赏
  • 举报
回复
我在richTextBox1_TextChanged中写过
this.richTextBox1.Font = new Font(fontname, fontsize, fs);
这样成功了,但是输入文字的时候很卡,特别文本长一点的话感觉很明显
kmsch 2011-02-27
  • 打赏
  • 举报
回复
回一楼,求示范一下,比如怎么把中英文都改为宋体
qldsrx 2011-02-27
  • 打赏
  • 举报
回复
不是有个Font属性吗?我修改它之后,字体大小,粗体啥的都有效。
wuyq11 2011-02-27
  • 打赏
  • 举报
回复
RichTextBox就是这样子,可以把字母转成宋体
yalan 2011-02-27
  • 打赏
  • 举报
回复
用正则表达式处理吧

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧