以前にも紹介しましたが、EditUnicodeTextコントロールの登場以前にテキスト入力を担当していたEdit Textコントロールは、TextEditと呼ばれる入力モジュールを利用していました。このテキスト入力モジュールの機能が貧弱で時代遅れになったため、Apple社はMLTE(Multilingual Text Engine)という最新の入力モジュールを導入したわけです。
TextEditを使いウィンドウ上でテキスト入力を行うには、まず最初にTENew()を実行してTEHandleを得ることから始めます。このに時に引き数で渡す矩形情報は、テキストの表示枠や入力枠を決めます。その後、テキスト入力に関わるすべての操作は、この時に得たTEHandleを参照することで実現できます。TextEditのより詳しい機能を知りたい方は、Universal InterfacesのTextEdit.hやQuickdrawText.hを参照してみてください。
TEHandle thd;
thd=TENew( &destRcet,&viewRect );
Edit TextコントロールがTextEditを用い実装されているという事実は、そのTEHandleをGetControlData()により得ることができるという点からも明らかです。
GetControlData( chd,kControlNoPart,kControlEditTextTEHandleTag,sizeof(TEHandle),&thd,&size );
ですから、もしControl Managerに何らかのバグがあり、コントロール経由で入力テキストに対する正しい操作が出来ない場合には、GetControlData()で得たTEHandleを用いて、テキスト内容にダイレクトにアクセスすることが可能です。つまり、Control ManagerのAPIをTextEditのAPIで代用する「裏技」が使えるわけです。ある機能に対してアクセス方法が複数あるということは、ホテルに「通常階段」と「非常階段」が装備されているようなもので、利用者側の安心感につながります。
それでは、EditUnicodeTextコントロールの方はどうでしょうか?こちらは、コントロールの機能(Unicode対応)などから推測して、EditTextではなくMLTEを用いて実装されていることが明らかです。MLTEによるテキスト入力を実現するのためには、まず最初にXNNewObject()を実行しTXNObjectを得ることから始めます。これは、TextEditにおけるTENew()とTEHandleの関係とまったく同じです。MLTEについて詳しい内容を知りたい方は、Universal InterfacesのMacTextEditor.hを参照してみてください。
EXTERN_API_C( OSStatus )
TXNNewObject(
const FSSpec * iFileSpec, /* NULLでもOK */
WindowRef iWindow,
const Rect * iFrame, /* NULLでもOK */
TXNFrameOptions iFrameOptions,
TXNFrameType iFrameType,
TXNFileType iFileType,
TXNPermanentTextEncodingType iPermanentEncoding,
TXNObject * oTXNObject,
TXNFrameID * oTXNFrameID,
TXNObjectRefcon iRefCon
);
つまり、GetControlData()でEdit TextコントロールからTEHandleを得たのと同じように、EditUnicodeTextコントロールからTXNObjectを得ることが可能であれば、Control Managerを経由せず入力テキストを操作することが可能なわけです。そうすればテキストのフォントサイズ変更などの操作は朝飯前となります。
次回は、DTSに「EditUnicodeTextコントロールからTXNObjectを得る方法が存在しているかどうか?」を尋ねることにした経緯をお話したいと思います。
つづく
copyright 2003 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact Us: koike@ottimo.co.jp