プログラミング実習     
   VC++ 入門編 

2001年4月25日発売 412ページ
ソフトバンク クリエイティブ発行 小林健一郎著

現在は電子書籍としてダウンロード販売されています。
1470円(税込)

SBPストアのページ

本書のページ

Visual C++ 6.0 / MFCに関する書籍です。
電子書籍化に当たって、処理の都合上第2刷のデータが使われました。
そのため、「第2刷で発見された訂正」は直っていません。
このページ下をご覧になり、訂正していただくようお願い致します。m(__)m

vch.jpg (4316 バイト)

プログラミングそのものの初心者から「文字ベースならC++は完璧」という人、また、実はある程度VisualC++の経験がある人(私のホームページを読んだ人も含みます)までを対象にしたVC++/MFCプログラミングの入門書です。

特徴として、従来のオーソドックスなものではなく、

  実例をみながら直接本質に触れる

学習コースを提示しているつもりです。単なる実例集ではなく、考え方を説明しますが、実例そのものの数も豊富だと思います。なお、「C++入門のホームページ」にある「VisualC++入門」と比べると、ごく一部を除いて、説明対象等が大幅に変わっています。また、こちらはVisualC++6.0対応です。本書が製品版・完全版とお考えください。ホームページを読んだ方にとっても、ほとんどが新しいことのはずです。まあ、買ってやってください。^^)

Chapter1 Visual C++/MFCプログラミング入門
 1.1 MFCへの道程  1.2 本書を読むために

Chapter2 はじめてのVC++/MFCプログラミング
 2.1 AppWizardを使おう  2.2 4つのクラスとイベントドリブン 2.3 描画するOnDraw
 2.4 ドキュメント/ビュー構造とCArray  2.5 印刷と保存  2.6 最後に[新規作成]

Chapter3 VC++/MFCプログラミングをひとめぐり
 3.1 AppWizardやClassViewのすること  3.2 ドキュメント/ビュー構造1 ドキュメント
 3.3 ドキュメント/ビュー構造2 ビュー  3.4 著作権ダイアログの編集
 3.5 ユーザーに文字列を入力させるダイアログを作る  3.6 CInputDlgダイアログとのデータのやりとり
 3.7 メニューの編集  3.8 保存と読み込み  3.9 リソースの編集 

Chapter4 いろいろなアプリケーションのかたち
 4.1 簡易エディタを作ろう −SDIアプリケーションの例
 4.2 簡易ワープロを作ろう −MDIの例
 4.3 占いアプリケーションを作ろう −ダイアログベースの例
 4.4 簡易データベースソフトを作ろう −CFormViewの例
 4.5 簡易ナビゲータソフトを作ろう −分割ウインドウの例
 4.6 アプリケーション配布の前に...

Chapter5 描画するアプリケーション
 5.1 描画のための部品たち  5.2 図形や文字、その色  5.3 色のデータ
 5.4 ビットマップの表示  5.5 マウスでお絵描き −マウスからのメッセージ
 5.6 キーボードでお絵描き −キーボード  5.7 タイマーでお絵描き −タイマー
 5.8 マッピングモード

Chapter6 部品を組み合わせて作るアプリケーション
 6.1 ラブレター作成ソフト  6.2 入室記録ソフトの作成  6.3 アドベンチャーゲーム
 6.4 組織図作成ソフト  6.5 電子電話帳

Chapter7 もっとプログラミングを...
 7.1 スケルトンを見直す  7.2 これから...

Appendix
 A.1 初心者のためのデバッグ講座  A.2 ポインタと仮想関数について
 A.3 AppWizardを使わないMFCプログラミング

本文・カバーイラストは私もファンの唐沢なをきさんです。^^)


訂正/補足
いくつか訂正が発生しました。すみません。m(__)m
以下を参照してください。
読者の方から指摘していただいたミスプリもずいぶんあります。ありがとうございました。

第1刷で見つかったもの
(第2刷と電子書籍版では、本ページ最後の「第4.4節のMyDBに関して問題を追加p191」を除いて、訂正・補足しました。)

補足p25:
 下から2行目の「この関数」とある関数はOnLButtonDownのことです。
訂正p32:
 コラムの中で「以下に説明するように」とありますが、説明はコラムより前になっていました。「本文で説明したように」としてください。
補足p35:
 コラムの「変数」とは「CPoint変数」のことです。
補足p44:
 ここでSerializeという関数を紹介していますが、強調表示をしそこないました。しかし、とても重要な関数です。
訂正p68:
 図のドキュメント側の下の囲い(「未完成」とあるもの)の関数はOnNewDocumentではなくSerializeです。OnNewDocumentは上にありますね。
補足p123:
 「占いボタン」のIDとキャプションについてコメントがありませんでした。これは図4.3.7のようにしてほしいということだったのです。つまり、IDはIDC_URANAI、キャプションは「占い」です。
訂正p139:
 1行目の「Enterキーを押すことで終了できます」は「Escキーを押すことで終了できます」でした。

