はじめまして。
今、私は1から縦書きエディタを作ろうとしているのですが、IMEを制御して変換候補をWordのように縦書き用に表示するにはどうすればいいのでしょうか。
SetImeCompositionWindow(Font, X, Y);
のFontに縦書き用のフォントを指定してもだめでした。
入力してみると、縦方向にならず、さらにスペースのようなものだけしか表示されません。(変換すると左に90度回転した文字が表示された、通常の向きの候補ウインドウは出てきます)
変換結果も取得できましたが、入力中に何を入力したかも分からないと言うお寒い状況です。
IMEに関して書かれているドキュメントも少ないので手も足も出ません。
どなたか方法をご存知の方がいらっしゃいましたら、ご教授ください。
お願いします。
×入力中に何を入力したかも分からない
○入力中に何を入力しているかも分からない
です。すみません
環境がわかりませんし,SetImeCompositionWindowをどのタイミングで
どのように使用しているかも,全くわかりませんので,例として,
Form1に配置したMemo1のサブクラスでメッセージを捕らえるコードを
書いてみました.
usesにimmが必要です.多分.確認環境はコメントに書いてあります.
public
{ Public 宣言 }
OriginalProc:TWndMethod;
procedure MemoSubclassProc(var Msg:TMessage);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
//====================================================================
// Create時にMemo1のサブクラスを定義
//====================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
OriginalProc := Memo1.WindowProc;
Memo1.WindowProc := MemoSubclassProc;
end;
//====================================================================
// Memo1のサブクラス(縦書き用の変換候補ウィンドウを表示させる)
// IMEが編集直前に送るWM_IME_STARTCOMPOSITIONを捕らえて文字を縦書き
// に変換してIMEにセットする(WM_IME_COMPOSITIONでも動作可)
// 動作確認 WindowsXP(SP1)+Delhi5(UP)+IME Standard 2002 ver8.1
// WXGでは正常動作せず(初回起動時にタイプした文字が非表示
// 何回か操作していると正常動作する.何か方法があるかも)
// http://www2.big.or.jp/~osamu/Delphi/tips.cgi?index=0083.txt参照
//====================================================================
procedure TForm1.MemoSubclassProc(var Msg: TMessage);
var
ALogFont : TLogFont;
IMC : HIMC;
FontName : String;
FontHeight: Integer;
NewFont : HFont;
OldFont : HFont;
begin
case Msg.Msg of
WM_IME_STARTCOMPOSITION:
begin
IMC:=ImmGetContext(Memo1.Handle);
try
//TLogFont構造体の一部を変更
FontName :=Form1.Canvas.Font.Name;
FontHeight:=-18;
with ALogFont do begin
lfHeight :=FontHeight;
lfQuality :=ANTIALIASED_QUALITY;
lfEscapement :=2700;
StrPCopy(lfFaceName,'@'+Font.Name);
end;
//変更したフォント情報を用いて新しいフォントハンドルNewFont作成
//NewFontをIMCに設定してOldFontに前のフォント情報を退避
//作成したフォントをIMCに設定
NewFont:=CreateFontIndirect(ALogFont);
OldFont:=SelectObject(IMC,NewFont);
try
GetObject(NewFont,SizeOf(LOGFONT),@ALogFont);
ImmSetCompositionFont(IMC,@ALogFont);
finally
//元のフォントハンドルを選択し戻してNewFontを削除
SelectObject(Memo1.Handle,OldFont);
DeleteObject(NewFont);
end;
finally
ImmReleaseContext(Memo1.Handle,IMC);
end;
end;
end;
OriginalProc(Msg);
end;
ありがとうございました。
情報不足ですみませんでした。
FormCreateのところでLOGFONTを作成してSetImeCompositionWindow(Font, X, Y);を呼び出していたのですが、それだけではだめだったみたいですね。
とりあえず、コンポーネント側でメッセージを受け取るようにして、ちゃんとたてに表示されるようになりました。
描画部からエディタを作っているので、Memoに表示されないのは特に問題にはならないと思います。
本当にありがとうございました。
>描画部からエディタを作っているので、
ちょっと疑問におもったのですが,縦書きエディタのコーディングにもよると
は思いますが,前に示した縦書きの候補ウィンドウを作成する必要がない
場合があるのではないかと考え,試しに以下のようにRichEditから縦書き
可能なコンポーネントを作成して実験してみまました.
このコンポーネントの場合は,そのままで,漢字変換モードにすると,自動的に
縦書きの変換リストが表示されますね.
以上,ダソクでした.
//====================================================================
// 縦書きの変換候補リストのテスト用 縦書きRichEdit(TplVertRichEdit)
//
// Windows2000以降のRichEdit20.dllが縦書きをサポートしなくなってしま
// ったので,Windows98の[System]にあるRICHED32.DLLとGAPI32.DLLを,こ
// のプログラムをテストするプログラムのフォルダにコピーしてテスト.
// 結果
// WindowsXP+Delphi5で変換候補のフォントを縦書きにしなくてしも,縦
// 書き用の候補リストが表示された.
//====================================================================
unit plVertRichEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls,RichEdit;
type
TplVertRichEdit = class(TRichEdit)
private
protected
procedure CreateParams(var Params: TCreateParams); override;
public
published
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('plXRAY', [TplVertRichEdit]);
end;
{ TplVertRichEdit }
//====================================================================
// コンポーネント初期状態の設定
//====================================================================
procedure TplVertRichEdit.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style or ES_VERTICAL;
ImeMode:=imHira;
end;
end.
>Windows98の[System]にあるRICHED32.DLLとGAPI32.DLLを,こ
// のプログラムをテストするプログラムのフォルダにコピーしてテスト
これはライセンス違反になるのでは?
ソース付のDelphiの日本語エディターコンポーネントがあるのに
こういうことを紹介するのは避けたほうがよいです。
ツイート | ![]() |