Win32APIとMFC - LashkiaSemi

Win32APIとMFC
H107102 古田雅基
H107048 佐藤一樹
H107126 山下洋平
目次

MFCとは
∙ MFCの利点と欠点
∙ MFCでプログラミング



AppWizard
コントロール
イベントハンドラ
MFCとは

Microsoft Foundation Class
• VisualC++に付属するクラスライブラリ
• Windowsアプリケーションの作成に有用なクラ
スを提供している
MFCの利点

WindowsAPIをオブジェクト指向でプログラ
ムできる
Win32API
MFC
Application
WindowsOS
Win32API
MFCはWindowsAPIをC++でラッピングして
使いやすくした
MFCの欠点

互換性
• MFCを使えば、使っただけWindowsOSに依存

肥大化
• ライブラリを組み込むためファイル要領の肥大化

利用時の問題
• 内部的には結局Win32API
• MFCが用意していない部分もある
AppWizard

App (Application) Wizardとは
• スケルトンを作成するためのツール
• スケルトンとは

アプリケーションの骨組み
AppWizard にて
「ダイアログ ベース」に設定すると
左の状態まで自動作成してくれる。
AppWizard

新しいプロジェクト
• プロジェクトの種類
• テンプレート
• プロジェクト名
: Visual C++
: MFC アプリケーション
: 任意のもの
AppWizard

アプリケーションの種類
AppWizard

スケルトン完成
コントロールの配置

コントロールの配置
• リソース ビューにて配置を行
うダイアログを選択
今回の場合は
Dialog ディレクトリ内の
「IDD_SAMPLELECTURE_DIALOG」を
ダブルクリックして開く
• ダイアログエディタからコント
ロールをフォームに配置
※ 削除方法
配置されたコントロールを選択して
Deleteキー(プログラム的には消えな
いときも)
ドラッグ&ドロップ or ダブルクリックで配置
コントロールのプロパティ

プロパティの設定
• ID
: 各コントロールを区別するための管理名
※ 各コントロールによって
プロパティの内容は違う
(ちなみにこれはボタン1のプロパティ)
※ ダイアログ自身も
プロパティを設定する事が可能
イベント ハンドラ

イベント ハンドラを追加するには
• コントロールを選択して、右クリック
• ポップアップメニューから「イベント ハンドラの追加」
プロパティウィンドウの
「管理イベント」からも設定可能
イベント ハンドラ

イベント ハンドラ ウィザードを用いる
• メッセージの種類を選ぶ
ButtonControlに対して
クリックした際の処理がしたい場合は
「BN_CLICKED」を選択
設定が終わったら
「追加して編集(A)」をクリック
自動的に右記のコードが
生成される
void Cmfc_testDlg::OnBnClickedBtn()
{
// TODO: ここにコントロール通知ハンドラコードを追加します。
}
メンバ変数

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

簡単な計算機をつくろう
• このようなフィールドを作って、四則演算ができる
ようにしよう
課題3

課題3は自由課題となるので、何か自由にプ
ログラムしてみよう
参考URL
http://www.g-ishihara.com/mfc_ge_02.htm