Maison > interface Web > Tutoriel PS > le corps du texte

L'implémentation de la saisie chinoise sur un formulaire vierge sous C# peut implémenter un outil de texte de type PS

高洛峰
Libérer: 2017-02-15 10:23:44
original
1737 Les gens l'ont consulté

Saisie chinoise sur formulaire vierge sous C#

Mots clés : outil de texte de type PS, saisie chinoise répétée

.

Récemment, j'ai fait des recherches sur la création d'un outil de texte de type PS, j'ai vérifié beaucoup d'informations et j'ai demandé à beaucoup de gens. Finalement, le travail acharné a finalement porté ses fruits. Écrivez-le pour que tout le monde puisse en discuter.

Ouvrez la méthode de saisie sur un formulaire vierge. Quoi qu'il en soit, la méthode de saisie ne peut pas être ouverte. Même si this.ImeMode= ImeMode.NoControl est défini, la fenêtre d'enregistrement de la méthode de saisie ne peut pas être ouverte. Je suis allé sur le forum de développement Microsoft et j'ai posé quelques questions. Merci au modérateur Zhou Xuefeng et Riquel_Dong. modérateur pour leurs conseils. J'ai utilisé l'API. Function: ImmAssociateContext(IntPtr hWnd, IntPtr hIMC); Enfin, la méthode de saisie est appelée. Sa fonction est d'associer l'entrée à la fenêtre spécifiée.


Le code est le suivant :


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


{


ImmAssociateContext(this.Handle, m_hImc);


}


Maintenant, la méthode de saisie peut être appelée. Mais un nouveau problème est apparu. Comment obtenir les mots sur la fenêtre d'enregistrement de la méthode de saisie.


Lorsque la méthode de saisie est activée pour saisir du texte, le message WM_IME_CHAR sera envoyé. Nous pouvons obtenir les caractères chinois en traitant ce message <.>


Vous pouvez utiliser la fonction IMM : ImmGetCompositionString(IntPtr hIMC, int dwIndex, StringBuilder lpBuf, int dwBufLen) pour obtenir les caractères chinois ou le type NUICODE) ; caractères saisis sur le formulaire de saisie. Bien sûr, nous ne les étudierons pas ici. Rien d'autre.


Le code à utiliser. extraire les caractères est le suivant :


cas 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();//Print Text


isShowChina = true;


                                                                   


                                                                                   🎜>

Cela semble être fait. en le testant, j'ai constaté que tous les mots imprimés sont répétés. Par exemple, si je saisis « Servir le peuple », ce qui s'imprime est « Oh mon Dieu, le problème est où.


J'ai vérifié MSDN. Il y a cette description de WM_IME_CHAR :


le message WM_IME_CHAR. inclut un caractère à deux octets et l'application transmet ce message à DefWindowProc


Est-ce là le problème ? message deux fois.


Après avoir lu une discussion en ligne, j'ai trouvé une solution : ajouter un jugement


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


{


}


Test .Enfin plus de problèmes


Code post


en utilisant System;

en utilisant System.Collections.Generic;

en utilisant System.ComponentModel;

en utilisant System.Drawing;

en utilisant System. Données ;

à l'aide de System.Text;

à l'aide de System.Windows.Forms;

à l'aide de System.Runtime;

espace de noms WindowsApplication2

{

classe partielle publique UserControl1 : UserControl

{


        IntPtr m_hImc;


        bool isShowChina = false;

        public const int WM_IME_SETCONTEXT = 0x0281;


        const privé int WM_IME_CHAR = 0x0286;


       const privé int WM_CHAR = 0x0102;


     const privée 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;



        StringBuilder sb = new StringBuilder();


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

        public UserControl1()

        {

            InitializeComponent();

            

        }


        protégé override void WndProc(ref Message m)

        {

            base.WndProc(ref m);

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

            {

                ImmAssociateContext(this.Handle, m_hImc);

             

         }

            commutateur (m. Msg)

            {

                case WM_CHAR:

                    KeyEventArgs e = new KeyEventArgs(((Keys)((int)((long)m. WParam))) | ModifierKeys);

                    char a = (char)e.KeyData; //英文

                    sb.Append(a);

                    intoText();

                    isShowChina = false;

                    pause ;

case WM_IME_CHAR :

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

                    {

                        StringBuilder str = new StringBuilder();

                        int size = ImmGetCompositionString(m_hImc, G CS_COMPSTR, null, 0);

                        size = sizeof(Char);

                        ImmGetCompositionString(m_hImc, GCS_RESULTSTR, str, size);

                        sb.Append(str.ToString());

                       MessageBox.Show(str.ToString());

                        intoText();

isshowchina = vrai;

}

Pause ;                                                                                                                                                                                                                                               {>

{

Graphiques g = this.creategraphics ();

G.Drawstring (sb.tostring (), font, brushes.black, 10, 10);                                                      Implémentation de la saisie chinoise sur un formulaire vierge sous plusieurs C# peut implémenter un texte de type PS Outils. Pour les articles connexes, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!