最近做到的项目需要用到在贴图区域中输入文字的内容...以前一直都是用textbox之类的控件输入文字现在要在rectangle中输入文字,请问要怎么操作才可以激活输入法?如果只是英文输入的话也就只需要纪录下键盘就得了,可是汉字输入的话...没思路求思路!如何实现在点击一个rectangle后可以输入文字数据的功能!

解决方案 »

  1.   

    在界面上放一个隐藏的TextBox,需要输入文字的时候,将它移动到rectangle区域里面,显示出来,让用户输入。当失去焦点的时候隐藏它,并且将文本提交,并且绘制出来。
      

  2.   

    rectangle中不能直接输入,只能在输入的时候先调出一个文本框,输入完再绘制到rectangle中去.
    其实,功能要求的是把输入的文字在rectangle中表现出来,这样考虑的话可能就好解决些了
      

  3.   

    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
      

  4.   


    可是我在写游戏...整个窗口都只是directx绘出来的贴图而已...
    就算是listbox我都是自己写的控件贴图,利用mouseup和mousedown判定rectangle的位置和大小和数据操作的
    所以用到隐形的Textbox这方法不可行
      

  5.   

    这个我前年弄过,现在大记不清了,大概就是以下的一些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;
                }
            }
      

  6.   

    m_hImc = ImmGetContext(this.Handle);
    应该是与窗口关联的输入法上下文。
    时间长了有点记不清了,当时我也是查找了一个网上的例子。
      

  7.   

    是这个链接http://webservices.ctocio.com.cn/net/92/9142592.shtml
      

  8.   


    http://www.cnblogs.com/cappuccino/archive/2012/07/17/2595624.html这个的代码才是完整的
    可是光标的API要怎么弄?
      

  9.   

    光标的API就是前面我贴的那几个Caret相关的,这个做起来实在繁琐,得考虑左右键、退格键、鼠标点击位置,然后根据字符宽度计算插入字符的位置。你下载的directx sdk里面Samples\C++\Direct3D\CustomUI这个路径下有一个自定义输入界面的示例,是对光标和输入法API的完整示例。
      

  10.   

    所以还是用TextBox模拟最好。一个很典型的例子,ListView的改名功能,包括资源管理器修改文件名,其实就是TextBox模拟实现的。这是一个很标准的方法。
      

  11.   

    说的也是,当时弄了个半成品测试的时候发现对于不同的中文输入法表现不同,后来还是改成TextBox了。
      

  12.   

    除了微软,我还没有看到一个完全自己实现并且完美程度媲美TextBox的输入界面。甚至连Sun或者Borland都做不到。
      

  13.   


    = =我自己做的listbox也是这样过来的,没啥,只要引出输入法就可以了
    其他的都是图像工程了,拿手好戏,我用我的方法弄吧,各种rectangle判断位置,光标那些还是用贴图吧,
    这样我就不需要再使用光标的API了,好吧,就这样结贴,谢谢你啦
      

  14.   


    在override里加个判断就可以了            if (InPut == false)
                    return;