Macintosh Programming (11) - その他アイテムと日本語入力 -	2000.Oct., Nov.

1. 残されたものたち
 …「未来少年コナン」の原作名ぢゃないよ。って、間違ってたりするかも(汗)

	ソースはここ、smpldlg2.lzh.bin 9,088 byteです。

 さ。GUI周りは大体こんなもんで一通り。とか思えばまだ足りない。ポップアップ
 メニューとリストボックスをやってなかった。

 #ドロップダウン・リストボックスは?とかは言わないで。作ればできる。多分。
  けど、そんなもんMacでは見たことない気がするんで。。。

 リストボックスはどーやらList managerとやらを使って作るみたいです。けど、
 このマネージャ、意外と高機能。それじゃあってんでフルスクラッチ(手作り)
 しちゃいましたです。

 普通逆では?って?いやぁ。ネズミ捕らえるのにドーベルマン・ビンシャー放つ
 奴はいないでしょう?その辺から野良猫捕まえてくりゃぁOKOKだもんね。
 (って、本職の野良猫(*1)を人間が捕らえるなんてことはとても困難だけどね)

 (*1) 本気で戦闘態勢にあるなら、猫でも怖いですぞ。襲撃の瞬間なんざ見えません。
  瞬時に雌猫が子猫2匹の頸動脈を食いちぎるのを見たことあります。
  あ。と思ったら、致命傷を負った子猫が断末魔。なんですもん。何が気にくわな
  かったのかは分かりませんがね。ちなみに自分の仔じゃないです。人が覗いたり
  すると、神経質になった親猫が自分の仔を噛み殺すことがある。というのとは
  違います。

 #という訳で、雌猫でも子猫を殺すことはあるのです>白土三平殿(カムイ外伝謎)

 …何の話だっけ?
 うぉ。失礼しました。そうそう。そうでした。

2. CNTLリソース
 ポップアップメニューやリストボックスのスクロールバーをDITLリソースに配置
 する場合、どちらもControlとして貼ります。で、貼ったコントロールが実際には
 何であるかは別途CNTLリソースで定義します。詳細はsmpldlg2.rsrcを見よ。
 …ってんじゃ、あんまりなんで補足します。

 DITL上でControlとなっているアイテムをダブルクリックするとResource IDを
 入力する欄があります。この番号がCNTLのリソースIDです。

 で、ControlのDITL上でのサイズをどうやって決めるか。というとCNTLの方を
 見ると味も素っ気もないBound Rectの所にサイズを数字で直接入れるか、
 その横の[Set]というボタンを使います。[Set]押してCNTL上でマウスドラッグする
 と、その大きさでBound Rectの数字もセットされます。

 DITL上では大きさ、変えられないみたいですねぇ。

 #これって便利なような不便なような妙なインタフェースなんすけど?

3. ポップアップ
 次のものを用意します。
 1. MENUリソース
  動的に作る場合はNewしてInsertして、なんでしょうけど、今回は面倒なので
  静的に作ります。普通にResEditでメニュー、作っておきます。この内容が
  ポップアップします。
 2. CNTLリソース
  Bound Rectは前述のように決める。その他の値は次の通り(抜粋してます)。
  Value 	0: タイトルをメニューの左に表示
  		1: タイトルをメニューの上に表示
  Max		タイトル文字列の文字幅をPixelで
  Min		MENUリソースのリソースID
  ProcID	1008: メニューの幅はメニュー内容によって決定される
  		1009: メニューの幅はBound Rectの大きさに固定
  RefCon	使う予定がないので0
  Title 	どーでも良いけど、私ならPopupと入れる。単なる目印

 で、Macとしては珍しく(笑)、ソース上では特に何もしなくてもマウスクリックに
 反応してくれます。Set/GetControlValue()すればOKOK。

4. リストボックス
 次のものを用意します
 1. CNTLリソース
  前述のようにフルスクラッチですが、スクロールバーはOSに面倒みてもらいます。

  Bound Rectは前述のように決める。その他の値は次の通り。
  Value 	初期値(例えば1、先頭)
  Max		最大値(例えばアイテムの数。とか)
  Min		最小値(例えば1)
  ProcID	16: この値で固定のようです
  RefCon	使う予定がないので0
  Title 	あたしはScroll barと入れてます。悩まずに済むように
 2. DITLリソース
  ポップアップもそうですが、CNTLをちゃんとセットするとDITL上でもそれらしい
  絵が表示されます。で、リストボックスの場合、スクロールバーだけがポツンと
  あっても意味ないので、その横にUser Itemで「ここにリストボックスの中身を
  表示したいぞ」という四角を描いておきます。
  #今回、垂直スクロールバー付きの奴を作るんです

 今回、Min=0, Max=100固定で作ったんですが、何か動きがちょっとぎこちない
 ですね。
 Min=1, Max=アイテム数の方がきっと良いかも。とか思っての上の記述ですぅ。
 んで、リストボックスの本体部はマウスクリックとかEnable/Disableもみんな
 自前で処理してます。当然ですね。User Itemですもの。

 勢いで作ったリストボックス。必要なくても再描画してたりといまいちですんで
 これ以上の解説はしません。後はソースをご覧あれ。

5. 日本語のインライン変換
 Macではかな漢字変換ソフトをインプットメソッド、それとアプリとの仲立ちを
 するシステムをTSM (Text Services Manager)と呼ぶようです。

 で、インラインをサポートするやり方が2つあるようです。が、安直大好きな私は
 より簡単と思える方法を採用しました。TSMTEと呼ぶらしいです。

 この時のポイントは下のごとし(違ってるかもだけど)。
 ・sizeリソースでHigh level eventの対応を'1'にする
 ・TSM用の構造体を初期化する
 ・イベントループで現在アクティブなTEditがどれか調べる
 ・イベントループでTSMイベントが来たらまずそれを優先的に処理する
 ・イベントループでHigh level eventが来たらOSに引き渡す

 TSMTEで作成・破棄するTSMDocumentってウィンドウ単位で管理するみたい。
 1つのウィンドウに幾つテキストエディットがあってもドキュメントIDは1つで
 良いけど、ウィンドウが違えばそれぞれのウィンドウ用にドキュメントを
 作成する必要がありそう。
 #IM読んで確認した訳ではないので大嘘の可能性あり。ご注意
  ですがまぁ、ちゃんとインラインでかな漢字変換できてますね……

6. 変更履歴
 2000.Oct.	新規作成
 2000.Nov.	リストボックスをクリックすると他のコントロールの動作が変になる(汗)
		バグを修正。invLBArea()でClipRect()したのを元に戻してなかった。
		同関数末尾にClipRect(&dlg->portRect);と1行追加

(EOF)