[[BORLAND C++]]
INDEX
Section.5 StepUp
Section.4まで読んで来て、これでWindowsのプログラムは完璧!と思う人は居ないだろう。まず、サンプルが実用的では無いし、Windowを開いて何かを表示させるだけのプログラムだったら、ユーザインタフェースもへったくれも無いのだ。何より、オブジェクト指向云々をあれだけ御丁寧に書いたにも関わらず、C++らしい書き方が一つも出てこない事に気付かれた方も多いだろう。Visual C++辺りを使っていると、この時点で、既にCFrameWindowを継承した、CMyWindowなどと言うクラスが作成されているのだろうが…正直な所、このクラスが、何をどうしているのかを理解出来ている人は少ないのでは無いだろうか?ちと、オブジェクト指向の思想からはズレるのだが、基本的な所を掘り下げていく…全てを理解してから先に進もうとすると、結局C言語になってしまうので、仕方ないのだ。オブジェクト化についても、次のセクション辺りから書こうとは思っている。その前に、少々実用的な方向に、サンプルの方向を向けておく必要が有ると思った所である。実は、現時点で、業務上での実用化は、こちらの文書が滞るのとは裏腹に、かなり進行していて、幾つかは、実験室でも実用的に使えるツールも作成しているのだが、技術的守秘義務というのが有って、なかなか、そのままを公開する事は出来ないのである。そこで、ここでは必要となるであろう基本的な技術を中心に書いて、あとは、ユーザ自身のアイデアで、それらを組み合わせて、有る程度のアプリが出来る様になるまで、書いていく事にしたい。

  • 電卓の設計
    まず、当たり障りの無い所から、電卓などはどうだろう?Windowsには、結構優秀な電卓が付属しているので、「要らない!」という方も多いと思うが、造ってみると、色々な部品の使い方が見えてくるのでは無いだろうか?

  • パネルの設計(ボタンとスタティックの配置)
    この辺は、いわゆるVisual環境の得意分野って事になるだろう,ボタンの配置などは、お絵かきの感覚で書けば位置決めは完了である。しかしながら、BC++にはこの様な環境が用意されていないので、手書きで設計するしか無いのである。何処かに、この辺りの座標設計用エディタでも落ちていれば別だが、検索しても見つからなかったので、手間を掛ける事にした。まぁ、手間を掛けた分,プログラムへの理解は深まると思うし、逆に、Visual環境に慣れてしまったユーザが、いざ、その様な環境の無い所で開発を行う事になった場合、手も足も出ないという事はあり得る事なので、ここでは最も原始的な方法を採るのである。(何か言い訳じみてきたな…実は金掛けたくないだけ)
    後の項で紹介するつもりであるが、もっと簡単にWindowsのGUIを実現する方法として、ダイヤログを利用する方法が有るが、もし、ダイヤログで事足りる様なアプリを造る場合で、この辺の設計時間の短縮を狙うのであれば、こちらのダイヤログエディタは開発言語の支援ツールとして独立して提供されていたりするので、互換性の有るダイヤログエディタを探して来て使うなどして、積極的に取り入れる方法も有る。
    何はともあれ、パネルの配置は次の様に考えてみた。
    12345
    (HTMLでは表現に限界が有るので、ボタンは、もう少し密集させるつもりであるが…)
    これを、どの様にして、Windowフレーム上の座標に配置するかであるが、一番簡単なのは、画面のハードコピーを作成し、ペイントブラシに貼り付けて、座標を計るという方法である。Windowフレームの左上を座標(x=0,y=0)として、ドット毎に、区切りの良いところで座標を割り当てれば良いと思う。とりあえず、ダイヤログエディタ等が無い分、この辺りまでは前準備としてやっておこう。

  • ボタンとスタティックのメッセージID定義
    このメッセージIDについては、リソースでは無いので、RESOURCE.hに定義するのは場違いであるが、メッセージID割り当ての管理が楽なので、RESOURCE.hに他のメッセージIDと同様に宣言する。(但し、リソース以外であるという事は忘れない様に!)ボタンは0〜9,C(クリア),+,−,*,/,=の16個、数値の表示用スタティックが1個の計17個を定義する。スタティックには、イベントで起動するという動作は伴わないが、スタティックを作成する段階で、必要になるので、必ず宣言しなければならない。
    #define IDM_DISP 201
    #define IDM_BTN7 202
    #define IDM_BTN8 203
    #define IDM_BTN9 204

    #define IDM_BTNS 217


  • 実際のボタンとスタティックを作成
    後述,ソースの説明に記述する様に、CreateWindowを使用して、ボタンとスタティックを、開いたWindowフレーム上に配置する。また、リソースについては、手間を省く為に、ほぼ前回までと同様とした。

    ソースのダウンロード
    ↑試してみたい人は、ここからダウンロード

  • コンパイルの方法及び実行
    基本的に前回までの方法と同様に、
    MAKE
    を実行すれば良い。BC PADを使っている場合は、該当フォルダで何れかのファイルを読み込んで、[実行]→[make]を実行すれば良い。
    問題無ければ、test003.exeが生成される筈である。

    尚、このサンプル電卓はサンプルであり、内部のプログラム自体は、しごく手抜きで造っているので、実際の電卓としては実用に耐えないと思う。123+234程度の計算を実行してみて、動作する事を確認してほしい。

  • ソースの説明
    基本的な所は前回までに説明しているので、要点だけ説明する。
    ボタンとスタティックの配置は、親Windowの生成時に使用した時と同じ、CreateWindow()関数を使用して行う。但し、ボタンやスタティックは、最初に開いたWindowフレームの子Windowであるので、必ず、WS_CHILDの属性を付加する事。
    CreateWindowの引数は、
    HWND CreateWindow(
      LPCTSTR lpClassName, … 使用する部品クラス名(BUTTON,STATIC等)
      LPCTSTR lpWindowName, … 名前(ボタン,スタティックであれば表示する文字列)
      DWORD dwStyle, … 属性(必ずWS_CHILDを含む)
      int x, … 開始座標X
      int y, … 開始座標Y
      int nWidth, … 幅(ドット数)
      int nHeight, … 高さ(ドット数)
      HWND hWndParent, … 親Windowのハンドル
      HMENU hMenu, … 子Windowの場合は、メッセージID
      HANDLE hInstance, … アプリのインスタンス
      LPVOID lpParam  … 依然不明
      );

    である。STATICの様に、後から表示する文字列を変える必要のある部品については、HWND型の変数に、作成した部品へのハンドルを受けて保存しておき、イベント発生時に、これを使用して文字列を書き換える操作が必要になる。

    これを、必要な個数呼べば、ボタンとスタティックの配置は完了である…なんとも簡単である。今回は、ボタンとスタティックしか使用していないが、lpClassNameを指定すれば、
    COMBOBOX コンボ・ボックス(リストボックスとエディット)
    EDIT エディット(テキストを入力するBOX,エディタのクライアント)
    LISTBOX リストボックス
    MDICLIENT MDIのクライアント
    SCROLLBAR スクロールバー
    等を生成し、使用する事が出来る。

    さて、ボタンを押されたイベントのハンドルであるが、WndProc関数の中に、場合分けして記述すれば良い。注意すべきは、これらのイベントは、リソース同様、WM_COMMANDの第1引数として渡されるので、MENU等と同様に評価して使用する必要がある点である。

サンプルのソースコード
今回以降は割愛…ダウンロードして参照下さい。
2002/04/15
HomeSweetHome2
Ozzy's Software