C# で空白のフォームに中国語入力を実装すると、PS のようなテキスト ツールを実装できる

高洛峰
リリース: 2017-02-15 10:23:44
オリジナル
1754 人が閲覧しました

C# での空白のフォームへの中国語入力

キーワード: PS 風のテキスト ツール、中国語入力の繰り返し

最近、PS 風のテキスト ツールを作成するために研究しています。 N 件の情報を収集し、N 人に質問した結果、ようやく結論を出しました。

で入力方法を開きます。空白のフォームと C# を使用します。その中の空白のウィンドウは、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メッセージが送信されます。中国語の文字を取得できますこのメッセージを処理すると

IMM 関数を使用できます: ImmGetCompositionString( IntPtr hIMC, int dwIndex, StringBuilder lpBuf, int dwBufLen); もちろん、入力フォームに入力された中国語の文字または NUICODE タイプの文字を取得します。ここでは他に何も勉強しません。漢字の問題だけです。

単語を取得するコードは次のとおりです:


case WM_IME_CHAR:


int size = ImmGetCompositionString(m_hImc, GCS_COM PSTR, null, 0);


size += sizeof( Char);


m_hImc、GCS_RESULTSTR、str、サイズ);

sb.Append(str.ToString());

MessageBox.Show(str.ToString());


str. isShowChina = true;



休憩; サービス「おやおや、何が問題ですか?」


MSDN を確認したところ、WM_IME_CHAR について次の説明がありました:


WM_IME_CHAR メッセージ全角文字が含まれており、アプリケーションはこのメッセージを DefWindowProc に渡します


これは問題ですか? メッセージを 2 回送信するという問題です。


解決策: 判定を追加します


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


{


}


テスト。最後に、コードポストに問題はありません


using System;

using System.Collections.Generic;


System.ComponentModel を使用します。

System .Drawingの使用;

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;


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 ;



StringBuilder sb = new StringBuilder();


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

public UserControl1()

{

InitializeComponent();

}


private void UserControl1_Load(object sender, EventArgs e)

{

m_hImc = ImmGetContext(this.Handle);

}

protected 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) ;

}

switch (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;

break;

case WM_IME_CHAR:


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

StringBuilder str = new StringBuilder();

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();

C Isshowchina = TRUE;

}

//// & gt;

//// & lt;/概要 & gt;

Private void intotext () // {

graphics g = this.creategraphics ();

g.Drawstring (sb.tostring (), font, Brushs.black, 10, 10);

}

}

C# で空白のフォームにさらに中国語を入力するには、PS のようなテキスト ツールを実装できます。 関連記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート