IMEの変換を縦書き用に設定するには?

解決


ぷよよん  2004-08-30 01:19:11  No: 10678

はじめまして。

今、私は1から縦書きエディタを作ろうとしているのですが、IMEを制御して変換候補をWordのように縦書き用に表示するにはどうすればいいのでしょうか。

SetImeCompositionWindow(Font, X, Y);

のFontに縦書き用のフォントを指定してもだめでした。
入力してみると、縦方向にならず、さらにスペースのようなものだけしか表示されません。(変換すると左に90度回転した文字が表示された、通常の向きの候補ウインドウは出てきます)
変換結果も取得できましたが、入力中に何を入力したかも分からないと言うお寒い状況です。

IMEに関して書かれているドキュメントも少ないので手も足も出ません。

どなたか方法をご存知の方がいらっしゃいましたら、ご教授ください。
お願いします。


ぷよよん  2004-08-30 01:21:30  No: 10679

×入力中に何を入力したかも分からない
○入力中に何を入力しているかも分からない
です。すみません


Mr.XRAY  URL  2004-08-30 09:18:04  No: 10680

環境がわかりませんし,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;


ぷよよん  2004-08-30 22:42:08  No: 10681

ありがとうございました。
情報不足ですみませんでした。

FormCreateのところでLOGFONTを作成してSetImeCompositionWindow(Font, X, Y);を呼び出していたのですが、それだけではだめだったみたいですね。

とりあえず、コンポーネント側でメッセージを受け取るようにして、ちゃんとたてに表示されるようになりました。
描画部からエディタを作っているので、Memoに表示されないのは特に問題にはならないと思います。

本当にありがとうございました。


Mr.XRAY  URL  2004-09-02 07:24:07  No: 10682

>描画部からエディタを作っているので、

ちょっと疑問におもったのですが,縦書きエディタのコーディングにもよると
は思いますが,前に示した縦書きの候補ウィンドウを作成する必要がない
場合があるのではないかと考え,試しに以下のように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.


いつも初心者  2004-11-12 09:45:45  No: 10683

>Windows98の[System]にあるRICHED32.DLLとGAPI32.DLLを,こ
//  のプログラムをテストするプログラムのフォルダにコピーしてテスト

これはライセンス違反になるのでは?
ソース付のDelphiの日本語エディターコンポーネントがあるのに
こういうことを紹介するのは避けたほうがよいです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加