VC++5.0入門26
チュートリアル読書会8 98/5/17

こんにちは。今回で、「ウィザード バーによるビジュアル オブジェクトとコードの対応付け」が終わり、Scribbleも新たなバージョンになります。がんばりましょう。
さて、(ヘルプのタイトルでは)「ユーザー インターフェイス オブジェクトの更新」のところからですね。私がウインドウズプログラミングをはじめた頃は、この(あたりの)項はとてもわかりにくかったように記憶しています。しかし、わかってしまうとどうということもありません。はじめからすんなりわかった人は自分を誉めてあげてください。わからなかった人は、、、普通だと思います。

ここでやりたいことは、要するに
 1.状況に応じて、不要なメニューの項目を淡色表示(無効化)する。
 2.状況に応じて、特定のメニュー項目にチェックマークを入れる。
です。なんだそれだけか、と思いましたか。

まずは前回作ったメニュー項目の「すべてを削除」です。この項目は、絵(CStrokeの集まり)のデータを消去し、画面上に描かれた絵も消す、というものです。で、ちょっと考えるとわかりますが、絵が無い場合(例えば、「すべてを削除」した直後)この項目に意味はありません。こういうときには、この項目を淡色表示した方が良いですね。(淡い色で表示して、今は使えませんよ、とユーザに知らせるあれです。ときどき、あれ、これなんで使えないんだ、とむかつくことありませんか?まあ、大抵、( というか、まともなアプリケーションなら100パーセント)自分が何かミスしているのですが。)
これは、これだけで、命に関わるような大事ではありません(最初からそうですね^^)が、この機能があるとちょっと高級そうですよね。どうやってやるんでしょう。
実は、ポップアップするメニューの項目などをウインドウズが書くときに、(MFCは)アプリケーションに「何か特別な処理が必要か?」ときいてくるのです。つまり、それに答える関数「更新ハンドラ」を書けば良いのです。もちろん、「特別な処理」などと書きましたが、ここでは単なる「淡色表示」で、これはウインドウズのパターンですから、簡単にできるようになっています。安心して下さい。
チュートリアルを読んでいくと、ウイザードバーでUPDATE_COMMAND_UIを選ぶように、、、という記述があります。これです。これで更新ハンドラ(の元、ここではOnUpdateEditClearAllという名前)ができるのです。その中に書き込むコードは
 pCmdUI->Enable( !m_strokeList.IsEmpty( ) );
の1行だけですね。pCmdUIってなんだろうと思いますが、要するに「すべてを削除」を表示するオブジェクト(へのポインタ)で、これはその場その場で自動で与えられるものです。あまり悩まないようにしましょう。このオブジェクトにはEnableという関数があって、、、とチュートリアルには説明がありますね。ちょっと読んでみてください。
m_strokeListはMFCのリストで一筆(CStroke)をまとめておくオブジェクトでした。このオブジェクトの中身が空かどうか調べるのがIsEmptyという関数です。もし、リストの中身が空ならこの関数は「TRUE」というBOOL値を戻します。それに「!」がついているということは、この場合Enableには「FALSE」が与えられるのです。(!TRUEはFALSE、!FALSEはTRUEです。)Enableという関数は引数がBOOL値のTRUEなら普通に表示し、FALSEなら淡色表示にするという関数です。
というわけで、もし、データがあれば、メニューの「すべてを削除」は普通に表示され、データが空のときは、淡色表示になってしまうのです。ふー、疲れましたね。
チュートリアルや上の説明だけですっきりわかる人はいないと思います。すべてを理解するには、まだまだ、たくさんのことがあるからです。ここまでは、なんとなくわかれば良いのだと思います。そして、少しずつ理解を広げましょう。
メッセージマップの話は、ここではまったくしませんでした。初心の内は、斜め読みだけしておきましょう。なんとなく眺めている内に、ああ、そういうことか、とわかってくるかもしれません。(私の場合はそうでした。)すぐに理解しようとあせらない方が良いと思います。

ここまでの話がなんとなくでもわかった人は、次の「Scribble プログラムの [太線] メニュー項目の更新」もなんとなくわかると思います。こんどはSetCheckという関数が出てきますが、名前の通り、チェックマークを入れる関数ですね。これで終わりです。ビルドしてみてください。では、グッドラック!
もし、万一、エラーが出たら、がんばって直して下さい。プログラムは動いてしまえばこっちのものです。
(昔々、私が某プログラムもどき(CやC++ではありません)をコンパイルしているときに、某大学の秘書さん(男性、アメリカ人)が、後ろから「グッドラック!」と言ってくれたのを思い出しました。(ありゃ?もしかするとバカにされたのかな?いや彼はいい人だったから、、、。))
最近、書く量がとても少なくなりました。チュートリアルを少しでも読みやすくできれば、私には少ない労力で読む人には益があると思って、、。でも、ちょっと、、、目的を果たしているかな、、、。反省はしています。

ところで、知らない関数ばかり出てきて、自分でプログラムするときはどうすんだ、と思う人も多いでしょう。私個人は、あせらずにチュートリアルに出てくる関数を覚えていけば良いと思います。もちろんチュートリアルに出てこない関数もたくさんありますが、チュートリアルの関数だけでもかなりのものですし、だんだんMFCの発想がわかってくると、もう少し安心できるようになります。
それから、新しい関数が出てきたら、ヘルプの検索で調べてみることをお勧めします。ヘルプを見てもわからない!というのはわかります。しかし、いつかは自分でヘルプを見るようにならなければなりません。そのためにもトライしてください。お勧めは斜め読みと拾い読みです。
目次のページ
前のページ
後のページ