C#编写的程序半角与全角问题解决
上一篇 /
下一篇 2007-10-27 11:11:28
/ 个人分类:编程
属性窗口进入Text,Caption之类的属性,输入法老变成全角
如果有数据类型有限制的话,就会提示报错。
如何解决这个问题呢?
这是一个微软的一个大BUG,目前无好的解决办法,我通过如下办法处理:
1、新建一个类:ImeForm,该类继承于Form,
2、在Load事件中,通过递归循环,查找所有的文本框,处理文本框的Enter事件,自动将输入法转换为半角,当然,如果其他输入控件也有类似问题,无非是在递归循环中多一个判断分支而已.
3、将程序中用到的Form的基类由System.Windows.Forms.Form改为ImeForm,如果以后微软解决了这个问题,改回去就可以了,ImeForm的全部代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace Lqjt
{
/// <summary>
/// 解决输入法全角的问题
/// </summary>
public class ImeForm : System.Windows.Forms.Form
{
/// <summary>
/// 做一个标记,避免重复设置Enter事件
/// </summary>
private bool m_AttachProcessed = false;
/// <summary>
/// 在Load事件中遍历控件,如果是文本框,自动切换到半角状态
/// </summary>
/// <param name="e"></param>
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (!m_AttachProcessed)
{
SetImeToHangul(this.Controls);
m_AttachProcessed = true;
}
}
/// <summary>
/// 通过递归,遍历当前窗口的全部控件
/// </summary>
/// <param name="p_Controls">容器</param>
private void SetImeToHangul(System.Windows.Forms.Control.ControlCollection p_Controls)
{
foreach (System.Windows.Forms.Control ctl in p_Controls)
{
FlowLayoutPanel flpan = ctl as FlowLayoutPanel;
if (flpan != null)
{
SetImeToHangul(flpan.Controls);
continue;
}
GroupBox grp = ctl as GroupBox;
if (grp != null)
{
SetImeToHangul(grp.Controls);
continue;
}
Panel pan= ctl as Panel;
if (pan != null)
{
SetImeToHangul(pan.Controls);
continue;
}
TabControl tabcontrol = ctl as TabControl;
if (tabcontrol != null)
{
SetImeToHangul(tabcontrol.Controls);
continue;
}
TabPage tabpage = ctl as TabPage;
if (tabpage != null)
{
SetImeToHangul(tabpage.Controls);
continue;
}
TableLayoutPanel tlpan = ctl as TableLayoutPanel;
if(tlpan!=null)
{
SetImeToHangul(tlpan.Controls);
continue;
}
//文本框进入时,自动切换到半角,如果要控制其他可输入控件,参照下面的代码完成
TextBox txtbox = ctl as TextBox;
if (txtbox != null)
{
txtbox.Enter += new EventHandler(ControlEnter_Enter);
}
}
}
private void ControlEnter_Enter(object sender, EventArgs e)
{
Control ctl = sender as Control;
if (ctl == null)
return;
if (ctl.ImeMode != ImeMode.Hangul)
ctl.ImeMode = ImeMode.Hangul;
}
}//class
}
摘自:http://topic.csdn.net/t/20060619/13/4829793.html#
微软发布了补丁,如果想用,给我发送邮件,fsyj000&163.com (请将&换成@,拒绝垃圾邮件)
收藏
举报
TAG:
编程