20
Visual C++ Visual C++ ににに ににに MFC MFC ににににににに ににににににに Lashkia Lashkia 研研研 研研研 Lecture Lecture th th H106013 H106013 研研 研研 研研 研研 H106044 H106044 研研 研研 研研 研研

Visual C++ による MFC プログラミング Lashkia 研究室 Lecture 5 th H106013 井戸 悠二 H106044 木町 拓矢

  • View
    241

  • Download
    0

Embed Size (px)

Citation preview

Visual C++ Visual C++ によるによるMFC MFC プログラミンプログラミン

ググLashkia Lashkia 研究室 研究室 Lecture Lecture 55 thth

H106013H106013  井戸 悠二 井戸 悠二H106044H106044  木町 拓矢 木町 拓矢

目次目次 MFCMFC とはとは

MFCMFC の利点・欠点の利点・欠点 MFCMFC でプログラミングでプログラミング

AppWizardAppWizard の使い方の使い方 コントロールコントロール ダイアログデータの更新ダイアログデータの更新 課題課題

MFCMFC とはとは Microsoft Foundation Class (Microsoft Foundation Class ( 以下以下

MFC)MFC) Visual C++ Visual C++ に付属するクラスライブラリに付属するクラスライブラリ WindowsWindows アプリケーションソフトの作成にアプリケーションソフトの作成に

有用な多くのクラスを提供 有用な多くのクラスを提供 利用形態利用形態

プログラムにプログラムに MFCMFC ライブラリを組み込むライブラリを組み込む 共有共有 MFCMFC ライブラリを用いるライブラリを用いる

MFCMFC の利点の利点 Windows API Windows API をオブジェクト指向で組めるをオブジェクト指向で組める Windows Windows アプリケーションが効率良く組めるアプリケーションが効率良く組める

MFC MFC は は Windows API Windows API を を C++ C++ ででラッピングして扱いやすくしたものラッピングして扱いやすくしたもの

※ ※ 扱いやすくしたもの≠簡単扱いやすくしたもの≠簡単

Windows OS

Windows API(Win32 API, Win64 API

…etc)

※SDK の一部として提供

MFCWindows Application

(MFC を用いる )

Windows Application(Win32 API を用いる )

MFCMFC の欠点の欠点 互換性の問題互換性の問題

MFCMFC を使えば使うほど、を使えば使うほど、 Windows OS Windows OS に依存するに依存する 肥大化肥大化

ライブラリを組み込むためライブラリを組み込むため 利用時の問題利用時の問題

内部的には結局 内部的には結局 Windows API Windows API が使われているが使われている MFCMFC で用意されていない部分もあるで用意されていない部分もある CRT (C Runtime) CRT (C Runtime) との共存が難しい場合があるとの共存が難しい場合がある

MFCMFC でプログラミングでプログラミング MFCMFC で作成出来るアプリケーションで作成出来るアプリケーション

SDISDI : : シングル ドキュメントシングル ドキュメント (Notepad, Paint …etc)(Notepad, Paint …etc) MDIMDI : : マルチ ドキュメントマルチ ドキュメント (Word, Excel …etc)(Word, Excel …etc) ダイアログ ベースダイアログ ベース

今回は ダイアログ ベース での作成のみ今回は ダイアログ ベース での作成のみ

開発環境開発環境 Microsoft Visual Studio 2008Microsoft Visual Studio 2008   

Professional EditionProfessional Edition 前回と同様前回と同様

AppWizardAppWizard の使い方の使い方 11

App (Application) WizardApp (Application) Wizard とはとは 楽にスケルトンを作成するためのツール楽にスケルトンを作成するためのツール スケルトンとはスケルトンとは

アプリケーションの骨組みアプリケーションの骨組み スケルトンに肉付けしていくスケルトンに肉付けしていく

AppWizard にて「ダイアログ ベース」に設定すると左の状態まで自動作成してくれる。

AppWizardAppWizard の使い方の使い方 22

新しいプロジェクト新しいプロジェクト プロジェクトの種類プロジェクトの種類 : : Visual C++Visual C++ テンプレートテンプレート : : MFC MFC アプリケーショアプリケーショ

ンン プロジェクト名プロジェクト名 : : SampleLectuerSampleLectuer (任(任

意)意)

AppWizardAppWizard の使い方の使い方 33

アプリケーションの種類を設定アプリケーションの種類を設定 アプリケーションの種類アプリケーションの種類 : ダイアログ ベース: ダイアログ ベース

AppWizardAppWizard の使い方の使い方 44

スケルトンの完成スケルトンの完成

コントロールの配置コントロールの配置 コントロールの配置コントロールの配置

リソース ビューにて配置をリソース ビューにて配置を行うダイアログを選択行うダイアログを選択

ダイアログエディタからコダイアログエディタからコントロールをフォームに配ントロールをフォームに配置置

※ 削除方法  配置されたコントロールを選択して     Delete キー

今回の場合はDialog ディレクトリ内の「 IDD_SAMPLELECTURE_DIALOG 」をダブルクリックして開く

ドラッグ&ドロップ or  ダブルクリックで配置

