Windowsプログラミングに関する世界観(Visual C++/MFC)です。
C++も参照のこと。
MicrosoftによるC++のオブジェクト指向のクラスライブラリ(フレームワーク)。
MFCは、.NET Frameworkが登場するまでは、Windowsプログラミングの主役だった。Windows APIのラッパー的フレームワークだが、生産性が高いと言われ、AppWizardやクラス・メンバ関数などのGUIによる自動作成ができるという特徴がある。ただし、ドキュメント・ビューと呼ばれる仕組みを理解するのが難解であることや、変数の名前付けルールに古いシステムハンガリアン記法を用いており、意味が分かり辛い。
アプリケーションを作るためのフレームワークとして使えるほか、C++向けのクラスライブラリとして使用できる。
MFCで提供されるクラスには、CStringやCFileのような基本的なAPI(C++を拡張したようなクラスライブラリ)や、CDocumentやCViewのような継承されることを前提とされるドキュメント・ビューのフレームワーク、CDC(DCはデバイス・コンテキストの略)やCPen, CBrush, CRectのようなGDI+関係のAPI、そしてCButtonのようなWindowsコントロールのクラスなどがある。また、クラスだけではなく専用の関数や型がたくさん用意されている。TCP/IPネットワークについてはWinSockを使う。
デバイス・コンテキストはWindowsとデバイスの橋渡し役のようなもので、Windowsはデバイスを直接操作するのではなく、デバイス・コンテキストを仲介役として操作する。このデバイス・コンテキストを上手く使うことで、たとえばペイントアプリケーションのようなGDI+を使ったグラフィックス操作を行うプログラムを記述することができる。
以下に一覧があります。
C++のクラス群であるMFCによるプログラミング。
MFCの開発のポイントは、
・AppWizard/ClassWizardを用いたスケルトンの自動作成
・メッセージマップによるWindowsメッセージのメソッドへのマッピング
・MFCのクラスやWindowsコントロールを用いたC++とGUIのオブジェクト指向プログラミング
・CViewとCDocumentを中心とするドキュメント・ビューのクラス設計
・自らのアプリケーションの機能を定義するための、クラスの継承とメソッドのオーバーライド
だと思います。
あるいは、これに加えて
・デバイスコンテキストとGDI+を用いたデバイスやグラフィックスの操作
・WinSockを用いたTCP/IP通信
・DirectXと3Dグラフィックス
・ActiveXとCOMによるコンポーネントとのやり取り
となるでしょう。
MFCの基本は、ドキュメント・ビュー・アーキテクチャ。
プログラムを、データを管理・処理する「ドキュメント」と、画面を管理・処理する「ビュー」に分けて開発する。
どことなく、RailsのようなMVCフレームワークに似ていると思った人は、今でこそWebフレームワークとして使われているMVCフレームワークだが、かつてはSmalltalkでGUIアプリケーションを開発するためのものだったことを思い出すこと。(知らない人は放送大学「コンピュータとソフトウェア ('18)」を参照のこと。)
なので、よくあるフレームワークと同様、MFCではビュー画面とデータドキュメントに分割した形で、スマートにC++でプログラミングができる。
また、Windows APIをベースにしていることも重要。Windowsメッセージをメッセージマップにしたり、イベントハンドラ関数のオーバーライドを多用してコンポーネントの継承を可能にするなど、MFCはWindowsプログラミングの真骨頂と言える。
また、AppWizardやClassWizardからGUIでコードを自動作成できるなど、Visual C++の「ビジュアル」という言葉を体現したフレームワークである。
2023.05.11
Visual C++にはいくつかのツールがある。代表的なものは、
ツール | 説明 |
---|---|
AppWizard | プログラムの基本形を作る |
ダイアログエディタ | フォームにコントロールを配置する |
ClassWizard | 定義したい機能に応じて機能を追加する |
テキストエディタ | コードを記述する |
などとなる。このほかにもデバッグを行うためのデバッガなどがある。
また、Visual C++ではプログラムを三種類に分類する。
タイプ | 説明 |
---|---|
SDI | 中央にビューがあり、メニューとツールバーが付属する |
MDI | 複数のウィンドウがひとつのアプリケーションの中で開く |
ダイアログベース | コントロールがフォーム上に自由に配置される |
(新Visual C++6.0入門 スーパービギナー編 (Visual C++6.0実用マスターシリーズ)を参考に執筆しました。)
Windows APIにおけるWindowsメッセージの処理は、MFCではメッセージマップによって行う。
これは
BEGIN_MESSAGE_MAP()
と、
END_MESSAGE_MAP()
の間にメッセージハンドラを追加することによって行われる。
コントロールであれば
ON_COMMAND(ID名, 関数名)
Windowsメッセージであれば
ON_WM_メッセージ名()
などを記述する。
以下はメッセージハンドラ(関数プロトタイプ)とメッセージマップについて:
MFCではメソッドのオーバーライドを多用する。
たとえば、WindowsメッセージではWM_PAINTに対応するメソッドを記述したい場合、WM_PAINTのメッセージハンドラであるOnPaint()をオーバーライドする。
C++のこうしたオーバーライドを使うことで、「あるイベントが起きた時やあるメソッドが実行されたタイミングに合わせて処理を実行しクラスの内容を書き換える」ことができる。
また、既定の描画処理の後にカスタム描画したい、などといった場合はDefault()メソッドを加える。以下を参照のこと。
ドキュメント・ビュー・アーキテクチャは、ドキュメントデータ(基本クラスCDocument)とビュー画面(基本クラスCView)によってアプリケーションを開発する方法。
MFCでは基本的にCViewとCDocumentを継承してアプリケーションを開発する。
後日注記:基本的に、CDocumentが「データ」を担当し、CViewが「画面」を担当する。単に自分でこれらを継承するだけではなく、MFCでは多くのクラスやVisual C++の機能が、このCDocumentとCViewのクラス階層に基づいている。たとえばHTMLを表示する画面は標準ではCViewを継承したCHtmlViewとなる。
以下のサイトが参考になる。
2022.12.08編集
(以下は新Visual C++6.0入門 スーパービギナー編 (Visual C++6.0実用マスターシリーズ)を参考に執筆しました。)
標準でVisual C++に用意されているコントロールは、以下のようになる。
関連 | コントロール |
---|---|
ポインタ | ポインタ(コントロールではなく操作に使う) |
基本 | ピクチャ スタティックテキスト エディットボックス プッシュボタン |
選択項目 | グループボックス チェックボックス ラジオボタン コンボボックス リストボックス |
スクロール | 水平スクロールバー 垂直スクロールバー |
その他 | スピンボタン プログレスバー スライダ ホットキー |
ビュー・コンテナ | リストビュー ツリービュー タブコントロール |
応用 | アニメート リッチエディットコントロール 日時指定 月間予定表 IPアドレス |
カスタム | カスタムコントロール(ユーザー定義のコントロール) 拡張コンボボックス |
Windowsで、すでにあるコントロールのコンポーネントを使うだけではなく、独自のコンポーネントを作る場合は、継承やオーバーライドを使ってMFCなどで作る必要がある。既にあるクラスを継承し、メソッドをオーバーライドすることで、自分のコントロールを作ることができる。
以下はMFCでカスタムコントロールを作る方法:
後日注記:MFCではカスタムコントロールを作った上で、ビューを継承してカスタムコントロールを使うことで、MS-WordやMS-Excelのような高度なビューとコントロールを持つソフトウェアを開発できる。ActiveXのような仕組みを使ってCOM化してもよい。GNOMEでは同様のことをCORBAとBonoboで行うことができる(たとえば表計算ソフトGnumericなど)。OfficeソフトウェアやCORBAも参照のこと。
2023.04.21編集
MFCでドキュメントのデータを読み書きするためには、シリアライズを用います。シリアライズとはメモリ上のオブジェクトをファイルに書き出すことです。
メモリからファイルにオブジェクトを書き込むことをシリアライズと言い、逆にファイルからメモリにオブジェクトを読み込むことをデシリアライズと言います。
単語は難しいですが、ゲームの今のプレイ状況をセーブする感覚だと思えばいいでしょう。
シリアライズも参照のこと。
CEditは、MFCで用意されているエディットコントロールを扱うクラス。上手く使うことでテキストエディタやワープロも作ることができる。
後日注記:ワープロを作るなら、リッチエディットコントロールを使った方がいいかもしれない。単に装飾されたビューを作りたいなら、IEコントロールを使う手もある。
後日注記:AppWizardで最初にアプリケーションのひな型を自動作成する際、ビューの基本クラスにCEditViewを設定することで、テキストエディタの機能を持った最小構成のアプリケーションが自動作成されます。(詳しくはVisual C++ MFCプログラミング - kz's Web Pageが参考になります。)
MFCを使えば、さまざまな高度なアプリケーションを開発できます。
たとえば、MS-Officeと同等のワープロや表計算アプリケーションを作ったり、あるいはIEと同様のブラウザアプリケーションを作ったりするために、MFCを利用できます。
もし、これをコンポーネントにしたい場合、COMやActiveXの仕組みを使うことも考えられます。
後日注記:僕も実際にやってみたことがないため詳細は分からないが、AppWizardでビューの基本クラスにCScrollViewを設定して、アプリケーションを自動作成し、これにさまざまな機能を付け加えることで、Officeのような高度なアプリケーションも開発することができるのではないかと思う。
MFCを用いてWebブラウザを作るには、以下のような流れになる。
1.AppWizardでビューの基本クラスにCHtmlViewを指定。
2.ResourceViewからリソースを編集して、URL欄のラベルやテキストボックス、メニュー(戻る、進む、更新、中止)を作成し、オブジェクトIDを指定。
3.ClassViewからメンバ関数を追加し、ページを表示するコードを記述。
4.メッセージに対してページを表示する関数を実行するためのメッセージマップを追加。
5.ClassWizardでメニューの機能(戻る、進む、更新、中止)となる関数を追加し、それぞれのコードを記述。
6.ClassViewから種々のコード(URLの表示やナビゲート完了時の処理)をオーバーライドして記述。
7.ヘッダーファイルを追加。
詳しくは以下の書籍が参考になります。(上記の内容は以下の書籍の自分なりのまとめ・解説です。)
2024.10.28編集
以下の書籍・ページが参考になります。
以下にサンプルコードがあります。
MSDN(Microsoftの開発者向け情報)を参照することで、MFC/ATLの情報を知ることが出来る。
MFC関連の参考になるサイト。
以下を参照のこと。
Bakeryと言うオープンソースのドキュメント/ビュー・アーキテクチャもあるようだ。GTKmmやlibsigc++とともに使われる。
GUIの開発全般についてはGUI開発を参照のこと。
Windows関係のチュートリアル。
書籍