More Related Content
Similar to わんくまT78 mfcを始めようとしてみた
Similar to わんくまT78 mfcを始めようとしてみた (20)
わんくまT78 mfcを始めようとしてみた
- 2. 自己紹介
• HN:暁 紫電
• 本名: 伊藤 伸男
• 職業: フリーランス・プログラ
マー
使用言語
C++
C++/CLI
C#
わんくま同盟 東京勉強会 #78
- 3. 本日のアジェンダ
• MFCとは?
• なんでいまさらMFC
• MFCの利点/欠点
• とりあえずプロジェクトを作ってみる
• ダイアログベース
• まとめ
わんくま同盟 東京勉強会 #78
- 7. MFCの欠点
• MSDNに初心者向けチュートリアルがな
い
– MFC自体をある程度使える前提で
新し目の機能(リボンインターフェースなど)に
対応というようなチュートリアルはある
– 初心者向けに0から作るようなチュートリアル
がない。
– 各技術項目を読んで理解する必要がある。
わんくま同盟 東京勉強会 #78
- 8. MFCの欠点
• リファレンスもない。
パブリック クラス メンバーおよびプロテクト ク
ラス
メンバーは、アプリケーション プログラムや派生
クラスでよく使われるものだけを取り上げていま
す。 全クラス メンバーの一覧は、クラスのヘッ
ダー ファイルを参照してください。
http://msdn.microsoft.com/ja-jp/library/d06h2x6e.aspx
ソース読め
わんくま同盟 東京勉強会 #78
- 9. MFCの欠点(by wikipedia)
• CDocument, CView 等の基本的なクラスの
仕様が難解である。
• Windowsメッセージ、コマンド等の
Win32 APIの基本を理解していることが前
提。
• すべての構造体、クラスおよび列挙型など
がグローバル名前空間に存在している。
• マクロが多用されているため、識別子の衝
突、競合が発生しやすい。
わんくま同盟 東京勉強会 #78
- 23. 設定項目が多すぎて
なにやら
ありがた迷惑臭が漂います
わんくま同盟 東京勉強会 #78
- 26. デフォルトプロジェクト
• デザイナが開いていない
• .cppファイル 11個
• .hファイル 13個
• リソースファイル 27個
わんくま同盟 東京勉強会 #78
- 33. シンプルプロジェクト
• 相変わらずデザイナなし
• .cppファイル 5個
• .hファイル 7個
• リソースファイル 7個
わんくま同盟 東京勉強会 #78
- 36. デザイナなし・まとめ
• ウィザードの最初の画面をいじるだけだと
最小限のものは作れない。
• 本当に最小限のプロジェクトを作ろうとす
ると
めんどくさそう
• そもそも最小限の状態から作り始めるもの
じゃないかもしれない。
• ウィザードで雛形を作ってそれを元にして
アプリケーションを作っていくべき?
わんくま同盟 東京勉強会 #78
- 41. 最初からボタンが2つ
クリックするとダイアログが
閉じアプリケーションが終了
します。
DialogResult的な物
わんくま同盟 東京勉強会 #78
- 47. とりあえずなんか作る
• ボタンをクリックするとテキストボックス
の中身がメッセージダイアログで表示され
る
• ダイアログボックスを閉じるとテキストコ
ントロールにそのテキストボックスの中身
を表示する。
• WinFormsであればコントロールに対応す
る変数を操作すればすぐ出来る簡単なアプ
リ
わんくま同盟 東京勉強会 #78
- 49. コントロールに対応した変数が作られていない。
// CDialog1Dlg ダイアログ
class CDialog1Dlg : public CDialogEx
{
// ~略~
public:
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();
virtual BOOL PreTranslateMessage(MSG* pMsg);
afx_msg void OnBnClickedButton1();
};
わんくま同盟 東京勉強会 #78
- 51. 変数のカテゴリ
• Value
主に表示している文字列に対応した変
数
int,CString等
• Control
配置したコントロールに対応したクラ
ス
CStatic,CButton,CEdit等
わんくま同盟 東京勉強会 #78
- 52. 変数の追加結果
// CDialog1Dlg ダイアログ
class CDialog1Dlg : public CDialogEx
{
// ~略~
public:
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();
virtual BOOL PreTranslateMessage(MSG* pMsg);
afx_msg void OnBnClickedButton1();
CEdit TextBox1; //テキストボックスに対応したControll変数
CString LabelText; //ラベルの文字列に対応したValue変数
};
わんくま同盟 東京勉強会 #78
- 53. DDX/DDV
• 変数を追加するとDoDataExchange()に
DDX/DDV系関数の呼び出しが追加される。
void CDialog1Dlg::DoDataExchange(CDataExchange*
pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT1, TextBox1);
DDX_Text(pDX, IDC_RESULT, LabelText);
DDV_MaxChars(pDX, LabelText, 10);
}
わんくま同盟 東京勉強会 #78
- 54. DDX/DDV
• DDX: Dialog Data eXchange
変数の内容を実際のコントロールに反
映、
コントロールの内容を変数に反映させ
る。
• DDV: Dialog data validation
データの妥当性検査
わんくま同盟 東京勉強会 #78
- 58. 問題点
• 追加した変数すべてのDDX/DDVが
DoDataExchange()に含まれるので
ひとつの変数に関してだけ更新したいとき
でもすべての変数に対して更新されてしま
う。
• 変数が多くなると、更新したいわけではな
い変数に対する処理のせいで
動作が重くなる可能性がある。
わんくま同盟 東京勉強会 #78
- 59. CWnd::GetDlgItem(int nID )
• CWnd::GetDlgItemを用いることで、
DoDataExChange()を使わずに、コント
ロールと関連付けられた変数へのポインタ
を取得できる。
void CDialog1Dlg::OnBnClickedButton1()
{
CEdit* pTextBox = (CEdit*)this->GetDlgItem(IDC_EDIT1);
CStatic* pLabel = (CStatic*)this->GetDlgItem(IDC_LABEL);
CString str;
pTextBox->GetWindowTextW(str);
AfxMessageBox(str,IDOK);
pLabel->SetWindowTextW(str);
}
わんくま同盟 東京勉強会 #78
- 60. ダイアログベース・まとめ
• 基本的には設定ダイアログ等を作るためのも
の
• アプリ自体の作成に使うなら、必要に応じて
OnOK OnCancelが呼び出されないように修
正。
• 変数の追加、
DDX/DDV関数でコントロールを操作する。
• DoDataExChange()の肥大化が気になる場合
はGetDlgItem()でコントロール対応クラスへ
のポインタを取得 わんくま同盟 東京勉強会 #78
- 61. 最後に
• ありがた迷惑設計だけど慣れればどうにか
なりそう
• でも本格的に使うならフレームワーク的な
ものを作ったほうがいいかもしれない
• でもそれって自分でWinAPIを自分でラッ
プして使うのとあまり変わりないのでは?
わんくま同盟 東京勉強会 #78