訂正p146:
 OnForwのif文の条件のところは
 if(m_num >= pDoc->m_texts.GetSize() - 1){
 のようにtextのあとにsがあって、textsが正しいのでした。

訂正p148:
 上から5行目のm\bunruiはm_bunruiです。
訂正p148:
 図は「挿入」「削除」のボタンも付けたあとのものです。この段階ではまだボタンは「<」「>」だけですね。

補足p150
 第4.4節のMyDBでは、挿入ボタンを押して内容を書き、そのまますぐに保存しようとしても、新しいメモは保存されません。これはデータがまだドキュメントに転送されていないためです。データを保存する場合は、メモを挿入し書き込んだ後に「<」か「>」のボタンを押さなければならないのでした。p150の最後に以下のような文章を入れて下さい。

「この節のMyDBでは、挿入ボタンを押して内容を書き、そのまますぐに保存しようとしても、新しいメモは保存されません。これはデータがまだドキュメントに転送されていないためです。データを保存する場合は、メモを挿入し書き込んだ後に「<」か「>」のボタンを押さなければなりません。そうすると、データがドキュメントに転送されるからです。ちょっと面倒な仕様ですが、これはコードを単純化したためです。」

「<」か「>」ボタンを押さないですますには、いくつか方法が考えられますが、どれもそれほど単純ではないと思います。一方法をこのページ下に「問題」として掲載します。

訂正p163:
 上から1行目「ここで2つのビューの間に入っているCSplitterWndというものがポイントです。」は「ここで2つのビューとフレームの間に入っているスプリットウィンドウがポイントです。」というつもりでした。
訂正p163:
 上から5行目と下から2行目の「CMyNaviFrame」は「CMainFrame」の間違いです。
訂正p259:
 問3の答えのOnRButtonDownで「CRect rc(20, 20, 200, 150);」は不要でした。消し忘れです。(あっても動作に影響はありません。)
訂正p306:
 上の表でm_textの型名がCStaticになっているのは、CStringの間違いです。
訂正p358:
 上から3行目の「CInsertDlg」は「CInputDlg」でした。

第2刷と電子書籍版では、以下が訂正になります

訂正p85の11行目
 OnInputはOnRButtonDownの間違いでした。
訂正p111のコード
 CMyEditerDocはCMyEditDocの間違いでした。
訂正p128のコード
 「今日の運命」より「今日の運勢」の方が適切でした。^^;)
補足p137:
 上から8行目の「ResourceViewでIDの...」は「ResourceViewのペインで、DialogのIDの...」という方が正確でした。
訂正p144:
 上から8行目の「num = 0;」は「m_num = 0;」でした。下のコードでは、「m_num = 0;」になっています。
訂正p178の3行目
 OnKeyDownはOnUpdateの間違いでした。
訂正p286:
 表中で、「%i」は「%j」の間違いでした。

誤記があったことをお詫びいたします。また、いろいろご指摘くださった皆様に感謝いたします。m(__)m


第4.4節のMyDBに関して問題を追加p191
問9(Serialize、4.4節)
MyDBを改良して、新しいメモを挿入後、「<」「>」のボタンを押さずに保存してもよいようにできるでしょうか。


MyDBではビューに表示されている現在のメモは、「<」「>」のボタンを押さなければドキュメントに転送されないのでした。練習用プログラムとしてはこれが単純でよいと思うのですが、気になるかも知れません。これを改良するには、たとえば、次のような方法があります。まず、ドキュメントのSerializeを次のように書き換えます。

void CMyDBDoc::Serialize(CArchive& ar)
{
    if (ar.IsStoring())
    {
        CMyDBView* pV = (CMyDBView*)m_viewList.GetHead();
        pV->UpdateData();
        m_bunruis[pV->m_num] = pV->m_bunrui;
        m_texts[pV->m_num] = pV->m_text;
    }
    else
    {
    }
    m_bunruis.Serialize(ar);
    m_texts.Serialize(ar);
}

if文の最初のブロック内にコードを書き足したのですが、ここは「保存時のコードを書く場所」でした。そこでまずpVをビューへのポインタとし(p111のコラム参照)、UpdateDataでフォームビューのコントロールのデータをビューに転送し、それらビューのデータを最後の2行でドキュメントのCArrayのm_num番に代入しているのです。
ただし、このままコンパイルするとエラーになります。まず、これはドキュメントのcppファイルなのに、CMyDBViewというクラスを使っています。このクラスを使えるようにするためには、このファイルの上の方(#include "MyDBDoc.h"の下あたり)に、

#include "MyDBView.h"

と書く必要があります。さらに、ビューのm_numはビューのpublicなメンバではなかった(p143のコラムを参照、またこういうメンバをprivateメンバと言います)ので、これでもまだドキュメントのクラス内でこの変数を使えません。これを使えるようにするためには、MyDBView.hのCMyDBViewのm_numをpublic:の下に移すか、あるいはその上に、「friend class CMyDBDoc;」を書き、

class CMyDBView : public CFormView
{
friend class CMyDBDoc;
    int m_num;
...

とします。m_numをpublic:の下に置けばどこでも使えるようになりますし、friendを使えばpublic:の下でなくてもCMyDBDocの中で使えるようになるのです。


本書の出版・電子化において、ソフトバンクパブリッシングの瀧澤尊子氏に大変お世話になりました。ここに感謝致します。