VC++5.0入門15
メニューとダイアログボックス前編 97/12/21

こんにちは。御無沙汰しました。
一年の終わりがもう来たか、、、と思う今日このごろですが、年が明けたら、また、がんばるぞぉ〜とも思います。
さて、前回まで、左ボタンを押しながらマウスを動かすと、そこに猫という字が書かれるプログラムを作ってきました。今回から、メニューに「文字」という項目を付け、そこを選択すると、ダイアログボックスが開き、書く文字を「猫」から自由に変更できるようにしてみましょう。
この辺になると、さすがに図をいれないと厳しいかもしれません。時間に余裕ができたら、少し考えてみたいと思っていますが、、、。
では、、、。まず、Nekoを開いてください。Developer Studioのメニューで「ファイル」−>「ワークスペースを開く」でNeko.dswを選択するのでしたね。次に、Developer Studioの左の窓の下のタブで、Resource Viewを選んでください。ここには、このプログラムが使うメニューバーやダイアログボックスなどが登録されています。(もちろん、後で、付け加えたり削除したりもできます。)
まず、Dialogとあるフォルダアイコンの前の「+」を押してください。するとIDD_ABOUTBOXというものがでます。これをダブルクリックしてみてください。画面の右側に、ダイアログボックスが現れると思います。これは、今作っているプログラムで使う「著作権情報のダイアログボックス」を編集する画面なのです。
Copyright (C) 1997と書いてあるあたりをクリックしてみてください。するとその字の周りに青い四角が現れるでしょう。ちょっと、説明しましょう。
今の画面はダイアログボックスの編集と言いましたが、一般に、ダイアログボックスの上には、ボタンやら絵やらいろいろなものをを置くことができます。例えば、何か字を「置きたい」ときには、スタティックテキストコントロールというものをダイアログボックスに置き、その上に字を書きます。ここでスタティックテキストとは「(一応)変更する予定のない文字列」くらいの意味です。コントロールとは簡単に言うと、ダイアログボックスなどの上に置く小さな「もの」のことです。どんなコントロールがあるかはおいおい見ていくことにして、今回はスタティックテキストコントロールを見てみましょう。
今$Copyright (C) 1997の周りに見えている青い四角がこのコントロールを表しているのです。ここで、マウスの右ボタンをクリックして見てください。ポップアップメニューが出てきますね。そのメニューの「プロパティ」を選択してください。
新たにダイアログボックスが開きますが、これがこのスタティックテキストコントロールのプロパティ(性質、設定)を表しています。左の方にはこのコントロールのID(つまり名前ですね。ここではIDC_STATICとあると思います)があります。これは変更できますが、普通はそのままにしておきましょう。その下にいくつかチェックボックスがありますが、これも、このままにしておきましょう。
右側には、キャプションという入力場所があり、Copyright (C) 1997と書いてあると思いますが、今回はここを書き換えて見ましょう。ここを
  Copyright (C) 1997 小林健一郎
