VC++5.0入門1
基礎知識 97/7/14

C++入門を読んでくれたみなさん、再び、こんにちは。C++入門は別に読んでいない方も、もちろん、こんにちは。
さて、Visual C++ 5.0(略してVC++5.0、あるいは、VC)の入門講座をはじめましょう。ここで言うVC入門とはVCを使ったMFC(マイクロソフト・ファウンデーション・クラス、マイクロソフト社が売っているウインドウズ・プログラミング(など)に使うクラス)プログラミングの入門です。そこで、まず、いろいろ言い訳からはじまります。すんません。^^;

言い訳0
「C++入門のホームページ」にはたくさんの訪問者があり、ウインドウズを使っていない方や使っていてもVCは使っていない方々からも暖かいメールをいただきました。この項目では、ウインドウズ・VC・MFCのみを扱うことになります。本当にごめんなさい。

言い訳1
C++入門の最後に「7月からVisual C++ 4.0 の入門講座をする」と書きましたが、バージョンアップがあったので、5.0を扱うことにします。ただ、そんなに高度な技までいかないと思いますので、4.0をお持ちの方は、買い替えなくても大丈夫です。慌てて買い替えると、それを使いこなす前に更なるバージョンアップがあるので、慎重にいきましょうね。(これは自分に言っているのです。)

言い訳2
C++入門に書きましたが、私はVCに詳しいわけではありません。C++については、それなりに勉強しましたし、自分の意見もあります。しかし、VC/MFCは、また、別物です。C++入門は、かなり、行き当たりばったりで書きましたが、一応の考えがあったので、読み返してみても、「そんなにはずれていない」、「まあ、バランス良くできている」などと、ちょっと、自賛してしまったりもします。しかし、VCの方は、自分で良く知らないので、そうはならないでしょう。これは、私自身が、勉強しながら書く、勉強ノートのようなものです。また、全体像がないので、どうなっていくのか、自分でもわかりません。いずれはまともな入門を書きたいと思っていますが、これは、そのようなものではない、と考えておいてくださいね。また、難しい質問には当然答えられません

言い訳3
もう読む気をなくしましたか?まだ、あるんです。実は、9月に学外某所でプログラミングを教えることになりました。とても名誉なことなのですが、そのために、自分も勉強しなくてはならないのです。つまり、少なくとも10月までは、とても忙しいのです。それで、ペースはかなりゆっくりになると思います。

以上、言い訳集でした。
言い訳集を見てまだ読み続けているみなさん、では、はじめましょうか。
今回は、まず、ウインドウズ・プログラミングの基本から入ります。「C++入門」で説明したC++こそ「本当のC++」なのですが、それは文字ベースのソフトを作ることを念頭においたものです。文字ベースでないソフト、つまり、ここでは、ウインドウズ用のソフトを作るにはちょっと工夫が要るのです。これは、「C++入門」で説明したC++を使ってもできるはずのことですが、私のような普通の人には不可能です。
普通は、ウインドウズ用にちょっと変形されたC++(本当は、ここではCと言うべき)が使われるのです。どこが、変形されているかというと、「main」という関数が無くなり、代わりに「WinMain」が使われるものです。この名前の変更以外は、「そんなに違わない」と言うこともできるのですが、実際には、文字ベースからグラフィクス・ベース(いわゆるGUI、ここでは、つまり「ウインドウズ式」という意味)になったことで、「考え方」をかなり変更しなくてはならなくなりました。この変更が、人によってはかなりシビアなものであったようです。
この新しい考え方、つまり、「ウインドウズ・プログラミングの考え方」はどうしても理解しておく必要があります。今日は、その話をしましょう。(知っている人は、ここまで読んでがっかりしました?でも、ちゃんと、表題に「基礎知識」と書きましたよね。)

