Transcript MFC

Visual C++ による
MFC プログラミング
Lashkia 研究室 Lecture 5th
H106013 井戸 悠二
H106044 木町 拓矢
目次

MFCとは
MFCの利点・欠点
 MFCでプログラミング





AppWizardの使い方
コントロール
ダイアログデータの更新
課題
MFCとは

Microsoft Foundation Class (以下MFC)
Visual C++ に付属するクラスライブラリ
 Windowsアプリケーションソフトの作成に有用な
多くのクラスを提供
 利用形態

プログラムにMFCライブラリを組み込む
 共有MFCライブラリを用いる

MFCの利点


Windows API をオブジェクト指向で組める
Windows アプリケーションが効率良く組める
Windows OS
Windows Application
(MFC を用いる)
Windows Application
(Win32 API を用いる)
MFC
Windows API
(Win32 API, Win64 API
…etc)
※SDKの一部として提供
MFC は Windows API を C++ で
ラッピングして扱いやすくしたもの
※ 扱いやすくしたもの≠簡単
MFCの欠点

互換性の問題


肥大化


MFCを使えば使うほど、Windows OS に依存する
ライブラリを組み込むため
利用時の問題



内部的には結局 Windows API が使われている
MFCで用意されていない部分もある
CRT (C Runtime) との共存が難しい場合がある
MFCでプログラミング

MFCで作成出来るアプリケーション



SDI
: シングル ドキュメント
MDI
: マルチ ドキュメント
ダイアログ ベース
(Notepad, Paint …etc)
(Word, Excel …etc)

今回は ダイアログ ベース での作成のみ

開発環境
 Microsoft Visual Studio 2008 Professional Edition
 前回と同様
AppWizardの使い方1

App (Application) Wizardとは
楽にスケルトンを作成するためのツール
 スケルトンとは

アプリケーションの骨組み
 スケルトンに肉付けしていく

AppWizard にて
「ダイアログ ベース」に設定すると
左の状態まで自動作成してくれる。
AppWizardの使い方2

新しいプロジェクト



プロジェクトの種類
テンプレート
プロジェクト名
: Visual C++
: MFC アプリケーション
: SampleLectuer(任意)
AppWizardの使い方3

アプリケーションの種類を設定

アプリケーションの種類
: ダイアログ ベース
AppWizardの使い方4

スケルトンの完成
コントロールの配置

コントロールの配置

リソース ビューにて配置を行
うダイアログを選択
今回の場合は
Dialog ディレクトリ内の
「IDD_SAMPLELECTURE_DIALOG」を
ダブルクリックして開く

ダイアログエディタからコント
ロールをフォームに配置
※ 削除方法
配置されたコントロールを選択して
Deleteキー
ドラッグ&ドロップ or ダブルクリックで配置
コントロールのプロパティ

プロパティを設定

ID
: 各コントロールを区別するための管理名
※ 各コントロールによって
プロパティの内容は違う
(ちなみにこれはボタン1のプロパティ)
※ ダイアログ自身も
プロパティを設定する事が可能
イベント ハンドラの追加1

イベント ハンドラを追加するには


コントロールを選択して、右クリック
ポップアップメニューから「イベント ハンドラの追加」
プロパティウィンドウの
「管理イベント」からも設定可能
パターン①
パターン②
イベント ハンドラの追加2

イベント ハンドラ ウィザードを用いる

メッセージの種類を選ぶ
ButtonControlに対して
クリックした際の処理がしたい場合は
「BN_CLICKED」を選択
設定が終わったら
「追加して編集(A)」をクリック
自動的に以下のコードが
追加される
void Cmfc_testDlg::OnBnClickedBtn()
{
// TODO: ここにコントロール通知ハンドラコードを追加します。
}
メンバ変数の割り当て

Edit Contorol にメンバ変数を設定する

フォームに作ったEditBoxを右クリック

変数の追加で変数名、カテゴリ、コントロール種類等を決
める
メンバ変数の割り当て

Edit Contorol にメンバ変数を設定する



カテゴリ
変数の種類
変数名
: Value
: CString
: text1 (任意)
カテゴリは2種類
・Control 型
・Value 型
コントロールの状態を
変数で扱う場合は Value型
コントロールを関数を通して
操作したい場合は Control型
ダイアログのデータを更新1

DDX (Dialog Data eXchange ) を用いる


その名の通り、ダイアログのデータを入れ替える
命令は UpdateData という関数


メンバ変数
ダイアログ
→ ダイアログ
→ メンバ変数
: UpdateData (FALSE);
: UpdateData (TRUE);
void CMFCDlg :: OnBnClickButton1 ()
{
// TODO : ここにコントロール通知ハンドラ コードを追加します。
UpdateData (TRUE);
// ダイアログのデータを読み出し
text2 = text1;
// text1 の内容を text2 にコピー
UpdateData (FALSE);
// メンバ変数の内容をダイアログに書き出す
}
// text1, text2 は Edit Control に設定されたメンバ変数(カテゴリ:Value, CString)
ダイアログのデータを更新2

DDXを使わない方法

プログラム内にてコントロールを取得する
CString strMsg;
// 各コントロールを取得
CEdit* text1 = (CEdit*)GetDlgItem(IDC_EDIT1);
CEdit* text2 = (CEdit*)GetDlgItem(IDC_EDIT2);
text1->GetWindowText(strMsg);
text2->SetWindowText(strMsg);
// 値を取得
// 値を設定
プログラムの規模が大きくなってくると、より複雑になっていく・・・
そんな時にDDXを使う事で各コントロールを楽に管理出来る
MFCを有効活用するのであればDDXは利用すべき
課題1

エディットボックスの内容をコピー

利用するコントロール


Button Control
Edit Control
コントロールID
1個
2個
メンバ
タイプ
メッセージ
IDC_EDIT1 text1 CString
-
IDC_EDIT2 text2 CString
-
IDC_BTN
-
-
BN_CLICKED
IDC_EDIT1 に入力された値を IDC_BTN が押されたら
IDC_EDIT2 にコピーするプログラムを作成しなさい
課題2

またですが、自分の好きなものなんでもいい
ので作っちゃおう!
わからない事はネット等を有効活用して、習って
ないことでも取り入れちゃってOKです。
 出来がいい人=・・・(お察しください)。
