注意用户体验细节--把窗体控件输入由全角转换为半角

有一次,一个用户埋怨,说我输入的电子邮件内容是正常的,为什么不允许输入,保存不成功,老是提示格式有问题。

又有一次,另外一个用户埋怨,为输入的数字式正确的,可以跳出数字输入控件后,内容有变为0了,怎么回事呢?

诸如此类的问题,你可能自己也会碰到,究其原因,就是在桌面程序中,当你在文本框或者数字输入框中输入内容的时候,输入法莫名奇妙的由半角变为全角,你没有发现,继续填写或者保存,就会出现问题。

如果我们不注意这些细节,用户输入的内容部经过验证,他们在数据查询检索的时候,就会找不到内容,或者出现莫名其妙的错误,这是我们不愿意看到的。

其实解决这个问题,做好这个细节问题的处理预防,是很简单的事情,下面我来介绍一个辅助类,调用一下他的函数就可以了,如下所示。

     /// <summary>

    /// 输入法帮助,全角 转换为半角
    /// </summary>
    public class ImeHelper
    {
        #region 声明一些API函数
        [DllImport("imm32.dll")]
        public static extern IntPtr ImmGetContext(IntPtr hwnd);
        [DllImport("imm32.dll")]
        public static extern bool ImmGetOpenStatus(IntPtr himc);
        [DllImport("imm32.dll")]
        public static extern bool ImmSetOpenStatus(IntPtr himc, bool b);
        [DllImport("imm32.dll")]
        public static extern bool ImmGetConversionStatus(IntPtr himc, ref int lpdw, ref int lpdw2);
        [DllImport("imm32.dll")]
        public static extern int ImmSimulateHotKey(IntPtr hwnd, int lngHotkey);
        public const int IME_CMODE_FULLSHAPE = 0x8;
        public const int IME_CHOTKEY_SHAPE_TOGGLE = 0x11; 
        #endregion

        /// <summary>
        /// 重载SetIme,传入Form
        /// </summary>
        /// <param name="frm"></param>
        public static void SetIme(Form frm)
        {
            frm.Paint += new PaintEventHandler(frm_Paint);
            ChangeAllControl(frm);
        }

        /// <summary>
        /// 重载SetIme,传入Control
        /// </summary>
        /// <param name="ctl"></param>
        public static void SetIme(Control ctl)
        {
            ChangeAllControl(ctl);
        }

        /// <summary>
        /// 重载SetIme,传入对象句柄
        /// </summary>
        /// <param name="Handel"></param>
        public static void SetIme(IntPtr Handel)
        {
            ChangeControlIme(Handel);
        }

        private static void ChangeAllControl(Control ctl)
        {
            //在控件的的Enter事件中触发来调整输入法状态
            ctl.Enter += new EventHandler(ctl_Enter);

            //遍历子控件,使每个控件都用上Enter的委托处理
            foreach (Control ctlChild in ctl.Controls)
            {
                ChangeAllControl(ctlChild); 
            }
        }

        static void frm_Paint(object sender, PaintEventArgs e)
        {
            /**/
            /*有人问为什么使用Pain事件,而不用Load事件或Activated事件,是基于下列考虑:
         * 、在您的Form中,有些控件可能是运行时动态添加的
         * 、在您的Form中,使用到了非.NET的OCX控件
         * 、Form调用子Form的时候,Activated事件根本不会触发 */
            ChangeControlIme(sender);
        }

        /// <summary>
        /// 控件的Enter处理程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static void ctl_Enter(object sender, EventArgs e)
        {
            ChangeControlIme(sender);
        }

        private static void ChangeControlIme(object sender)
        {
            Control ctl = (Control)sender;
            ChangeControlIme(ctl.Handle);
        }

        /// <summary>
        /// 下面这个函数才是真正检查输入法的全角半角状态
        /// </summary>
        /// <param name="h"></param>
        private static void ChangeControlIme(IntPtr h)
        {
            IntPtr HIme = ImmGetContext(h);
            if (ImmGetOpenStatus(HIme))  //如果输入法处于打开状态
            {
                int iMode = 0;
                int iSentence = 0;
                bool bSuccess = ImmGetConversionStatus(HIme, ref iMode, ref iSentence);  //检索输入法信息
                if (bSuccess)
                {
                    if ((iMode & IME_CMODE_FULLSHAPE) > 0)   //如果是全角
                    {
                        ImmSimulateHotKey(h, IME_CHOTKEY_SHAPE_TOGGLE);  //转换成半角
                    }
                }
            }
        }

    }

 本文转自博客园伍华聪的博客,原文链接:注意用户体验细节--把窗体控件输入由全角转换为半角,如需转载请自行联系原博主。

时间: 2024-09-20 00:03:39

注意用户体验细节--把窗体控件输入由全角转换为半角的相关文章

Delphi实现窗体控件自由摆布

