关于输入汉字文字的问题 最近做到的项目需要用到在贴图区域中输入文字的内容...以前一直都是用textbox之类的控件输入文字现在要在rectangle中输入文字,请问要怎么操作才可以激活输入法?如果只是英文输入的话也就只需要纪录下键盘就得了,可是汉字输入的话...没思路求思路!如何实现在点击一个rectangle后可以输入文字数据的功能! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在界面上放一个隐藏的TextBox,需要输入文字的时候,将它移动到rectangle区域里面,显示出来,让用户输入。当失去焦点的时候隐藏它,并且将文本提交,并且绘制出来。 rectangle中不能直接输入,只能在输入的时候先调出一个文本框,输入完再绘制到rectangle中去.其实,功能要求的是把输入的文字在rectangle中表现出来,这样考虑的话可能就好解决些了 http://www.google.com.hk/#hl=zh-CN&newwindow=1&safe=strict&site=&source=hp&q=InputLanguage.CurrentInputLanguage&oq=InputLanguage.CurrentInputLanguage&aq=f&aqi=&aql=&gs_l=hp.3...1279.1279.0.1891.1.1.0.0.0.0.0.0..0.0...0.0..0.Fz1bzqnE3hs&bav=on.2,or.r_gc.r_pw.,cf.osb&fp=59bea485ebcdbfb4&biw=1440&bih=844 可是我在写游戏...整个窗口都只是directx绘出来的贴图而已...就算是listbox我都是自己写的控件贴图,利用mouseup和mousedown判定rectangle的位置和大小和数据操作的所以用到隐形的Textbox这方法不可行 这个我前年弄过,现在大记不清了,大概就是以下的一些API和处理,你可以搜索一下这些API,可能能找到完整示例。 //光标API [DllImport("user32.dll")] static extern bool CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight); [DllImport("user32.dll")] static extern bool ShowCaret(IntPtr hWnd); [DllImport("User32.dll")] static extern bool HideCaret(IntPtr hWnd); [DllImport("User32.dll")] static extern bool SetCaretPos(int x, int y); [DllImport("user32.dll")] static extern bool DestroyCaret(); //输入法相关API public const int WM_IME_SETCONTEXT = 0x0281; private const int WM_IME_CHAR = 0x0286; private const int WM_CHAR = 0x0102; private const int WM_IME_COMPOSITION = 0x010F; private const int GCS_COMPSTR = 0x0008; [DllImport("Imm32.dll")] public static extern IntPtr ImmGetContext(IntPtr hWnd); [DllImport("Imm32.dll")] public static extern IntPtr ImmAssociateContext(IntPtr hWnd, IntPtr hIMC); [DllImport("imm32.dll")] static extern int ImmGetCompositionString(IntPtr hIMC, int dwIndex, StringBuilder lPBuf, int dwBufLen); private int GCS_RESULTSTR = 0x0800; private const int HC_ACTION = 0; private const int PM_REMOVE = 0x0001; //大概处理过程 protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == WM_IME_SETCONTEXT && m.WParam == (IntPtr)1) { ImmAssociateContext(this.Handle, m_hImc); } switch (m.Msg) { case WM_CHAR: char a = (char)m.WParam; //英文 //............... break; case WM_IME_CHAR: if (m.WParam.ToInt32() == PM_REMOVE) { int size = ImmGetCompositionString(m_hImc, GCS_COMPSTR, null, 0); size += 2; ImmGetCompositionString(m_hImc, GCS_RESULTSTR, str, size); //.............. } break; } } m_hImc = ImmGetContext(this.Handle);应该是与窗口关联的输入法上下文。时间长了有点记不清了,当时我也是查找了一个网上的例子。 是这个链接http://webservices.ctocio.com.cn/net/92/9142592.shtml http://www.cnblogs.com/cappuccino/archive/2012/07/17/2595624.html这个的代码才是完整的可是光标的API要怎么弄? 光标的API就是前面我贴的那几个Caret相关的,这个做起来实在繁琐,得考虑左右键、退格键、鼠标点击位置,然后根据字符宽度计算插入字符的位置。你下载的directx sdk里面Samples\C++\Direct3D\CustomUI这个路径下有一个自定义输入界面的示例,是对光标和输入法API的完整示例。 所以还是用TextBox模拟最好。一个很典型的例子,ListView的改名功能,包括资源管理器修改文件名,其实就是TextBox模拟实现的。这是一个很标准的方法。 说的也是,当时弄了个半成品测试的时候发现对于不同的中文输入法表现不同,后来还是改成TextBox了。 除了微软,我还没有看到一个完全自己实现并且完美程度媲美TextBox的输入界面。甚至连Sun或者Borland都做不到。 = =我自己做的listbox也是这样过来的,没啥,只要引出输入法就可以了其他的都是图像工程了,拿手好戏,我用我的方法弄吧,各种rectangle判断位置,光标那些还是用贴图吧,这样我就不需要再使用光标的API了,好吧,就这样结贴,谢谢你啦 在override里加个判断就可以了 if (InPut == false) return; wpf 字幕动画切换 求高手帮看下这个问题。已经好几天了,还是找不到原因。 |zyciis| 如何取各我的命名空间com下面的所有类,谢谢 axWebBrowser做一浏览器,如何时限点连接时在当前页打开啊 关于路书 大家好,想学C# ,能提点建议吗? 哪本书适合初学者 一个简单,我怎么搞不定,关于web service的中文问题 怎么用C#得到一个进程的路径!! 帮帮我!C#学的不好 两个问题请教 static 有疑问 C#label的visible属性由timer触发,visiblechanged事件中循环播放一个声音,为什么声音只播放较短的事件就停止了
其实,功能要求的是把输入的文字在rectangle中表现出来,这样考虑的话可能就好解决些了
可是我在写游戏...整个窗口都只是directx绘出来的贴图而已...
就算是listbox我都是自己写的控件贴图,利用mouseup和mousedown判定rectangle的位置和大小和数据操作的
所以用到隐形的Textbox这方法不可行
[DllImport("user32.dll")]
static extern bool CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight);
[DllImport("user32.dll")]
static extern bool ShowCaret(IntPtr hWnd);
[DllImport("User32.dll")]
static extern bool HideCaret(IntPtr hWnd);
[DllImport("User32.dll")]
static extern bool SetCaretPos(int x, int y);
[DllImport("user32.dll")]
static extern bool DestroyCaret(); //输入法相关API
public const int WM_IME_SETCONTEXT = 0x0281;
private const int WM_IME_CHAR = 0x0286;
private const int WM_CHAR = 0x0102;
private const int WM_IME_COMPOSITION = 0x010F;
private const int GCS_COMPSTR = 0x0008;
[DllImport("Imm32.dll")]
public static extern IntPtr ImmGetContext(IntPtr hWnd);
[DllImport("Imm32.dll")]
public static extern IntPtr ImmAssociateContext(IntPtr hWnd, IntPtr hIMC);
[DllImport("imm32.dll")]
static extern int ImmGetCompositionString(IntPtr hIMC, int dwIndex, StringBuilder lPBuf, int dwBufLen);
private int GCS_RESULTSTR = 0x0800;
private const int HC_ACTION = 0;
private const int PM_REMOVE = 0x0001;
//大概处理过程
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_IME_SETCONTEXT && m.WParam == (IntPtr)1)
{
ImmAssociateContext(this.Handle, m_hImc);
} switch (m.Msg)
{
case WM_CHAR:
char a = (char)m.WParam; //英文
//...............
break;
case WM_IME_CHAR:
if (m.WParam.ToInt32() == PM_REMOVE)
{
int size = ImmGetCompositionString(m_hImc, GCS_COMPSTR, null, 0);
size += 2;
ImmGetCompositionString(m_hImc, GCS_RESULTSTR, str, size);
//..............
}
break;
}
}
应该是与窗口关联的输入法上下文。
时间长了有点记不清了,当时我也是查找了一个网上的例子。
http://www.cnblogs.com/cappuccino/archive/2012/07/17/2595624.html这个的代码才是完整的
可是光标的API要怎么弄?
= =我自己做的listbox也是这样过来的,没啥,只要引出输入法就可以了
其他的都是图像工程了,拿手好戏,我用我的方法弄吧,各种rectangle判断位置,光标那些还是用贴图吧,
这样我就不需要再使用光标的API了,好吧,就这样结贴,谢谢你啦
在override里加个判断就可以了 if (InPut == false)
return;