「文字ベースのソフト」とは、つまり、「C++入門」でやったようなプログラムたちです。「文字ベースのソフト」と言った場合に、ポイントになるのは、実は、「文字ばかりを使っている」ということではありません。ポイントは、「プログラムが実行されている間は制御の流れが決まっている」という点です。つまり、「大魔王とヒーロー」のプログラムなどでは、プログラムは次に何をすべきかいつも知っていて、そのとおりに実行していったのです。ユーザは、プログラムに質問されたときだけ、返事を入力し、自分から突然の要求を出すことは、基本的には許されていませんでした。繰り返しますが、「文字ベース」とか「GUIでない」と言った場合のポイントはここです。
一方、GUIの場合、あるいは、(ここでは同じ意味ですが)ウインドウズ用ソフトの場合、具体的な制御の流れはどうなるかわかりません。例えば、簡単なウインドウズ付属のソフト「メモ帳」を考えます。これは、言うまでもなくエディタで、つまり字を書くためのソフトです。ですから、ユーザは、普通、字を書きます。しかし、突然、書いていたものを「保存」したり「印刷」したりしたくなるかもしれません。ウインドウズ用のソフトである「メモ帳」には、メニューという場所があって、そこをクリックすれば、作業途中でも簡単に「保存」「印刷」ができます。もちろん、「ヘルプ」を見ることもできます。
つまり、ウインドウズ用のソフトは「ユーザの気まぐれ」に常に対応できるようにしなければならないのです。実は「ユーザの気まぐれ」はもっとすごいものがあります。例えば、「メモ帳」を使っている間に、突然、別のソフト、例えば「CDプレーヤー」を起動したりするのです。
「CDプレーヤー」を起動したときに、「メモ帳」の一部に「CDプレーヤー」が重なってしまう、なんてことはよくあります。しかし、その「CDプレーヤー」の場所をずらしたり、アイコン化すれば、また、「メモ帳」が見えます。めでたし、めでたし、、、。ウインドウズに慣れてしまっている私たちには、こんなことは何でもないように思います。しかし、プログラマの立場から見ればこれは悪夢です。つまり、「誰が、いつ、メモ帳の内容を画面に、再表示しているんですか」ということです。
「CDプレーヤー」のウインドウが「メモ帳」の上に乗っている様にみえても、実際には、画面がそのように描かれているだけです。「CDプレーヤー」がアイコン化した場合、「その下から、今まで隠れていたメモ帳が現れる」ように見えるのは錯覚です。実際には、そのように画面を書き換えているだけです。(言われるまでもないことですが。^^)そうしているのは、誰なのでしょう。もちろん、第一義には、「メモ帳」を作ったプログラマがそうなるようにしたのですが、もし、プログラマが自分だけで、こんなことをするとしたら、とても大変です。実際、不可能かもしれません。というのは、たとえ、ユーザがお行儀良く、「メモ帳」を使っているときには、他のプログラムを起動したりしないようにしていたとしても、ウインドウズの画面ではいつ何が起こるかわからないからです。突然、スクリーン・セーバーが働いたり、他のプログラムが自動で起動されるかもしれないからです。
もし、「メモ帳」の作者がすべて自分でこれらのことを処理しようとすると、「CDプレーヤー」や他のソフトが「メモ帳」の上に乗ったり(そう見えるとき)、下に潜ったり(そう見えるとき)したときに、それを「メモ帳」が感じるようにしなければならなくなるのです。 どうすればよいのでしょう。ちょっと考えると難しいですね。
整理しましょう。最初は「ユーザの気まぐれ」の話をしました。次に(「ユーザの気まぐれ」の特別な例として、また、ユーザとは関係ない場合にも)、他のソフトのウインドウとの位置関係の話をしました。これらは、要するに、「自分の作っているソフトが、どうやってユーザや他のプログラムからの信号を受け取るか」という問題なのです。問題をこう言い直すと、カンのいい人は、上に挙げた例以外の例にも気が付くかもしれません。
さて、これをどうやって解決すれば良いのでしょう。ここで、ある種の発想の転換をします。画面を描き、マウスやキーボードからの信号を管理しているのは、実は、ウインドウズです。したがって、「自分の作っているソフトが、どうやってユーザや他のプログラムからの信号を受け取るか」という質問には、実は、ウインドウズを使っている限り、答えは出ているのです。答えは、「ウインドウズに任せる」です。
いわゆる文字ベースのプログラムは自分でするべきことを自分で実行していました。本当を言うと、DOSなどのOSに助けてもらっていたのですが、実際、主人公はプログラムで、OSはサポートでした。しかし、ウインドウズ上では、ウインドウズが「主役」とまで言われています。(個人的には、これは言い過ぎという気がします。ただ、イワンとしていることは正しいのです。まあ、以下を見てください。)つまり、ユーザがどこかをクリックしたり、キーボードを押したり、あるソフトのウインドウが別のウインドウを隠したり、、、はウインドウズが管理しているのです。プログラムはウインドウズの助け無しには、何もできないのです。
では、ウインドウズに助けてもらうことにして、どうすれば良いのでしょう。それは、こういうことです。ウインドウズは常に起動中のソフトを管理し、何か(クリックなど)が起これば、それを起動中のソフトに知らせるようになっているのです。これを「メッセージの送信」と言います。そこで、プログラマは「ウインドウズからのメッセージを待ち、メッセージが来たときに決まった対応をするプログラム」を書かなければならない(書けば良い)のです。
こう書くとわかると思うのですが、プログラムの構造はかなり「受け身」のものになります。いつも、ウインドウズからのメッセージを待ち、何か特別なメッセージが来たら特別な反応をする、そういう存在なのですから。文字ベースのプログラミング経験者は、このような構造や考え方になじみが無いため、かなり戸惑うようですが、こうなっているのですから、しかたありません。認めることにしましょう。
このようなプログラムははじめ(普通)Cで書かれました。ウインドウズから来るメッセージには、いろいろな種類があるはずですから、プログラムのこれを処理する部分は、長々としたswitch文です。この講座の読者はCを良く知らないかもしれませんが、Cはクラスの無いC++のようなものですから、想像してみてください。要するにswitch文なのです。
このようなプログラミング・スタイルはC++では嫌われます。というか、長々としたswitch文というものは、普通とてもやっかいで、CからC++に移行してきた人たちの多くが、移行するひとつの理由としたものなのです。
このswitch文を使うプログラムをお見せしても良いのですが、今、ちょっと根性と時間が無いので許してください。要するに、C++では、別の方法で「メッセージへの応答」を記述するのです。しかし、それには、とてつもなく大変な準備が要ります。この準備は、一度してしまえば、いつでもそれを使いまわしできるわけですが、自分で最初から「準備」を書くのは大変そうです。
そこで、例えば、マイクロソフト社はMFCというお膳立てをコンパイラと組みで販売しているのです。ボーランド社のOWL(オブジェクト・ウインドウ・ライブラリ)も同じようなものです。
私たちは、ここでは、VC/MFCを選びます。以後、マイクロソフト社のプログラマの作ったクラスを利用することになります。ただ、基本は、前述した通りです。つまり、プログラマは

「ウインドウズからのメッセージを待ち、メッセージが来たときに決まった対応をするプログラム」

を書く、ということなのです。
目次のページ
後のページ