• (转)自定义一个控件继承基类usercontrol,但是不能输入中文


    就为第个问题我花了很多的时间.搜索了许多的网站.都没有找到解决办法.
    被逼无耐只好自已看源代码。还参考了MONO的源码。发现它们之间差别非常大。而且在VS里看看源码很困难

    ,没有类查找功能。只能一个类文件一个类文件的打开看,想看看这个方法里边用的其它类只能一步步的跟

    。还是因为我没找到好的方法呢?最终我放弃了这个方法。我用了反编译软件Reflector.exe。这个软件查

    找很方便。只要点击就能找到你想看到的东西.我先找到了UserControl类,我随便看了一个,发现覆写了

    WndProc
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 7)
        {
            this.WmSetFocus(ref m);
        }
        else
        {
            base.WndProc(ref m);
        }
    }
    这里好像没什么重要的,我先点了this.WmSetFocus。然后点base.WndProc(ref m)。一下就跳到了基类

    ContainerControl的
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 7)
        {
            this.WmSetFocus(ref m);
        }
        else
        {
            base.WndProc(ref m);
        }
    }
    我再次点this.WmSetFocus,到达这个函数
    private void WmSetFocus(ref Message m)
    {

    if (!base.HostedInWin32DialogManager)
        {
            if (this.ActiveControl != null)
            {
                base.WmImeSetFocus();
                if (!this.ActiveControl.Visible)
                {
                    this.OnGotFocus(EventArgs.Empty);
                }
                this.FocusActiveControlInternal();
            }......

    }
    这时看到了base.WmImeSetFocus(),我欣喜若狂.秘密一定在这里面.点击后到达了

    Control.WmImeSetFocus().

    internal void WmImeSetFocus()
    {
        if (ImeModeConversion.InputLanguageTable != ImeModeConversion.UnsupportedTable)
        {
            this.UpdateImeContextMode();
        }
    }
    接着再往下,
    internal void UpdateImeContextMode()
    {
        ImeMode[] inputLanguageTable = ImeModeConversion.InputLanguageTable;
        if ((!base.DesignMode && (inputLanguageTable != ImeModeConversion.UnsupportedTable)) &&

    this.Focused)
        {
            ImeMode disable = ImeMode.Disable;
            ImeMode cachedImeMode = this.CachedImeMode;
            if (this.ImeSupported && this.CanEnableIme)
            {
                disable = (cachedImeMode == ImeMode.NoControl) ? PropagatingImeMode :

    cachedImeMode;
            }
            if ((this.CurrentImeContextMode != disable) && (disable != ImeMode.Inherit))
            {
                this.DisableImeModeChangedCount++;
                ImeMode propagatingImeMode = PropagatingImeMode;
                try
                {
                    ImeContext.SetImeStatus(disable, this.Handle);
                }
                finally
                {
                    this.DisableImeModeChangedCount--;
                    if ((disable == ImeMode.Disable) && (inputLanguageTable ==

    ImeModeConversion.ChineseTable))
                    {
                        PropagatingImeMode = propagatingImeMode;
                    }
                }
                if (cachedImeMode == ImeMode.NoControl)
                {
                    if (this.CanEnableIme)
                    {
                        PropagatingImeMode = this.CurrentImeContextMode;
                    }
                }
                else
                {
                    if (this.CanEnableIme)
                    {
                        this.CachedImeMode = this.CurrentImeContextMode;
                    }
                    this.VerifyImeModeChanged(disable, this.CachedImeMode);
                }
            }
        }
    }

    所有的秘密都再这里边了.得这些代码让我看傻眼。 我要怎么弄呢?MS的代码我不能改呀。要我重写一个类

    似的类吗?天啊?里边用了那么多类,msdn里根本就找不到说明,对于我来说这太难了。这时就想放弃吧!
    在这里折腾了好一会,反代码反复看了看。发现就两个属性决定了程序逻辑。this.CanEnableIme  和

    this.ImeSupported。点开ImeSupported好像没什么。
    private bool ImeSupported
    {
        get
        {
            return (this.DefaultImeMode != ImeMode.Disable);
        }
    }
    再点CanEnableIme。惊喜!............
    protected virtual bool CanEnableIme
    {
        get
        {
            return this.ImeSupported;
        }
    }
    既然是virtual,那个覆写试试。 在我自定义的类里加上了下面的代码

    protected override bool  CanEnableIme
    {
    get
    {
      return true;
    }
    }
    就这么简单。有效吗?我不知道。运行了现说吧!F5!程序起来了,赶紧打开输入法试试,看看能不能输中

    文。啊!世界太美了!我终于成功了。

    http://social.microsoft.com/Forums/fi-FI/2212/thread/0697083f-030f-486e-ba62-1029336dc811

  • 相关阅读:
    nginx+tomcat负载均衡
    一个tomcat部署多个应用实例
    多级菜单存在同一张表,一次性把所有关系取出来
    关于ajax post请求,参数过大产生的问题解决 Java
    nginx 的 proxy_cache 缓存配置
    nginx 安装 lua_nginx_module 模块(nginx——lua 学习笔记1)
    nginx 反向代理
    nginx的共享字典项api(操作方法)
    sed 常用命令 网址
    Django之 数据库ORM
  • 原文地址:https://www.cnblogs.com/cwfsoft/p/1780655.html
Copyright © 2020-2023  润新知