第69回 プログラミングについて『C++』

これまではWindows用のプログラムの話は一度しないで、基本的な事ばかりを
してきました。できる限りOSに依存しない部分の話をしてきましたが、やはり最近の
流行はWindowsですので、これからは少しずつでもWindowsの話をしてい
きます。
Windowsのプログラムの話をするにあたって、私が使っているコンパイラはマ
イクロソフトのVisual C++で、このクラスライブラリを使っていますので、
違うコンパイラを使っている方には少し話が合わないかも知れません。もっとも、私は
他のコンパイラの事は知らないのでどこがどう違うのかはサッパリ分かりませんので、
了承して下さい。
私がパソコン用のコンパイラを買ったのは4年程前のことでした。パソコンのことな
ど何も知らなかった私は、以前の会社のコンピュータの達人のY氏にお願いして、秋葉
原に一緒に行ってもらいました。秋葉原自体は学生時代に電子部品を購入する目的で毎
週の様に行っていましたので初めてではなかったのですが、結婚してからは殆ど行くこ
ともなく街の変化に驚いたものでした。学生時代というと20年近くも昔のことで、そ
の当時は、パソコンなどという代物を扱っている店は数店しかありませんでした。
C言語のコンパイラを選ぶときY氏に相談すると、『OSがマイクロソフトのDOS
だから、コンパイラもマイクロソフトのものが多分相性がいいよ!』と言うので、素直
にその意見に賛成しました。考えてみればボーランドのものなどはすごく安くて魅力的
だったのですが、とにかく先輩の意見は大切にしなければなりません。そこで、マイク
ロソフトのコンパイラというと、Quick C、Micro Soft C、Mic
ro Soft C/C++ V7.0 の3つのうちの1つを選ばなければならない
ことになりました(Visual C++なんてなかった時代です)。
そこでY氏に、『どれを選ぶ?』と聞かれました。私はどれでもいいような気がした
のですが、会社の先輩のS氏が『これからはC++の時代だよ!』と言っていたのを思
い出し、『やっぱりC++だよ!』と安易に決めてしまったのです。もしたすると、S
氏はFORTRANしか知らない私を馬鹿にして、『俺はCもC++も知っているんだ
ぞ』と自慢するつもりだったような気もしますが、私は、『なるほどこれからはC++
なのかあ』と感心してしまったのです。その当時CもC++も知らなかった私は、原始
人が現代人に『スーツは食べるとおいしいぞ!』と言われて、『そうかあスーツはおい
しんだ』と感心するのと同じだったのでした。
こうして Quick Cならば2万円も出せば買えるのに、定価で10万円もする
コンパイラを買ってしまったのです。ところが実際にはC++は知らない上、C++を
どうやってコンパイルするかも分からず(ファイルの拡張子をcppにすればいいと知
ったのは数年後のことでした)、もっぱらCしか使わなかったので、高い買い物をした
ものだと、ため息が出る思いでした。
その後、数年の間はWindowsのソフトには手を付けなかったのです。実は、こ
のコンパイラとクラスライブラリではWindowsのソフトを作れるとは思ってもい
なかったのです。分厚いマニュアルも『訳の分からないことをいっぱい書いてあるなあ』
といったぐらいに考えていて、パラパラとめくった程度で放っておいたのでした。
VAX/VMSから離れた後は、UNIXとDOS上(殆どはUNIX)でプログラ
ムを書いていたのですが、ちょっとしたきっかけがWindowsのプログラムを書か
せることになったのでした。私の会社は基板設計を主業務にしていて、得意先が結構離
れた場所にあったのです。当然出来上がった図面は車で運ぶことになるのですが、これ
が往復3時間もかかってしまうのです。そこで、なんとか図面を運ばずにデータを転送
するだけで済まないものかということになったのでした。私はグラフィック端末を使っ
たものと、Xウインドウを使ったものしか経験がなかったので当初はXウインドウ上で
動作するものを考えていたのですが、先方の希望がパソコンでなんとかならないかとい
うことだったのです。ということは、DOSかWindowsのどちらかになるわけで
、どっちも経験がないのでした。
DOSでやるとなると、メモリーの問題が絡んできます。どう考えても基板のデータ
というのは機械図とは違ってラインの数が10万本といった大量なデータ数になってし
まいます。これではプログラムを書くのは非常に辛いことは明らかですので、残るはW
indowsしかありません。そこで、長い間使っていなかったコンパイラのマニュア
ルを引っ張り出してきて読んでみると、確かにそこにはグラフィックに関する説明があ
りました。
本当に自分が持っているコンパイラでWindowsのプログラムが書けるのか半信
半疑でパソコンに向かうことになりました。とにかく何も分からないのでサンプルプロ
グラムを研究することにしました。一番簡単そうな『Hello World!』です。
確かにこのサンプルをコンパイルして実行するとウインドウが開いてHello
Worldの文字を表示するのです。ところがプログラムを見ても殆ど理解できないの
です。C++で書いてあるので、C++のことを何もしらない私は『変な言語だな』と
感じるぐらいで、とにかくチンプンカンプンだったのです。
こういうときには初心に戻ることが肝心です。私はC++の本を買い込んできて、そ
れを勉強することにしました。Cを勉強したときには『ふうーん、そうなのね』という
程度で理解できたのですが(ポインタは理解するのに苦しみましたが)、C++はそう
いう訳にはいきませんでした。クラスとか継承とか、やたらと新しい単語が出てくるの
でこの言葉を理解するのが大変でした。
どうやらこうやらC++をある程度理解した頃には2週間程も経っていました。その
間にもサンプル『Hello World』を理解すべく努力していたのですが、自力
でウインドウを開いてそこに文字が書けるようになるまで3週間もかかってしまいまし
た。
C++を理解することも大変なのですが、Windowsのプログラミングを理解す
ることも非常に苦労します。とにかくクラスや関数がトラック何台分もあるので、自分
の希望するものを探すのでも何日もかかってしまうことがあるくらいです。メモリーに
関しては、Windows3.1では面倒でしたが、Windows95ではポインタ
にnearとかfarの区別がなくなったので、非常に楽になっています。
Windowsのアプリケーションプログラムはメッセージ駆動で動作します。ちょ
っと分かりずらい言葉ですがあまり難しいものではありません。Windows上では
アプリケーションプログラムの『ウインドウのサイズが変更された』『マウスが移動し
た』『ボタンが押された』『アイコンになった』などといったことが次々に起こります
。これらのイベントをWindowsは適切にそのイベントを受け取るべきアプリケー
ションプログラムにメッセージとして教えます。アプリケーションプログラムはWin
dowsから受け取ったメッセージを適切に処理していくことになります。このような
動作をメッセージ駆動方式を呼びます。
*これからは Visual C++ と MFCクラスライブラリ上の話になります*
Windowsのアプリケーションプログラムには、ボタンとかスライドバーとか
エディットボックスなど色々な要素がありますが、これらのものはすべてウィンドウな
のです。MFCクラスライブラリにはウインドウの基本クラスに CWnd というクラ
スがあります。ボタンはこのクラスから派生したもので、基本的には CWnd の機能
の殆どを継承しています。このことを知っておくことはWindowsのアプリケーシ
ョンを作るときに非常に大切です。Visual C++ のクラスライブラリのヘルプ
には必ずこの派生関係が記述されています。
例えば、ボタンのクラスである CButton は、
CObject
└CCmdTarget
└CWnd
└CButton
と記述されています。ということは、CButtonはCWndから派生したクラス、
CWndはCCmdTargetから派生したクラス、CCmdTargetはCOb
jectから派生したクラスあることが分かります。ですので、CButtonのクラ
スメンバーには10種類程度のものがありますが、実際にはCButtonの基本クラ
ス(例えばCWnd)のクラスメンバーもCButtonのクラスメンバーなのです。
この派生のことすら知らなかったときには、コンパイラのマニュアルを見ても、殆ど
何にも書いていないので呆然としたことがありました。例えば、CClientDCの
ヘルプを見てみると、このクラスのメンバー関数はコンストラクタ1つしかありません
。これでは何もできないクラスのような気がするのですが、このクラスは、
CObject
└CDC
└CClientDC
のように派生していますので、CDCのヘルプをみると山ほどのメンバー関数があるの
です。ですので、CClientDCのコンストラクタ以外、このメンバーのすべてが
メンバーであるということなのです。
またCButtonから新しいクラスを自分で派生させることも可能です。通常では
CButtonから派生させることは滅多にありませんが、CWndから派生させるこ
とはかなりあります。というよりも、WindowsのアプリケーションはCWndか
ら派生させたクラスを使用しなければならないので、絶対に一度はCWndから新しい
クラスを派生させることになるのです。
Windowsのプログラムの基本型は、CWinappというクラスのオブジェク
トを1つ持ち、CWinappがCWndクラスから派生させたオブジェクトを1つ持
ちます。CWinappはC言語でのmain関数に相当する部分と考えて下さい。
Windowsは各種のメッセージをこのCWinappに転送します。CWinap
pはそのメッセージを適切にCWndから派生したオブジェクトに転送します。転送先
はボタンの場合もあれば、エディットボックスの場合もあります。もしボタンだったと
すると、ボタンは押されたというメッセージを受け取ったときには、そのボタンの親ウ
インドウにコマンドが発生したというメッセージを送ることになります。Window
sのアプリケーション内ではこのように色々なメッセージが行き来していますので、結
構このメッセージの発生するタイミングが希望するものと違っていたりして苦労するこ
ともあります。
通常WindowsのプログラムにはC++のソースファイルの他に、リソースファ
イルが必要です。私は、Visual C++に付いているテキストエディタは使って
いないので、ソースコードは自作のテキストエディタJUMを使い、ダイアログやアイ
コンなどはVisual C++のエディタを使ってリソースファイルを作成していま
す。リソースファイルもバイナリのものではなくテキスト形式のRCファイルで、この
ファイルをRCコマンド(プログラム)でRESファイルに変換してリンク時に合体さ
せるようにしています。このあたりが古い人間の限界というところでしょうか。本当な
らば、すべてをVisual C++の開発環境内で行なってスマートにデバッグも出
来るのかも知れないのですが、どうしても自分の肌に合わない部分があるのです。
最後に、Windowsのプログラム(GUIのプログラム)はDOSのような文字
だけのプログラムに比べて見た目には高級に見えるものです。特に見た目にこだわった
ものでは、それだけに惑わされて『すごいプログラムだ!』などと思い込んでしまいが
ちです。私の書いたWindows用のプログラムが見た目には全然面白くないからと
いう理由で言い訳をしているのでは決してありません。
当然のことですが、GUIのプログラムはプログラムの機能以外に画面の工夫をしな
ければならないというそれまでになかった配慮が必要です。しかしながらそればかりに
力を入れ過ぎたプログラムが驚くほど多いのが現状のようです。基本的にプログラムは
道具ですので機能が最も重要な要素です。GUIの部分の使い勝手も機能です。それを
履き違えて美しい(ときにはくどいくらいに)けれども、使いずらいプログラムという
ものは歓迎できるものではありません。
綺麗な彫刻がされているけれども切れない包丁や時間が正確ではない時計。スタイル
はいいけれどもエンストする車。綺麗な色だけれどもすぐ破れるシャツ(これはこれで
嬉しいこともありますが)、美しいけれども性格の悪い女性(これも話は別かな)。考
えていくと限りがありませんが、見た目だけでごまかすようなものが世の中にはたくさ
んあります。逆に言うと機能が悪いから見た目でこまかしているものが多いのです。
Windowsのプログラムといっても基本的にはCUIのプログラムの延長上にあ
るものだということを忘れないようにして下さい。Windowsのプログラムが書け
たからと言って決して偉い訳ではありませんので、プログラムの内容によってはDOS
画面で動くものの方が便利なものはWindowsにこだわる必要はありません。多分
Windows用のプログラムでなければならないプログラムはそうでないものと比べ
ると非常に少ないはずです。
今回はWindowsのプログラムについて思い付くままにお話しましたが、次回か
らは実際のプログラムの話をしていきます。C++言語そのものについての話も織り込
んでする予定ですが、できれば努力して自習もして下さい。では、また次回。