>웹 프론트엔드 >PS 튜토리얼 >C#에서 빈 양식에 중국어 입력을 구현하면 PS와 같은 텍스트 도구를 구현할 수 있습니다.

C#에서 빈 양식에 중국어 입력을 구현하면 PS와 같은 텍스트 도구를 구현할 수 있습니다.

高洛峰
高洛峰원래의
2017-02-15 10:23:441758검색

C#의 빈 양식에 중국어 입력

키워드: PS와 같은 텍스트 도구, 중국어 입력 반복

최근 PS와 같은 텍스트 도구를 만들기 위해 연구하고 많은 정보를 확인하고 많은 사람들에게 물어봤습니다. 마침내 노력이 결실을 맺었습니다. 모두가 토론할 수 있도록 작성하세요.

빈 양식에서 입력 방법을 엽니다. 무슨 일이 있어도 입력 방법을 열 수 없습니다. this.ImeMode= ImeMode.NoControl 을 설정해도 입력 방법 기록 창이 열리지 않습니다. Microsoft 개발 포럼에 가서 질문을 해주신 Zhou Xuefeng 님께 감사드립니다. Riquel_Dong은 API를 사용했습니다. 함수: ImmAssociateContext(IntPtr hWnd, IntPtr hIMC); 마지막으로 입력 방법이 호출되어 지정된 창에 연결됩니다.


코드는 다음과 같습니다.


f (m.Msg == WM_IME_SETCONTEXT && m .WParam.ToInt32() == 1)


{


ImmAssociateContext(this.Handle, m_hImc)


}


이제 입력 방법을 호출할 수 있지만 입력 방법 기록 창에서 단어를 가져오는 방법에 대한 새로운 문제가 발생했습니다.


텍스트를 입력할 때 입력 방법을 켜면 WM_IME_CHAR 메시지가 전송됩니다.


ImmGetCompositionString(IntPtr hIMC, int dwIndex, StringBuilder lpBuf, int dwBufLen)을 사용하여 중국어 문자 또는 NUICODE 유형을 얻을 수 있습니다. 물론 여기서는 한자에 대해서만 다루지는 않습니다.

문자 추출은 다음과 같습니다:

case WM_IME_CHAR:

int size = ImmGetCompositionString(m_hImc, GCS_COMPSTR, null , 0);

size += sizeof(Char);

ImmGetCompositionString( m_hImc, GCS_RESULTSTR, str, size);

sb.Append(str.ToString());

MessageBox.Show(str.ToString());

intoText();// 텍스트 인쇄

                                          >

                                                                                      🎜>

알겠습니다. 테스트한 결과 인쇄된 단어가 모두 반복되는 단어인 것으로 나타났습니다. People", 출력되는 것은 "Serve the People"입니다. 맙소사, 문제가 있습니다. 어디에 있습니까?

MSDN을 확인했습니다. WM_IME_CHAR에 대한 설명은 다음과 같습니다.

WM_IME_CHAR 메시지에는 2바이트 문자가 포함되어 있으며 애플리케이션은 이 메시지를 DefWindowProc에 전달합니다

이게 문제인 걸까요. 메시지를 두 번 보내는 문제입니다.


온라인 토론을 읽은 후 해결책을 생각해냈습니다: 판단 추가


if (m.WParam.ToInt32 () == PM_REMOVE)


{


}


테스트 결과 문제가 없습니다.


코드 포스트



시스템 사용,

System.Collections 사용 .Generic;

System.ComponentModel 사용;


System.드로잉 사용;

System.Data 사용;

System.Text 사용;

System.Windows.Forms 사용;

System.Runtime .InteropServices 사용;

네임스페이스 WindowsApplication2

{

공개 부분 클래스 UserControl1 : UserControl

{

        IntPtr m_hImc;


        bool isShowChina = false;

        public const int WM_IME_SETCONTEXT = 0x0281;


        private const int WM_IME_CHAR = 0x0286;


        private const int WM_CHAR = 0x0102;


       비공개 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(IntP tr hIMC , int dwIndex, StringBuilder  lpBuf, int dwBufLen);



        private int GCS_RESULTSTR = 0x0800;


        private const int HC_ACTION = 0;


       private const int PM_REMOVE  = 0x0001;



        StringBuilder sb = new StringBuilder();


        Font 글꼴 = new Font("宋体", 14, FontStyle.Regular);

        public UserControl1()

        {

            InitializeComponent();

            

        }


        private void UserControl1_Load(객체 전송자, EventArgs e)

        {

            m_hImc = ImmGetContext(this.Handle);

        }

        보호됨 void WndProc(ref Message m)

        {

            base.WndProc(ref m);

            if (m.Msg == WM_IME_SETCONTEXT && m.WParam.ToInt32 ( ) == 1)

            {

                ImmAssociateContext(this.Handle, m_hImc);

             

           }

            스위치(m. Msg)

            {

                case WM_CHAR:

                  KeyEventArgs e = new KeyEventArgs(((키)((int)((long)m.WP 아람))) | ModifierKeys);

                    char a = (char)e.KeyData; //영어

                    sb.Append(a);

                    intoText();

                    isShowChina = false;

                    휴식;

case WM_IME_CHAR:


                    if (m.WParam.ToInt32() == PM_REMOVE) //如果不做这个判断.会打印复的中文

> GCS_COMPSTR, null, 0);

                        size += sizeof(Char);

                        ImmGetCompositionString(m_hImc, GCS_RESULTSTR, str, size);

                        sb.Append(str.ToString());

                        MessageBox.Show(str.ToString()) ;

                        intoText();

isshowchina = true;

}

중단 >

                                         ~                                                           {>

{

그래픽 g = this.creategraphics ();

G.Drawstring(sb.tostring (), 글꼴, Brushes.black, 10, 10) >

                                                          여러 C#에서 빈 양식에 중국어 입력을 구현하면 PS와 유사한 텍스트를 구현할 수 있습니다. 도구 관련 기사는 PHP 중국어 웹사이트를 참고하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:ps 일괄 변환다음 기사:ps 일괄 변환