たぶん、何回か続くと思うけど、BREWなどで知られてないことなどなどを、書こうとおもいます。
今回は、BREWに限らないけど、画面制御などで、複数画面あったとしても、イベントはすべてひとつのメソッドや関数にきてしまう場合、どーしたらいいかという方法。
BREWの黄色と赤の本、BREWプログラミング実践バイブル ISBN 4-8443-1947-7では、P90の「BREWダイアログの悲しい現実」で、いろいろ問題点をあげているのはいいんだけど、その解決策が
・ダイアログを使わない(これはいい、ウィリアムのいたずらもそうしてる)
・退屈なコードをならべる(これは、ウィリアムのいたずらは、これ以外の方法で逃げている)
・IHtmlViewerを使う
という3つしか、あげていない。とくに、最後のIHtmlViewerは、マニュアルに書いてあるだけでは、たいした操作ができない。
それについて、2ちゃんねるとかで、確か質問が出ていたり、このアメリカ人が、「はあ?」ということを書いていたりするんだが(Are there any other properties that I am missing???って、おまえ、そこで、そーさする気だったんかい、input modeを(^^;)、さらにコメントのinlineフラグの設定、おまえ、本当にそれ試して、そのコメントかいてるんかい!っていう、お間抜けさ250%のブログが、へーきでかかれたりする。。相手が日本語読めないと思って、言いたいことかいてます)、まあ、それについては、後日、覚えていたら、ちゃんとした、操作ができる方法を書く。
しかし、しかしだ。IHTMLVIEWERでちゃんとした操作をするにしても、IHTMLVIEWERを使わないにしても、まず、複数画面があるとき(複数のHTMLを使って画面を切り替えるとき)、1つの関数にみんなはいってきてしまうのを、どーするかを書かないと、話すすまないんで、そっから今日は片付けます。
BREWを知らない人へ。
画面のイベントは、すべて、アプリ名_HandleEvent()という関数にきます。
なので、1つのアプリで、複数の画面を使う場合、どうしたらいいかという問題が出ます。
これは、かんたんです。
1.画面に番号をふりましょう。
2.画面ごとに
画面名_InitAppData()
画面名_HandleEvent()
画面名_FreeAppData()
という関数をつくり、そこに、その画面にたいして「だけ」の、起動時、イベント処理、最後のフリー処理をかきます。
ここで、上記の関数の引数に、アプリの構造体(pMe)を、必ずわたし、
pMeに int gamen_bango; という、
現在表示している画面番号を入れるもんをメンバーに追加してください。
3.そして、画面名_InitAppData()で、gamen_bangoに自分の画面番号を、セットするようにしてください。
4.アプリの起動時にはしる、アプリ名_InitAppDataでは、まず初めに起動する画面の画面名_InitAppData()を呼び出します。
5.アプリ名_HandleEvent()では、すべての画面のイベントがきますので、
ここで、VC++が、ウィザードで作成したソースを、すかっと削除し(その内容は、各画面の画面名_HandleEvent()に書かれる)
switch(画面番号)
{
case 1: // 1番の画面のHandleEvent()よびだし
return 画面1_HandleEvent();
case 2: // 2番の画面のHandleEvent()よびだし
return 画面2_HandleEvent();
case 3: // 3番の画面のHandleEvent()よびだし
return 画面3_HandleEvent();
:
:
(最後の画面までこれをかく)
}
return FALSE;
}
みたいなかんじで、ここでは、各画面のHandleEventをよびだすだけにする。
そうすると、あとは、各画面で、自分のHandleEventを処理すればいい。
6.画面を切り替えるときは、
今表示している画面の_FreeAppData()を呼び出し、フリーをしたあとで、
次に表示する画面の_InitAppData()を呼び出し、次の画面処理をします(この中で、3により、画面番号が書き換わり、イベントがきたときに、どの画面が表示されているか分かる)
7.アプリを終わらせたいときは、ISHELL_CloseApplet(pMe->pIShell,FALSE);を呼び出す。
8.画面間のデータわたしとか、画面内で使うデータは、pMeの中に書く。
だけど、その道方について説明すると長くなるので、今度、気が向いたときに、どっか(このブログか、ウィリアムのいたずらのBREWホームページ)に、書くかもしれない。
こんなかんじかなあ。。
ウィリアムのいたずらの場合、画面だけでなく、項目についても、これをやっていて、カーソルを、どこにでも飛ばせるようにしている。
で、問題は、IHTMLVIEWERだよね。それは、覚えていて、時間が合ったらかくよ。
こんなかんじ
1.IHTMLVIEWER内の項目のカーソルとフォーカスの制御
2.入力規制
1が、2ちゃんの答え、2がアメリカ人への答え(ごめん、英語なんで、アメリカ人と思っているだけで、違う国の人かも(^^;))