M icrosoft 基本クラスライプラリ アプリケーションフレームワーク 本章では、 Microsoft 基本クラスライプラリバージョン 2.0 ( あるいは単にクラスライプラリ ) ア プリケーションフレームワークの利点を紹介する。アプリケーションフレームワークのプログラミ ングがどのようなものかを完全に理解するのを助けるために、最初に、余計な部分はすべて取り除 いてあるが完全に動作する Windows 用のクラスライプラリプログラムを示す。こでは理屈は最 小限に押さえているが、メッセージマッピングとドキュメントービューの節は、以降の章で役立つ重 要な情報を例と共に収めている。 なせアプリケ - ションフレームワークを使うのか ? Windows 用アプリケーションを開発するにあたっては、ます開発環境を選ばなければならない。 たとえば Microsoft VisuaI Basic のような対話的な環境という選択肢を除くとすると、以下の選 択肢から選ばなければならない。 ・努力して目的にたどり着く Windows SDK ( ソフトウェア開発キット ) ・新しい Micorsoft 基本クラスライプラリアプリケーションフレームワーク ・ BorIand の Object Windows Library (OWL) など、その他の Windows をベースとするアプリ んでいる。どれが楽だろうか ? WindowsSDK のプログラマであるのなら、 もし読者がゼロから始めるのであれば、 ケーションフレームワーク Microsoft Press の編集者は、本章をマーケティング資料のように公正なものにする必要はない クラスライプラリについては、その苦労は途中まで済 どの選択にしても相当な努力が必要である。すでに クラスライプラリバージョン 2.0 は C 十十 Microsoft Windows API である。 以下は筆者が見たこのクラスライプラリの利点である。 待ち続けていたアプリケーション開発環境なのである。 といってくれたが、救いにはならなかった。筆者はこの製品に熱中している。これは私が 10 年間も 39 この前提を受け入れ
ームワークの基本 PART 1 Windows 、 Visual C 十十、 0 学習効率 アプリケー ションフレ こまでに並べた利点はすばらしく聞こえないだろうか ? しかし読者はたぶん、「実際にやって 42 アプリケーションフレームワークは、いわゆる一般的なクラスライプラリのスーパーセットであ に個々のクラスライプラリの設計に依存する。 生成し、またあるときは自分独自のクラスを派生させる。どのような利用形態となるかは、ひとえ 接続上でのデータ転送をサポートする。あるときは提供されているクラスから直接オプジェクトを ラスライプラリは、行列に関係する共通の算術演算を実行し、通信クラスライプラリは、シリアル した C 十十クラスのセットであり、アプリケーション内で使用することができる。たとえば行列ク ソフトウェア会社から販売され、そしてさらに、社内で開発されている。クラスライプラリは関連 である。いくつかのクラスライプラリが C 十十コンパイラと共に提供され、またサードバーティの C 十十がポピュラーな言語である理由のひとつは、クラスライプラリを「拡張できる」ということ 0 アプリケーションフレームワーク対クラスライプラリ は、読者が習熟するためのいい出発点である。 ら、この本の残りの部分を読まなければならない。本章内のアプリケーションフレームワークの例 便な定義とはいえないだろう。アプリケーションフレームワークが何なのかを本当に知りたいのな すべてのものを提供する、オプジェクト指向ソフトウェア要素の統合的な集合体」である。これは簡 アプリケーションフレームワークの定義のひとつは、「一般的なアプリケーションに必要とされる アプリケーションフレームワークとは何か ? リプログラマが高給を強く要求できることを保証する。 クラスライプラリの学習効率は、アプリケーションフレームワークの威力により、クラスライプラ プログラマはほかのプログラマより高い給料を要求しており、これからもこの状況は続くだろう。 クラスライプラリは、実際の Windows プログラミングの量を減らすものではない。通常、 Windows した後ならばだ。 プログラミングの習得を簡単にするといえる。そう、一度オプジェクト指向プログラミングを理解 身の経験によれば、オプジェクト指向のアプリケーションフレームワークは、 Windows のための マが学ばなければならない多くのプログラミング上の詳細を回避できるということである。筆者自 クラスライプラリはどうしてより多くを提供できるのか ? ひとつは、 Windows SDK プログラ SDK だけを学ぶ時間に近いものだ。 に作れるようになるまでに、少なくとも 6 ヶ月はかかるだろう。興味深いことに、これは Windows もし、 C 十十、 Windows 、クラスライプラリのすべてを同時に学ばなければならないのなら、実際 ムワークを効果的に使用するには、これをすっかり学ばなければならず、それには時間がかかる。 みて理解しなければ何も変わらない」と考えるだろう。そう、その通り。アプリケーションフレー
PART 3 ドキュメントーピューアーキテクチャ なクラスに S げ / た召という名前のメンバ関数が用意されている。アプリケーションフレームワーク が、たとえば CS 厩クラスのオプジェクトというような個々のオプジェクト用に S げ〃記を呼 び出したとき、生徒のデータはディスクに保存されるか、あるいはディスクから読み込まれる。 クラスライプラリ中において、シリアライズはデータベース管理システムに代わるものではない。 ドキュメントに関連するすべてのオプジェクトは、ひとつのディスクファイルにシーケンシャルに 読み書きされる。ランダムディスクファイルアドレスで、個々のオプジェクトにアクセスすること はできない。アプリケーション中でデータベース機能が必要な場合は、 Microsoft Open Databese Connectivity(ODBC) ソフトウェアの使用を考慮することになる。第 24 章は、 ODBC をどのよう にクラスライプラリアプリケーションフレームワークと共に使うかを示している。 0 ティスクファイルとアーカイプ S げ / た e はデータの読み込みなのか書き込みなのかをどのように知るのか ? S 夜〃託はどのよ うにディスクファイルに結び付けられるのか ? クラスライプラリでは、ディスクファイルは CFile ク ラスのオプジェクトにより表現されている。 CFile オプジェクトは、 C の実行時関数ー 0 カ劭を介し て得られるファイルハンドルをカプセル化する。これは面加〃の呼び出しで得られるバッファ付き の FILE ポインタではなく、バイナリファイルのハンドルである。このファイルハンドルは一 4 ー厖、一なん呼び出しのために、アプリケーションフレームワークにより使用される。 アプリケーションが直接にディスク I/O を行なわす、代わりにシリアライズ処理に頼る場合は、 CFile オプジェクトの直接的な使用を避けることができる。 Figure16 ー 1 に示すように、 S げ〃託関 数と CFiIe オプジェクトの間に 存続ドキュメン 、 = トオブジェクト , Serialize Serialize 関数は [ ファイル ] の [ 開 く ] と [ 上書き保存 ] の処理中にア プリケーションフレームワークから 呼び出される。 ( C. 尾怩クラスの ) アーカイブオプジェクトが存在する。 CArchive オプジェクト CFiIe オブジェクト Figure16-1 314 シリアライズ処理
25 章オプジェクトのリンクと埋め込み (OLE) が起動したときに作成されたひとつの埋め込みドキュメントオプジェクトを収めている。 MDI アプ リケーションでは、各 0 C 4 D “コールバックで新しい CO ん S げ怩アのオプジェクトを作成し なければならない ( 注 : フルサーバーで CO 阨襯が 4 & げクラスを使っている場合、アプリケー ションフレームワークがドキュメントボインタを管理する。それゆえ 0 〃 C 尾〃 D をオーバーラ イドする必要はない ) 。 サーバーの OnEd / の oc コールバックの処理 クライアントプログラムが既存の埋め込みアイテムを編集したときには、アプリケーションフレー ムワークが CO ん S の 7 ) げの仮想関数 0 E ″ D を呼び出す。サーバーでは、 CO 立れ盟の“オプ ジェクトへのポインタを返すように、 0 E 市の関数をオーバーライドしなければならない。 SDI サーバーアプリケーションでは、派生されたサーバーオプジェクトは、ひとつの埋め込みドキュメン トオプジェクトを収める。 MDI アプリケーションでは、アイテムの名前を既存の CO & げ〃“オ プジェクトに一致させなければならない ( 注 : フルサーバーで CO ん襯が〃 & 尾げクラスを使ってい る場合、アプリケーションフレームワークがドキュメントボインタを管理する。それゆえ 0 〃 E 市 / 〃 0 じ をオーバーライドする必要はない ) 。 サーバーの OnOpenDoc コールバックの処理 クライアントプログラム ( フルサーバー ) が既存のリンクされたアイテムをオープンするとき、ア プリケーションフレームワークは CO ん S げ怩 % の仮想関数 0 0 カ D “を呼び出す。サーバーでは、 CO ん S げ怩 7 の“オプジェクトへのポインタを返し、指定された名前のファイルをオープンするように 0 〃 0 加 D 関数をオーバーライドしなければならない ( 注 : フルサーバーで CO 襯が〃立げク クトへのポインタを返すように 0 Ge 襯厖 d 虎襯をオーバーライドしなければならない。埋 の 0 C 尾 4 D “と 0 E 市の“関数の直後に呼び出す。サーバーでは、 CO ん S の眦 e 襯オプジェ アプリケーションフレームワークは、 CO ん & 尾げの 0 Ge 襯わ襯関数を、 CO & サーバードキュメントの OnGetEmbeddedltem コールバックの処理 れゆえ 0 〃 0 カ Do じをオーバーライドする必要はない ) 。 ラスを使っている場合、アプリケーションフレームワークはドキュメントボインタを管理する。そ 541 バーライドする必要がある。アイテム名は 0 G ビ既切襯にパラメータとして渡される。 ポインタを返している。独自の方法でアイテムの格納と取得を行なう場合にのみ、この関数をオー ん〃の実装は、自分のリストからリンクされたアイテムを検索し、要求されたアイテムへの フルサーバーのみが、リンクされたアイテムをサポートする。 CO ん S のマ盟の“クラスの 072G サーバードキュメントの OnGe 他 / nked ″ em コールバックの処理 持つ。 め込みアイテムでは、各 CO & げ D オプジェクトはひとつの CO ん S げ怩以襯オプジェクトを
13 章 ツールバーとステータスパー こまでの Visual C 十十の例はすべてツールバーとステータスパーを含んでいた。 AppWizard のデフォノレトオプションの [ ツーノレノヾ ー ] を受理している限り、 AppWizard はこれらを初期化するア プリケーションフレームワークのコード要素を生成する。デフォルトツールバーは、標準アプリケー ションフレームワークのメニュー選択と等価なグラフィックスポタンをいくつか提供し、デフォル トステータスパーは、メニュープロンプトをキーポードの状態インジケータ CAP 、 NUM 、 SCRL と共に表示する ( 訳注 : 日本語版では、カナロックの状態も表示される。 AppWizard により生成さ れるコードや定数などにも、カナ情報関係のものが追加されている ) 。 本章はツールバーとステータスパーを、どのようにアプリケーション用にカスタマイズするかを 示すものである。読者はツールバーに独自のグラフィックスポタンを追加し、その表示を制御でき るようになる。また、通常のステータスパーのメニュープロンプトとキーポードインジケータの表 示をディスエープルする方法も学ぶ。これによりアプリケーションがステータスパーを独自の用途 に使うことが可能になる。 コントロールバーとアプリケーションフレームワーク ーは C 0 の - クラスのオプジェクトであり、そしてステータスパーは CS s 召〃 % ク ツーーノレノヾ ラスのオプジェクトである。これらのクラスは両方とも CCo 〃レ 0 “から派生し、そしてこれは C ル〃から派生している。 CCo 厩“クラスは、フレームウインドウ内部に位置するコントロー ルバーウインドウをサポートする。これらのコントロールバーウインドウは、親フレームが移動、 サイズ変更したときに、自身のサイズ変更、移動を行なう。アプリケーションフレームワークは、 コントロールバーオプジェクトの生成、ウインドウ作成、そして削除の面倒を見る。 AppWizard はファイル MAINFRM ℃ PP 、 MAINFRM. H 中に、派生フレームクラス用のコントロールバーの コードを生成する。 典型的な SDI アプリケーションでは、 C 0 / 〃 % オプジェクトは c 財〃厖〃川召のクライアント 領域の上部を占め、 CS / 厩召の - オプジェクトは下部を占める。ビューはフレームの残りの部分 ( 中 央部 ) を使用する。 241
2 章 Microsoft 基本クラスライプラリアプリケーションフレームワーク る。普通のクラスライプラリは、任意のプログラムと結合できるように設計された、独立したクラ スのセットであるが、アプリケーションフレームワークはプログラム自身の構造も定義している。 これはわすかな区別にしか聞こえないし、実際その通りである。 Microsoft 基本クラスライプラリ ノヾージョン 1.0 、 BorIandOWL 、 Micorsoft 基本クラスライプラリバージョン 2.0 といったはとん どの Windows の開発クラスライプラリは、アプリケーションフレームワークと考えられる。しか しながら、 Microsoft 基本クラスライプラリバージョン 2.0 はその他の製品以上の相当量の機能を 提供している。 0 アプリケーションフレームワークの例 一般論はこれで十分だろう。すでにいくらかのコードを見る段階にきている。擬似コードではな く、実際にコンパイルし、クラスライプラリと共に動作する本物のコードである。なんだと思う ? 古き良き「 He110 world! 」アプリケーションにちょっと手を加えたものだ ( すでにバージョン 1.0 の クラスライプラリを使っているなら、フレームウインドウのべースクラスを除いて、このコードは なじみのあるものだろう ) 。 Windows 用のクラスライプラリアプリケーションとして動作する、お およそ最低量のコードである。同等の Windows SDK アプリケーションと対比してみよう ! では各行を理解する必要はない。またこれをタイプ入力すること、テストすることで悩まなくてい い。次の章を待てば、そこでは「本物の」アプリケーションフレームワークを使い始められる。 注意規約により、クラスライプラリのクラス名は文字 C で始まる。 以下は、我らの MYAPP アプリケーション用のヘッダと実装ファイルのソースコードである。 CMyApp と CMyFrame のふたつのクラスは、それぞれクラスライプラリのべースクラスから派生 させたものだ。最初は、 MYAPP アプリケーション用のヘッダファイル MYAPP. H である。 / / アプリケーションクラス class CMyApp : public CWinApp public: virtual BOOL 工 nitlnstance ( ) ; / / フレームウインドウクラス class CMyFrame : publi c CFrameWnd public : CMyFrame ( ) ; protected : / / 'afx-msg' は、以下のふたつの関数がクラスライプラリのメッセージ / / ディスパッチシステムに組み込まれることを示している afx—msg void OnLButtonDown(UINT nF1ags , CP0int point) ; afx—msg void OnPaint ( ) ; DECLARE_MESSAGE_MAP ( ) 43
PART 4 上級的なトピックス 0 OnNewDocument 、 OnOpenDocument 、 OnSaveDocument これらのオーバーライドされた CDo 翩襯 e 厩の関数は、ドキュメントの変更状態を設定し、ドキュ メントがクローズされるときにアプリケーションフレームワークが立怩盟 0 を呼び出すこと を保証する。 ADeleteContents アプリケーションフレームワークは、ドキュメントがクローズされるときにはいつでもこの CDoc ″襯 e 厩の仮想関数を呼び出す。このクラス中では、これは文字列リストの配列を解放する。この作 業は、文字列の削除、 CStringList オプジェクトの削除、 CO わ " 要素の除去を行なう。しかし / / 文字列、文字列リストといった、配列の全要素を削除するが void CEx24aDoc : :De1eteContents() 埋め込まれている CO わ耀オプジェクトは削除されない。 配列自身は残る 0 Sa veModified m—stringArray. RemoveA11 ( ) ; delete pList ; pList—>RemoveAII() ; pList (CStringList*) m-stringArray [ 土 ] ; 0 ; 土く m—stringArray. GetSize ( ) ; fO て (int 土 CStringList* pList ; 504 バーボタンとメニュー項目のイネープルとディスエープルを適切に行なう。 らはデータベース接続のオープン、クローズを行なう。仲間の更新コマンドハンドラはダイアログ これらは [ ファイル ] メニューから起動されるメニューコマンドメッセージハンドラである。これ 0 OnFileConnect 、 OnFileDisconnect ドキュメントの SQL 問い合わせと接続文字列がシリアライズされる。 ESeria/ize クスによりューサーに警告する。 を調べる。オープンされている場合はドキュメントはクローズされす、プログラムはメッセージボッ り呼び出されるこの仮想関数は、ドキュメントのデータベース接続がオープンされているかどうか ューザーがドキュメントをクローズしようとしたときに、アプリケーションフレームワークによ
PART 1 Windows 、 Visual C 十十、 成されたライプラリをロードし、 アプリケーションフレームワークの基本 リンクできるということである。複数のアプリケーションでダイ ナミックリンクライプラリ (DLL) を共有することができ、これによりメモリとディスク空間が節約 される。 DLL のコンパイルとテストは独立して行なえるので、ダイナミックリンキングはプログラ ムのモジュラリティを高める。 DLL の設計者は、もともとは C 言語で使用するために DLL を作成したので、 C 十十の場合は多 少複雑になっている。相当な努力の後、 Microsoft 基本クラスライプラリの開発者は、すべてのア プリケーションフレームワークのクラスをひとつの DLL にまとめることに成功した。これにより、 アプリケーションフレームワークのクラスをスタティック、あるいはダイナミックにアプリケーショ ンにリンクすることが可能になった。さらに、 Microsoft 基本クラスライプラリ上で虫自の DLL を 作成することができる。第 26 章には DLL を作成するための情報が収められている。 0 新しい Windows の仕様—OLE と TrueType Windows オペレーティングシステムは何年もかけて発展してきた。最近は、オプジェクトのリン クと埋め込み (Object Linking and Embedding: OLE) 、および TrueType フォントのふたつが 追加された。異なるアプリケーションで作成されたオプジェクトを OLE により組み合わせること で、プログラムの機能を高めることができる。たとえば、チャート、サウンド、絵などをひとつのド キュメントに取り込むことができる。ューザーが OLE オプジェクトをアクテイプにすると、そのオ プジェクトを作成した Windows プログラムが実行され、ユーザーがオプジェクトを操作すること ができるようになる。 Windows SDK ツールによる OLE プログラミングはきわめて難しいが、第 25 章で示すように、 Microsoft 基本クラスライプラリはこの作業をかなり簡単なものにしている。 TrueType フォントは画面、プリンタ両方のテキスト表示の体裁を画期的に向上させる。なぜな ら、これらのフォントは自由にサイズを変えることができ、しかも任意のプリンタで実用的に動作 するので、プログラマにとってはスクリーンフォントをプリンタフォントに一致させるという負担 を取り除くのである。 ÄWindows NT Microsoft が VisuaI C 十十を出荷した頃、 Windows NT はべータテストの最終段階であった。 この新しいオペレーティングシステムはセキュリティ機能を持つ進んだファイルシステム、マルチ スレッド、真に先進的なマルチタスク、拡張性に富んだネットワークアクセス、さらにいくっかの RISC コンピュータへの移植性を持っている。 Windows NT では、既存の Windows べースの 16 ビットアプリケーションと、新しい高性能な Windows べースの 32 ビットアプリケーションの両方 を実行することができる。 Windows の 32 ビットアプリケーションをどのように開発するのか ? 初期のべータテスタは、 新しい C 言語アプリケーションプログラミングインターフェイス (API) を収める Win32 SDK を 使わなければならなかった。これは 32 ビットのパラメータを必要とするため、ほとんどの Win32 30
PART 1 Windows 、 Visual C 十十、アプリケーションフレームワークの基本 もう一度例を見て欲しい。今回は大きなイメージを描いてみよう。アプリケーションの機能のほ とんどは、クラスライプラリのべースクラスの C ル加第力と C. ん〃花ル〃中にある。 MYAPP を 書く際、私たちはいくっかの単純な構造ルールに従った、キーになる関数を派生クラス内に書いて いる。 C 十十は私たちに、たくさんのコードをコピーすることなしに「貸し出してくれる」。これを、 私たちとアプリケーションフレームワークとの間の共同作業と考えよう。アプリケーションフレー ムワークは構造を提供し、私たちはアプリケーションをユニークなものとするコードを提供する。 今読者は、なぜアプリケーションフレームワークがクラスライプラリを超えるものなのかを学び 始めている。アプリケーションフレームワークはアプリケーションの構造を定義するだけではなく、 C 十十のべースクラス以上のものを含んでいる。すでに隠されたル切〃が動作しているのを見 た。その他の要素は、メッセージ処理、診断、 DLL などをサポートしている。 クラスライプラリのメッセージマッピング 前述の例の 0 ん召 4 ″ 0 メンバ関数を参照して欲しい。 0 ん B ″物〃は仮想関数の理想的な候補で あると思うかもしれない。ウインドウのべースクラスはマウスイベントメッセージ、その他の標準 メッセージ用に仮想関数を定義し、派生ウインドウクラスは、必要に応して関数をオーバーライド することができる。いくつかの Windows クラスライプラリはこの方法で動作する。 クラスライプラリアプリケーションフレームワークは、 Windows 中で使用されるメッセージ用 に仮想関数を使用しない。その代わりに、指定されたメッセージを派生クラスのメンバ関数に「マッ プ」するマクロを使用する。なぜ仮想関数を排除したのか ? 次のような状況を考えよう。 Windows 中に 5 つのウインドウクラスの階層があり、べースクラスは 140 のメッセージ用の仮想関数を定義 する。 C 十十は「 vtable 」と呼ばれる仮想関数ディスパッチ構造体を必要とし、これはべースクラス 中で関数が実際にオーバーライドされるかどうかにかかわらす、それぞれ、クラスー仮想関数の組 み合わせに 4 バイトのエントリを持つ。それゆえ仮想メッセージハンドラをサポートするために 別個のタイプのウインドウやコントロールごとに、アプリケーションは 2.8KB のテープルを必要と する。 メニューコマンドメッセージとボタンのクリックによるメッセージでメニューハンドラはどうな るだろうか ? 各アプリケーションは異なるメニューとボタンのセットを持つので、これらをウイン ドウべースクラス中の仮想関数として定義することはできない。クラスライプラリのメッセージマッ プシステムは大きな vtable を排除し、そしてアプリケーション固有のコマンドメッセージを収容す ドキュメントクラス、アプリケーションクラスなどの非ウインドウ ることができる。これはまた、 クラスがコマンドメッセージをハンドルすることを可能にする。 BorIand が OWL の一部として提 クラスライプラリメッセージハンドラは、関数のプロトタイプ、関数のボディ、メッセージマップ 供している「ダイナミックディスパッチテープル」システムと異なり、メッセージマップは C 十十言 46 語になんら拡張を求めない。
前書き ・第 1 部 Windows 、 Visual C 十十、アプリケーションフレームワークの基本 第 1 部では、抽象的な規則と実践的なアプリケーションの間のバランスを取ろうと試みた。最近 の Windows 、そして VisualC 十十の要素の簡単な概観を示した後、軽くアプリケーションフレー ムワークとドキュメントービューアーキテクチャを紹介している。こではクラスライプラリのクラ スを使って作成される、ほんの 30 行のコードしか必要としない「 Hello world! 」プログラムが示さ アプリケーションフレームワークの主要な構成要素ーー一本物のウインドウである「ビュー 0 でに WindowsSDK プログラミングを知っていると仮定して矢継ぎ早に解説している クラスライプラリのマニュアルは、アプリケーションフレームワークのすべての要素を、読者がす ■第 2 部クラスライプラリのピュークラス れている。 に限 こでは、 キュメントクラスを書いたことがあるなら、クラスライプラリがファイル I/O と印刷をどれだけ簡 考えて欲しい ) 、そしてそれを第 2 部で学んだビューに結合させる方法を学ぶ。読者が一度でもド テクチャである。ドキュメントとは何か ( ワードプロセッサのドキュメントよりは一般的な何かだと こでアプリケーションフレームワークの本当の中核が導入される。ドキュメント - ビューアーキ ■第 3 部ドキュメント - ビューアーキテクチャ 業の多くを排除するものだ。 多くの Visual C 十十のツールを使うが、これらは SDK プログラマが骨折ってきたコーディング作 ーでは カルボタン、 Visual Basic コントロールといった特別なものをサポートしているからだ の導師にも役立つものがある。クラスライプラリのビュー環境は、ダイアログデータ交換、グラフィ ーーには Windows それは C 十十とクラスライプラリのクラス中のコンテキストにおいてである 定して解説を進めている。 Windows SDK プログラマならすでに知っていることをここで学が、 徴をなす Windows 複数文書インターフェイス (MDI) を紹介する。 こではまたクラスライプラリアプリケーション中で傑出した特 状況依存のヘルプについて学。 これにそって、コマンドメッセージの処理、ツールバーとステータスパー 単にするかに驚くだろう。 スプリッタフレーム、 9 (ODBC) プログラミングインターフェイスも見る。最後の 2 章は、オプジェクトのリンクと埋め込み トマップ ) 用の便利なクラスを紹介する。こではまた Microsoft Open Database Connectivity けの Windows べースのアプリケーションをいくつか、そして次に DIB ( デバイスに依存しないビッ テクニックを包括している。ます最初にドキュメント - ビューアーキテクチャをバイバスした、骨だ 第 4 部はクラスライプラリにより直接サポートされる、多くの便利な Windows プログラミング ・第 4 部先進的な話題 で作業する時間を節約するのに役立っからだ。 63 ページの「ビルド処理の高速化」には特別な注意を払って欲しい。高速化のヒントは、本書の例