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: 编程

 

评分:0

我来说两句

Open Toolbar