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件)