VC++ を使用したアプリ作成(VC++6.0)

ちょっとMFCの勉強をかねてアプリケーションを作成してみます。 勉強と言うことで、色々な要素を詰め込んでいく予定ですので、 「こんなのやってみない」っていうのがあれば、お知らせください。 暇があればやりたいです。

お題は 計算テストツールううう

機能予定


現在の予定では、画面に小学生低学年を対象とした足し算引き算を表示し、 解答欄を設けます。できたボタンで答えあわせを行うというのが、第一の 目標。学校での使用を考えて通信で問題を受け取り、それを表示、終了したら 通信で先生に解答を送るという機能も考えています。

プロジェクトスケルトン
まずUtilプロジェクトを選択して、Learnプロジェクトを作成します。 仮にVC++5.0の場合はワークスペースタブにあるブランクワークスペース を使用してもいいでしょう。ここでしたいのは、一つのワークスペース から複数のプロジェクトを参照できるようにしたいだけです。 今回のように同じ物の場合には一つのワークスペースにする必要は 特に無いのですが、たとえば、複数のプログラム(exe,dll)を使用した アプリケーションを作成している場合に便利です。 このプロジェクトを元に開発を進めます。
こんな感じ
Learn ┬─no1 (MFCが勝手に作成したテンプレート)
      ├─no2 
       ....
画面イメージを考えながらプロジェクトを作成します。

Learnプロジェクトからプロジェクト->プロジェクトへ追加->新規作成 を選択してMFC AppWizard(exe)を作成します。

ステップ4の詳細設定にて
拡張子 tst
スタイル ウィンドウ分割
他はデフォルト
これを no1プロジェクト とします。 まだ何もしていませんね...(^^ゞ
一応ビルドすれば何もしない画面が表示されます。(^^ゞ

第一歩(2つのView作成)

まずは試験問題を表示する部分と、その他経過時間とか、 ヒントなどの表示をする部分を作成します。 スケルトンで既にウィンドウ分割を指定しているので、 デフォルトで、スプリットウィンドウが作成されていますので、 これを使用します。
  1. 2つのViewを作成する
    まず挿入メニューからクラスの作成を選択する。 左のペインには現在の状態や、ヒントなどを表示する 右のペインは試験問題を表示するので、左にCViewから の派生クラスCStatusView、左にCFormViewからの派生クラス CTestViewを作成する
    ちなみにクラスの種類は、CViewはMFCクラス、CFormViewはFormクラス となっている
  2. Viewの割り当て
    CMainFrm.cppを開いてCStatusViewとCTestViewを使用するために それぞれのヘッダファイルをインクルードします。

    それで、既に存在するCMainFrmクラスのメンバ関数OnCreateClient を変更します。
    return m_wndSplitter.Create( this,
    の部分を
    BOOL rc=m_wndSplitter.CreateStatic( this,
    と変更して、常にViewを表示するようにします。

    この場合、CreateとCreateStaticのパラメータが異なりますので ヘルプを確認しましょう。

    あとはm_wndSplitterのメンバ関数であるCreateView で、ペインを作成するという順番です CreateViewのパラメータのペイン番号は気をつけましょう。 0から始まります。

    また、Viewを作成するときに間違ってもCMainFrmのメンバとして 上記の2つのViewを定義しないこと

    下記の式が重要です。
    CRuntimeClass* pStatusView = RUNTIME_CLASS(CStatusView);

    ちなみにCViewの派生ではなくCWndの派生を使用することも 可能ですが、いろいろと面倒ですのでおとなしくCViewを使用 しましょう。

  3. その他
    また、なぜかCTestViewを挿入したときに CSingleDocTemplate* pNewDocTemplate = new CSingleDocTemplate( なんて行が挿入されてしまい、起動時にCTestViewとどちらを起動 するかなんて聞かれてしまいました。

    ふーむ、なぜこの行が追加されたのだろう

とりあえず、これで2つのViewが表示できました。
これを no2プロジェクト とします。

自習モードの作成

まず、問題や解答をどのようなデータ構造として持つかを考える為に 手っ取り早く、プログラム内部で問題を生成するという形(自習モード) の作成を行う。
  1. 式生成クラスの作成
    色々な難易度の式を作成する事を考えて、式生成クラスの抽象クラス(CExpGen) を導入します。そして、そのクラスからの派生クラスとして0から10までの 足し算式生成クラス(CLv1EG)の作成を行います。
  2. 式生成と表示
    問題を解き始めるタイミングとして、「はじめる」ボタン、解き終えた時の為に 「おえる」ボタンを追加する。
    CBeginDocクラスに、メソッドStart,Endを追加し、Viewからの要求に対応 できるようにする。両メソッドは共にUpdateAllViewsを呼び出す為、 ViewのOnUpdateにより、ドキュメントの準備ができたことを知り、処理し始める ことができる。これは2つのViewがあり、両方のViewがそのイベントを知る必要 があるからです。

    式の生成はStartメソッドの内部で行い、表示は、CTestViewのOnUpdateにて 行う。またCStatusViewではOnUpdateにて経過時間を表示し始める。

とりあえず、問題を表示するだけは、できるようになりました。(^^ゞ
これを no3プロジェクト とします。

自習モード−答えあわせ

ちょっとオーバースペックではあるが、答えあわせ用として逆ボーランド記法を使用した計算クラス(CRBExpression) の導入を行う。そして解答状態に応じて見た目を変更した。まあ逆ボーランド用クラスくらいで対した特徴はないですね。

とりあえず、一応の完成という感じですかね。(^o^)
これを no4プロジェクト とします。

さて、ここまで来てちょっと寄り道モードに入りま〜す ここから寄り道

Top