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です。
出来がいい人=・・・(お察しください)。