(转)自定义一个控件继承基类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
posted on 2010-07-19 14:20 gds通用软件开发系统 阅读(701) 评论(1) 编辑 收藏 举报