WM_IME_COMPOSITION メッセージが発生したときに、ImmGetCompositionString 関数を使ってFEP (IME など) が持つフリガナを取得します。
この例は、フリガナ機能付きコンポーネントの作成例です。
TEdit コンポーネントに KanaOut プロパティを追加しています。 この追加したプロパティに、Edit1(TEdit クラス) を設定すると、入力した文字のフリガナが Edit1.Text に入力されていきます。
unit KanaEdit; interface uses Windows, Messages, Classes, Graphics, Controls, StdCtrls; type { TKanaEdit } TKanaEdit = class(TEdit) private FKanaOut: TEdit; // KanaOutプロパティ protected procedure SetKanaOut(AValue:TEdit); procedure WndProc(var Msg: TMessage); override; published // プロパティ ... property KanaOut: TEdit read FKanaOut write SetKanaOut; ... end; procedure Register; implementation uses IMM; procedure Register; begin RegisterComponents('Samples', [TKanaEdit]); end; {******************************************************************************* 機能: カナ出力プロパティーセット 引数: 戻値: *******************************************************************************} procedure TKanaEdit.SetKanaOut(AValue: TEdit); begin if (AValue = nil) or (AValue = Self) then begin FKanaOut := nil; end else begin FKanaOut := AValue; end; end; {******************************************************************************* 機能: メッセージ処理 引数: 戻値: *******************************************************************************} procedure TKanaEdit.WndProc(var Msg: TMessage); var imc: HIMC; // IMEのコンテキストを格納 sbKana: StringBuilder; nSize: Integer; begin if (FKanaOut <> nil) then begin if (Msg.Msg = WM_IME_ENDCOMPOSITION) then begin imc := ImmGetContext(Handle); case Msg.Msg of WM_IME_ENDCOMPOSITION: begin // 変換結果の「読み」を取得 nSize := ImmGetCompositionString(imc, GCS_RESULTREADSTR, nil, 0); sbKana := StringBuilder.Create; sbKana.Length := nSize; ImmGetCompositionString(imc, GCS_RESULTREADSTR, sbKana, nSize+1); ImmReleaseContext(Handle, imc); // 更新後文字列作成 FKanaOut.Text := FKanaOut.Text + sbKana.ToString; end; // WM_IME_ENDCOMPOSITION end; // case end; // if end; // if inherited; end; end.
コメント (0件)