コントロールのプロパティコントロールのプロパティ プロパティを設定プロパティを設定

IDID : : 各コントロールを区別するための管理名各コントロールを区別するための管理名

※ ※ 各コントロールによって各コントロールによってプロパティの内容は違うプロパティの内容は違う(( ちなみにこれはボタンちなみにこれはボタン 11 のプロのプロ

パティパティ ))

※ ※ ダイアログ自身もダイアログ自身もプロパティを設定する事が可能プロパティを設定する事が可能

イベント ハンドラの追加イベント ハンドラの追加 11

イベント ハンドラを追加するにはイベント ハンドラを追加するには コントロールを選択して、右クリックコントロールを選択して、右クリック ポップアップメニューから「イベント ハンドラの追ポップアップメニューから「イベント ハンドラの追

加」加」プロパティウィンドウの「管理イベント」からも設定可能

パターン① パターン②

イベント ハンドラの追加イベント ハンドラの追加 22

イベント ハンドラ ウィザードを用いるイベント ハンドラ ウィザードを用いる メッセージの種類を選ぶメッセージの種類を選ぶ

void Cmfc_testDlg::OnBnClickedBtn(){

// TODO: ここにコントロール通知ハンドラコードを追加します。}

ButtonControl に対してクリックした際の処理がしたい場合は「 BN_CLICKED 」を選択

設定が終わったら「追加して編集( A )」をクリック自動的に以下のコードが

追加される

メンバ変数の割り当てメンバ変数の割り当て Edit Contorol Edit Contorol にメンバ変数を設定するにメンバ変数を設定する

フォームに作ったEditBoxを右クリックフォームに作ったEditBoxを右クリック 変数の追加で変数名、カテゴリ、コントロール種類変数の追加で変数名、カテゴリ、コントロール種類

等を決める等を決める

メンバ変数の割り当てメンバ変数の割り当て Edit Contorol Edit Contorol にメンバ変数を設定するにメンバ変数を設定する

カテゴリカテゴリ : : ValueValue 変数の種類変数の種類 : : CStringCString 変数名変数名 : : text1 (text1 ( 任意任意 ))

カテゴリは 2 種類・ Control 型・ Value 型

コントロールの状態を変数で扱う場合は Value 型

コントロールを関数を通して操作したい場合は Control 型

ダイアログのデータを更新ダイアログのデータを更新 11

DDX (Dialog Data eXchange ) DDX (Dialog Data eXchange ) を用いるを用いる その名の通り、ダイアログのデータを入れ替えるその名の通り、ダイアログのデータを入れ替える 命令は 命令は UpdateDataUpdateData という関数という関数

メンバ変数メンバ変数 → ダイアログ→ ダイアログ : UpdateData (FALSE);: UpdateData (FALSE); ダイアログダイアログ → メンバ変数→ メンバ変数 : UpdateData (TRUE);: UpdateData (TRUE);

void CMFCDlg :: OnBnClickButton1 (){

// TODO : ここにコントロール通知ハンドラ コードを追加します。UpdateData (TRUE); // ダイアログのデータを読み出しtext2 = text1; // text1 の内容を text2 にコピーUpdateData (FALSE); // メンバ変数の内容をダイアログに書き

出す}// text1, text2 は Edit Control に設定されたメンバ変数 ( カテゴリ: Value, CString)

ダイアログのデータを更新ダイアログのデータを更新 22

DDXDDX を使わない方法を使わない方法 プログラム内にてコントロールを取得するプログラム内にてコントロールを取得する

CString strMsg;

// 各コントロールを取得CEdit* text1 = (CEdit*)GetDlgItem(IDC_EDIT1);CEdit* text2 = (CEdit*)GetDlgItem(IDC_EDIT2);

text1->GetWindowText(strMsg); // 値を取得text2->SetWindowText(strMsg); // 値を設定

プログラムの規模が大きくなってくると、より複雑になっていく・・・そんな時に DDX を使う事で各コントロールを楽に管理出来る

MFC を有効活用するのであれば DDX は利用すべき

課題1課題1 エディットボックスの内容をコピーエディットボックスの内容をコピー

利用するコントロール利用するコントロール Button ControlButton Control 11 個個 Edit Control Edit Control 22 個個

コントロール ID メンバ

タイプ メッセージ

IDC_EDITIDC_EDIT11

texttext11

CStrinCStringg

--

IDC_EDITIDC_EDIT22

texttext22

CStrinCStringg

--

IDC_BTNIDC_BTN -- -- BN_CLICKEBN_CLICKEDDIDC_EDIT1 IDC_EDIT1 に入力された値を に入力された値を IDC_BTN IDC_BTN が押されたらが押されたら

IDC_EDIT2IDC_EDIT2 にコピーするプログラムを作成しなさい

課題2課題2 またですが、自分の好きなものなんでもまたですが、自分の好きなものなんでも

いいので作っちゃおう!いいので作っちゃおう! わからない事はネット等を有効活用して、習わからない事はネット等を有効活用して、習

ってないことでも取り入れちゃってOKです。ってないことでも取り入れちゃってOKです。 出来がいい人=・・・(お察しください)。出来がいい人=・・・(お察しください)。