などとしてみましょう。(もちろん、名前はみなさんの名前にしてください。)次に、このプロパティダイアログボックスの外でクリックすると、ダイアログボックスは消えますが、編集中のダイアログボックスの文字列はすでに変更されていることがわかると思います。
あとは即実行してみてください。(ビルド−>実行、ビルドしますかという問いに「はい」でしたね。)そして、開いた(私たちのNekoという名の)プログラムのヘルプの「バージョン情報」を選択してみてください。先ほどのダイアログボックスが出現し、著作権者が自分になっているでしょう。自分の名前入りのダイアログボックスのついたプログラムを作れるなんてすばらしいではありませんか。深く深く喜びを味わいましょう。(そうでもないですか?^^;)もちろん、このダイアログボックスはOKボタンを押せば消えます。
さて、ひとしきり喜びをあじわったら、Nekoプログラムを終了し(忘れる人がわりといます。ちゃんと終了してください)、もう一度、Resouce Viewでさっきのダイアログを編集してみてください。実は、スタティックテキストコントロールの位置や大きさ、ボタン(ボタンコントロール)の位置や大きさを変えたりもできます。
言葉で書くとわかりずらいですが、位置や大きさを変えるには、マウスでドラッグしてやれば良いのです。普通のウインドウのように扱ってやれば良いのですが、、、。コントロール内で左ボタンを押してドラッグすれば、位置が変わり、コントロールの縁をドラッグすれば大きさが変わります。たぶん、いろいろやってみればわかると思います。ダイアログボックス自身の大きさも変えられます。
ボタンの上で右クリックして、ポップアップメニューでプロパティを選び、キャプションを変えてみても面白いでしょう。ちょっと遊んでみてください。わたしなら、OKを「わかった」などと変えてみます。
次にメニューをいじってみましょう。Resouce ViewでMenuのIDR_MAINFRAIMEを選んでください。(「+」をクリックして、IDR_MAINFRAMEをダブルクリックです。)これでメニューを編集する画面になります。画面右の方に現れたメニュー編集のウインドウを見てください!
左から順番に「ファイル」から「ヘルプ」へと行儀良く項目が並んでいるメニューが表示されていますね。この「ヘルプ」の右側に四角があると思います。これを「編集」と「表示」の間にドラッグアンドドロップしてみてください。うまく行きましたか?その後で、(ダイアログボックス編集のときにコントロールに対してやったように)その四角の中で右ボタンクリックでプロパティを選択し、プロパティダイアログボックスを開きます。ここにはIDは入力できず、キャプションは空白になっています。このキャプションに「文字」と入力してください。
すると、編集中のメニューに「文字」という項目が現れ、その下にまた四角が現れます。次にこの新しい四角内で右クリックして、プロパティダイアログボックスを開いてください。そして、そこで、キャプションを「文字の変更...」としてください。もちろん、何と入力しても良いのですが、まあ、ここはこういうことにしておきましょう。
さらに、ここでは、IDも入力しなければなりません。これもなんでも良いのですが、ID_CHANGE_LETTERとすることにしましょう。このIDは勝手に作ったものですが、ちゃんと覚えておきましょう。
それでは、実行してみてください。ウインドウのメニューを良く見ると、ちゃんと「文字」という項目が増えているはずです。しかし、ここで、文字の変更を選択しても何も起きません。何か起こるようにコードを書いていないからです。
ちゃんとコードを書くのは次回にさせてください。今日は、様子見だけにしましょう。まず、Nekoを終了し、メニュー編集画面などの中で、右ボタンをクリックしてください。ポップアップメニューが出るのでした。ここで、ClassWizardを選んでください。ClassWizardはコードを書く手伝いをしてくれるのですね。
ClassWizardのダイアログボックスが開いたら、右上のクラス名のところで、CNekoDocを選んでください。そして、左の上から2番目の窓を良く見てください。ここはIDの窓ですが、ID_CHANGE_LETTERというIDがあるはずです。これを探してクリックしてください。すると右側にあるメッセージという窓の中身が変化すると思いますが、ここで、COMMANDを選んでください。そして「関数の追加」ボタンを押してください。ここで「OnChangeLetter」という名のメンバ関数を付け加えて良いかときいてくるので、OKを選んでください。
何をしているかわからなくなったかもしれません。わかってしまえばどうということも無いのですが、、、。次のように考えてください。
一般に、ウインドウズプログラムでは、マウスのクリックなどで発行されたメッセージをプログラムがどう処理すれば良いか、書いていくのでした。例えば、マウスの左ボタンが押された時には、ウインドウズが「左ボタンが押された」という意味のメッセージをプログラムに送るのです。このメッセージが来たときにどうすれば良いかが「OnLButtonDown」という関数に書かれるのでした。(こういう関数はメッセージハンドラと呼ばれます。)
さて、私たちはメニューに新しい項目「文字の変更」を付け加えました。ユーザがこの項目を選ぶとどうなるのでしょう。実は先ほど定義したこの項目のID、ID_CHANGE_LETTERがプログラムに送られるのです。そこで、このメッセージが送られた時に、どう対処するかを書く関数が必要になります。私たちは、そのような関数の枠組みをClassWizardに書いてもらったのです。そして、その関数はOnChangeLetterという名になりました。
さて、ClassWizardに戻りましょう。ClassWizardのダイアログボックスで「コードの編集」ボタンを押してください。こうして、おぜん立てが終わり、ClassWizardが書き込み、表示してくれたOnChangeLetterの中身に実際にすべきことを書く所まで来たのです。
しかし、まだ、ちょっと準備不足です。後は、ちょっと次回(以降?)にさせてください。代わりに、 OnChageLetterの//TODOのところを消して
    MessageBox(NULL,"文字の変更は次回にしましょう","準備中",MB_OK);
と入力して、実行してください。
つまり、
void CNekoDoc::OnChangeLetter() 
{
    MessageBox(NULL,"文字の変更は次回にしましょう","準備中",MB_OK);
}
とするのです。
メニューの「文字」の「文字の変更」項目を選ぶと、上のメッセージボックスが現れるでしょう。
ちょっと嫌なところですが、MessageBoxのはじめに見慣れないNULLという引数がつきました。簡単に言うとMessageBoxという名の関数は2つあるのです。今は、引数が4つのものしか使えないので、そちらを使っているのです。この場合、一番簡単には、はじめの引数をNULLとしておくと用が足りるのです。 この詳しい説明をするとそれだけで入門1回分になるので、ここは、これで許してください。次回にはどうせ書き換えて捨ててしまうところです。
というわけで、あとは次回(以降)にしますね。

目次のページ
前のページ
後のページ