本項ではドキュメントにSTL ファイルを読み込むための準備を行います。
STLファイルを開くためのファイル選択ダイアログを表示させる処理と、三角形データをドキュメントに保持するためのメンバー変数を追加しましょう。
クラスウィザードを使ってドキュメント関連のハンドラー/変数の追加を行います。
ここではメニューの [ファイル(F)]-[開く(O)...] を実行した時の処理を追加します。
1. メニューの [プロジェクト(P)]-[クラスウィザード(Z)...] を選択し、『クラスウィザード』ダイアログを開きます。
2. 「クラス名(N)」コンボボックスで "CSTLViewerDoc" を選択します。
3. 「オブジェクトID(B)」リストボックスで "ID_FILE_OPEN" を選択します。
4. 「ハンドラーの追加(A)...」ボタンを押下します。
5. 『メンバー関数の追加』ダイアログが開いたら、「OK」ボタンを押下します。
引き続きファイルからSTLデータを読み込んだときに値を保持するためのメンバー変数を追加します。
1. 「メンバー変数」のタブを選択します。
2. 「カスタムの追加(U)...」ボタンを押下し、『メンバー変数の追加』ダイアログを開きます。
3. 「変数の型(T)」コンボボックスに "CgsTriangles" を入力します。
4. 「変数名(N)」エディットボックスに "m_ctTriangles" を入力します。
5. 「アクセス」のラジオボタンから "プライベート(V)" を選択します。
6. 「OK」ボタンを押下します。
7. 『クラスウィザード』ダイアログの「OK」ボタンを押下します。
正しく実行できていれば【STLViewerDoc.h】,【STLViewerDoc.cpp】のように変更されています。
MFC アプリケーションでは一般的に文字列はリソースファイル(ここでは STLViewer.rc)で一元管理します。そうすることにより多言語化する際の翻訳が行いやすくなります。
1. 『リソースビュー』の "String Table" を展開後、"String Table" をダブルクリックし、『String Table』ウィンドウを開きます。
2. アイテムを選択し、右クリックでポップアップメニューを開いて「新しい文字列(W)」を選択します。
3. 『String Table』に追加された「値」が "101" の 「ID」を "IDS_FILTER_STL" に変更します。
4. "IDS_FILTER_STL" のキャプションに "STL ファイル(*.stl)|*.stl||" を入力します。
5. アイテムを選択し、右クリックでポップアップメニューを開いて「新しい文字列(W)」を選択します。
6. 『String Table』に追加された「値」が "102" の 「ID」を "IDS_ERROR_READ_TEXT" に変更します。
7. "IDS_ERROR_READ_TEXT" のキャプションに "ファイルの読み込みに失敗しました。" を入力します。
正しく実行できていれば【resource.h】,【STLViewer.rc】のように変更されています。
ここではクラスウィザードで追加したハンドラーに処理を追加します。
1. メンバー変数に CgsTriangles クラスを保持するためのヘッダーファイルを追加します。
【STLViewerDoc.h】
// STLViewerDoc.h : CSTLViewerDoc クラスのインターフェイス
//
#pragma once
#include "CgsTriangle.h"
2. リソース文字列の ID を参照するためのヘッダーファイルを追加します。
【STLViewerDoc.cpp】
// STLViewerDoc.cpp : CSTLViewerDoc クラスの実装
//
#include "pch.h"
#include "framework.h"
// SHARED_HANDLERS は、プレビュー、縮小版、および検索フィルター ハンドラーを実装している ATL プロジェクトで定義でき、
// そのプロジェクトとのドキュメント コードの共有を可能にします。
#ifndef SHARED_HANDLERS
#include "STLViewer.h"
#endif
#include "Resource.h"
#include "STLViewerDoc.h"
ファイル選択ダイアログを表示する処理を追加します。
void CSTLViewerDoc::OnFileOpen()
{
// ファイル選択ダイアログ表示
CString strFilter;
const int length = strFilter.LoadString(IDS_FILTER_STL);
const DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
CFileDialog dlg(TRUE, _T("stl"), NULL, dwFlags, (LPCTSTR)strFilter);
if (dlg.DoModal() != IDOK) {
return;
}
}