在做Mis项目过程中,有时需要让用户自己来实现窗体控件的布局,比如酒店管理中就需要对餐厅餐桌位置进行布局.要实现这种功能,必须做好三件事: 1.设置进入控件边缘的光标形状: 2.改变控件的大小及位置: 3.保存窗体控件的位置及状态,窗体下次启动时重新设置它们的这些信息.具体步骤如下: 1.修改控件光标.只需要在进入控件的时候,将screen的cursor属性设置成对应形状即可,控件都有一个OnMouseMove事件,在这个事件中调用它就可以实现.我已经将它封装成函数如下: procedure C

从在 Internet Explorer 中使用 Windows 窗体控件开始谈Smart Client

client|window|控件 首先引用Microsoft Windows 窗体快速入门教程上的文章"在 Internet Explorer 中使用 Windows 窗体控件":(如果引用的一些信息无法正常显示,请直接上面上的链接查看) 本主题描述如何在 Internet Explorer (IE) 内成功地执行 Windows 窗体控件.IE 内的 Windows 窗体控件无需用户提示即可激活,它不要求注册,而且利用公共语言运行库 (CLR) 代码访问安全性. 在 Internet

在IE浏览器中使用Windows窗体控件(一)

window|控件|浏览器 在IE浏览器中使用Windows窗体控件(一) 作者::Thiru Thangarathinam 翻译:秋枫 引言 在过去,Web程序员经常在他们的Web程序中使用ActiveX控件来实现一些胖客户端才具有的功能.不过现在开发者可以很容易的通过Microsoft.NET Framework来简洁和安全的建立对象,并且方便的在IE浏览器中切入使用.通过在IE浏览器中创建Windows窗体控件,开发者可以实现丰富的web客户端.在这篇文章中,我们将会知道怎样创建Windo

在IE浏览器中使用Windows窗体控件(二)

window|控件|浏览器 在IE浏览器中使用Windows窗体控件(二) 作者::Thiru Thangarathinam 翻译:秋枫 通过windows窗体控件访问Web Service 窗体控件一个重要优点就是你可以通过它在客户端实现丰富的用户信息.比如说,你可以通过窗体控件对Web服务的访问从而在IE中显示而不需要重新刷新该页面.为了演示这点,我们先来创建一个Web服务,接着再来演示怎样通过窗体控件调用Web服务. 创建Web service 我们创建一个 Visual C# Asp.n

在IE浏览器中使用Windows窗体控件(三)

window|控件|浏览器 在IE浏览器中使用Windows窗体控件(三) 作者::Thiru Thangarathinam 翻译:秋枫 调试Windows窗体控件 要调试窗体控件,你需要按照下面步骤进行. 1.打开浏览器并请求包含窗体控件的那个Html页面. 2.打开visual Studio.Net同时选择工具->调试进程就会显示下面的对话框. 在这个进程对话框中,选择IEXPLORE.EXE 点击附加按钮.当你点击附加按钮时会跳出一个对话框提示你选择要调试的程序类型.我们选择了Common

使用反射将业务对象绑定到 ASP.NET 窗体控件

asp.net|对象|控件 John DyerDallas Theological Seminary 适用于:Microsoft Visual Studio 2005 及早期版本ASP.NET 1.1C# 编程语言Visual Basic 编程语言 摘要:使用反射以单行代码将业务对象绑定到 ASP.NET Web 窗体,从而降低复杂性并减少错误.(本文包含一些指向英文站点的链接.请注意,在示例文件中,程序员的注释使用的是英文,本文中将其译为中文是为了便于读者理解.) 下载 MSDFormBind

wpf 窗体控件里面如何嵌套一个wpf的窗体

问题描述 wpf 窗体控件里面如何嵌套一个wpf的窗体 wpf 窗体控件里面如何嵌套一个wpf的窗体------------------------------------------------------------ 解决方案 WPF 窗体 中只能存在一个Window节点,这样在解析的时候才能成功解析. 嵌套 的话 你可以做出用户控件来引用. 解决方案二: 嵌套

c#窗体控件-动态加载窗体控件问题

问题描述 动态加载窗体控件问题 ????????????????ctl_user?w_user?=?new?ctl_user(); ????????????????panelMain.Controls.Add(w_user); ctl_user?可以用变量代替吗?? 目的是ctl_user变量随数据表中的字段值变化而变化,功能是动态菜单,点菜单时加载动态窗体控件,ctl_user是个窗体用户控件,要怎么才能动态呢 有高手帮忙解答下或给点思路提示下吗? 解决方案 Control c = typeo

在WPF工程中如何调用Windows窗体控件项目中控件属性、方法以及事件????

问题描述 运行环境:VS2008使用的工程:WPF应用程序以及Windows窗体控件库使用过程:新建一个Windows窗体控件库项目,这里名字叫MyControl新建一个Form窗体用来承载用户控件,这个Form窗体叫UerControl1,对应的文件名字为:UerControl1.vb在项目中添加对用户控件的必要的引用在项目中添加一个我下载的用户控件,这里名字叫A新建一个WPF工程,这里名字叫WPFProjWindow1.xaml文件的代码如下:<Windowx:Class="Windo