Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

わんくまT78 mfcを始めようとしてみた

2,836 views

Published on

  • Be the first to comment

わんくまT78 mfcを始めようとしてみた

  1. 1. MFCを始めようとしてみた 暁 紫電 わんくま同盟 東京勉強会 #78
  2. 2. 自己紹介• HN:暁 紫電• 本名: 伊藤 伸男• 職業: フリーランス・プログラ マー 使用言語 C++ C++/CLI C# わんくま同盟 東京勉強会 #78
  3. 3. 本日のアジェンダ• MFCとは?• なんでいまさらMFC• MFCの利点/欠点• とりあえずプロジェクトを作ってみる• ダイアログベース• まとめ わんくま同盟 東京勉強会 #78
  4. 4. MFCとは• マイクロソフトがWindows アプリ作成 用の フレームワークとして開発したライブ ラリ。• 環境としては、「Visual C++ 1.0」の前 の 「C/C++ Compiler 7.0」から付属してい る。 わんくま同盟 東京勉強会 #78
  5. 5. なんでいまどきMFC?• ロジックだけじゃなくてUIもC++で書 きたい。• 受けれる仕事の幅を増やしたい。 わんくま同盟 東京勉強会 #78
  6. 6. MFC(というよりネイティブGUI)の利点• .NET バージョンやラッパーの用意されて いないネイティブライブラリを低コストで 呼び出すことが出来る。• ネイティブなので速いはず。• 実行時にネイティブに変換されるから速度 は変わらないという話もあるが、 すくなくても ネイティブへの変換コスト が掛からないはず。(JITコンパイル?) わんくま同盟 東京勉強会 #78
  7. 7. MFCの欠点• MSDNに初心者向けチュートリアルがな い – MFC自体をある程度使える前提で 新し目の機能(リボンインターフェースなど)に 対応というようなチュートリアルはある – 初心者向けに0から作るようなチュートリアル がない。 – 各技術項目を読んで理解する必要がある。 わんくま同盟 東京勉強会 #78
  8. 8. MFCの欠点• リファレンスもない。パブリック クラス メンバーおよびプロテクト クラスメンバーは、アプリケーション プログラムや派生クラスでよく使われるものだけを取り上げています。 全クラス メンバーの一覧は、クラスのヘッダー ファイルを参照してください。http://msdn.microsoft.com/ja-jp/library/d06h2x6e.aspx ソース読め わんくま同盟 東京勉強会 #78
  9. 9. MFCの欠点(by wikipedia)• CDocument, CView 等の基本的なクラスの 仕様が難解である。• Windowsメッセージ、コマンド等の Win32 APIの基本を理解していることが前 提。• すべての構造体、クラスおよび列挙型など がグローバル名前空間に存在している。• マクロが多用されているため、識別子の衝 突、競合が発生しやすい。 わんくま同盟 東京勉強会 #78
  10. 10. MFCの欠点(by wikipedia)• MFCが作られたのがC++の標準化以前であ るため、例外処理、実行時型情報などの 機能がマクロを使用した独自実装となって いるため、標準C++に慣れたユーザーは戸 惑う わんくま同盟 東京勉強会 #78
  11. 11. 最初から生のWinAPIにしておけば良かった (´・ω・`) わんくま同盟 東京勉強会 #78
  12. 12. でもセッションもう頼まれちゃったしがんば る。 (`・ω・´) わんくま同盟 東京勉強会 #78
  13. 13. とりあえずデフォルト設定で プロジェクトを作ってみる わんくま同盟 東京勉強会 #78
  14. 14. プロジェクトテンプレートからMFCアプリケーションを選択 わんくま同盟 東京勉強会 #78
  15. 15. わんくま同盟 東京勉強会 #78
  16. 16. わんくま同盟 東京勉強会 #78
  17. 17. わんくま同盟 東京勉強会 #78
  18. 18. わんくま同盟 東京勉強会 #78
  19. 19. わんくま同盟 東京勉強会 #78
  20. 20. わんくま同盟 東京勉強会 #78
  21. 21. わんくま同盟 東京勉強会 #78
  22. 22. わんくま同盟 東京勉強会 #78
  23. 23. 設定項目が多すぎて なにやらありがた迷惑臭が漂います わんくま同盟 東京勉強会 #78
  24. 24. デフォルトプロジェクト 設定• アプリケーションの種類:マルチドキュメ ント• ドキュメント/ビューアーキテクチャー• プロジェクト形式:VisualStudio• Visual スタイルと色:Visual Studio 2008 わんくま同盟 東京勉強会 #78
  25. 25. プロジェクトを作った状態 わんくま同盟 東京勉強会 #78
  26. 26. デフォルトプロジェクト• デザイナが開いていない• .cppファイル 11個• .hファイル 13個• リソースファイル 27個 わんくま同盟 東京勉強会 #78
  27. 27. デフォルト設定にしては大き過ぎない か? と思いつつコンパイル わんくま同盟 東京勉強会 #78
  28. 28. なにやらVisual Studio的なものが完成 わんくま同盟 東京勉強会 #78
  29. 29. とりあえずもう少しシンプルなものが作りた い わんくま同盟 東京勉強会 #78
  30. 30. とりあえず、最初の画面だけシンプルなそうな設定にしてみ る。 わんくま同盟 東京勉強会 #78
  31. 31. わんくま同盟 東京勉強会 #78
  32. 32. シンプル?プロジェクト 設定• アプリケーションの種類:シングルドキュ メント• ドキュメント/ビューアーキテクチャー• プロジェクト形式:MFC標準• Visual スタイルと色:Windowsネイティブ/ 既定 わんくま同盟 東京勉強会 #78
  33. 33. シンプルプロジェクト• 相変わらずデザイナなし• .cppファイル 5個• .hファイル 7個• リソースファイル 7個 わんくま同盟 東京勉強会 #78
  34. 34. だいぶシンプルになったけど わんくま同盟 東京勉強会 #78
  35. 35. それでも色々付いてます。 わんくま同盟 東京勉強会 #78
  36. 36. デザイナなし・まとめ• ウィザードの最初の画面をいじるだけだと 最小限のものは作れない。• 本当に最小限のプロジェクトを作ろうとす ると めんどくさそう• そもそも最小限の状態から作り始めるもの じゃないかもしれない。• ウィザードで雛形を作ってそれを元にして アプリケーションを作っていくべき? わんくま同盟 東京勉強会 #78
  37. 37. デフォルト設定じゃないけどちゃんとデザイナもあります。 わんくま同盟 東京勉強会 #78
  38. 38. わんくま同盟 東京勉強会 #78
  39. 39. デザイナはリソースビューから選択可能 わんくま同盟 東京勉強会 #78
  40. 40. 今回は割とシンプルなものが出来上がります わんくま同盟 東京勉強会 #78
  41. 41. 最初からボタンが2つ クリックするとダイアログが 閉じアプリケーションが終了 します。 DialogResult的な物 わんくま同盟 東京勉強会 #78
  42. 42. 最初からボタンが2つ開発時にダブルクリックすると、OnBnClickedOK(),OnBnClickedCancel()が作られる。内部で OnOK(), OnCancel();を呼び出している わんくま同盟 東京勉強会 #78
  43. 43. ダイアログが勝手に閉じないようにする。• とりあえずコントロールを削除してみる• 削除してもEnter/Escを押せば閉じてしまう。• OnBnClickedOk()/Cancel()で呼び出されている CDialogEx::OnOK()/OnCancel()を削除すれば キーを押しても閉じなくなる。void CDialog1Dlg::OnBnClickedOk(){ // TODO: ここにコントロール通知ハンドラー コードを追加します。 CDialogEx::OnOK(); ←コレを消す} わんくま同盟 東京勉強会 #78
  44. 44. ダイアログが勝手に閉じないようにする。(Cancel)• OnCancel()の呼び出しを消してしまうと Escボタンだけじゃなくて閉じるボタンや Alt+F4でもウィンドウが閉じられなくなっ てしまう※(ウィンドウを閉じようとするとOnBnClickedCancel()が呼び出され、その中で閉じる処理( OnCancel() )が行われるため わんくま同盟 東京勉強会 #78
  45. 45. Escキーでダイアログが閉じないようにする。Escでは閉じず他の手段では閉じるようにするためには、PreTranslateMessageをオーバーライドする必要がある。BOOL CDialog1Dlg::PreTranslateMessage(MSG* pMsg){ if( WM_KEYDOWN == pMsg->message ) { if(pMsg->wParam == VK_ESCAPE) { return FALSE; } } return CDialogEx::PreTranslateMessage(pMsg);} わんくま同盟 東京勉強会 #78
  46. 46. MFCの正しい使い方?• デザイナなし(Doc-View等)でアプリ本体を 作って設定ダイアログ等をダイアログベー スで作るのがMFCの正しい使い方っぽ い?• アプリの内容にもよるがダイアログベース で全部作ってしまう事のほうが 多そうな気も…… わんくま同盟 東京勉強会 #78
  47. 47. とりあえずなんか作る• ボタンをクリックするとテキストボックス の中身がメッセージダイアログで表示され る• ダイアログボックスを閉じるとテキストコ ントロールにそのテキストボックスの中身 を表示する。• WinFormsであればコントロールに対応す る変数を操作すればすぐ出来る簡単なアプ リ わんくま同盟 東京勉強会 #78
  48. 48. とりあえず、コントロールを配置 わんくま同盟 東京勉強会 #78
  49. 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
  50. 50. コントロールを選択して右クリック→変数の追加 わんくま同盟 東京勉強会 #78
  51. 51. 変数のカテゴリ• Value 主に表示している文字列に対応した変数 int,CString等• Control 配置したコントロールに対応したクラス CStatic,CButton,CEdit等 わんくま同盟 東京勉強会 #78
  52. 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. 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. 54. DDX/DDV• DDX: Dialog Data eXchange 変数の内容を実際のコントロールに反映、 コントロールの内容を変数に反映させる。• DDV: Dialog data validation データの妥当性検査 わんくま同盟 東京勉強会 #78
  55. 55. DoDataExchange(CDataExchange* pDX)• pDxのメンバーm_bSaveAndValidateがTRUEの 場合 コントロールの内容を変数に反映する• FALSEの場合 変数の内容をコントロールに転送する。• CWnd::UpdateData(BOOL)で呼び出すことが出 来る。 わんくま同盟 東京勉強会 #78
  56. 56. なんとなくMVC系でいう中間層的な動作をしている気がす る。※厳密な意味ではないので適当に聞き流して下さい わんくま同盟 東京勉強会 #78
  57. 57. OnBnClickedButton1()void CDialog1Dlg::OnBnClickedButton1(){ CString str; //文字列変数の作成 //テキストボックスの文字列を取得 TextBox1.GetWindowTextW(str); // メッセージボックに表示 AfxMessageBox(str,IDOK); // ラベルの文字列を更新 this->LabelText = str; UpdateData(FALSE); // 反映} わんくま同盟 東京勉強会 #78
  58. 58. 問題点• 追加した変数すべてのDDX/DDVが DoDataExchange()に含まれるので ひとつの変数に関してだけ更新したいとき でもすべての変数に対して更新されてしま う。• 変数が多くなると、更新したいわけではな い変数に対する処理のせいで 動作が重くなる可能性がある。 わんくま同盟 東京勉強会 #78
  59. 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. 60. ダイアログベース・まとめ• 基本的には設定ダイアログ等を作るためのも の• アプリ自体の作成に使うなら、必要に応じて OnOK OnCancelが呼び出されないように修 正。• 変数の追加、 DDX/DDV関数でコントロールを操作する。• DoDataExChange()の肥大化が気になる場合 はGetDlgItem()でコントロール対応クラスへ のポインタを取得 わんくま同盟 東京勉強会 #78
  61. 61. 最後に• ありがた迷惑設計だけど慣れればどうにか なりそう• でも本格的に使うならフレームワーク的な ものを作ったほうがいいかもしれない• でもそれって自分でWinAPIを自分でラッ プして使うのとあまり変わりないのでは? わんくま同盟 東京勉強会 #78

×