掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
IMEの変換を縦書き用に設定するには? (ID:10680)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
環境がわかりませんし,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;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.