|
ファイル選択ダイアログ
今回は、よくある次のようなファイル選択のダイアログを作ってみましょう。

このようなダイアログは「コモンダイアログ」と呼ばれ、最初から標準的に用意されているものを使うだけなので、簡単にアプリケーションに組み込むことができます。
ファイル選択ダイアログの場合、単一のファイル選択しか受け付けない場合と、複数選択を可能にする場合で少し違うので、今回は両方作ってみます。
まず、ダイアログベースでプロジェクトを作成し、次のようなダイアログを作ります。

"参照1..."ボタンが押されると、単一選択ダイアログを表示し、エディットボックスに選択されたファイルパスを表示します。"参照2..."ボタンが押されると、複数選択ダイアログを表示し、リストボックスに選択された複数のファイルパスを表示します。
エディットボックス、リストボックスにはDDX変数、ボタンにはBN_CLICKEDのメッセージハンドラを追加します。(この辺については「エディットボックスの基本」、「ボタンの基本」等を見てください。)
では、コードを実装していきましょう。まずは、"参照1..."ボタンのイベントハンドラです。
// "参照1..."ボタン押下
void CFileSelectDlg::OnBnClickedRefer()
{
CString filter("JPEG Files (*.jpg;*.jpeg)|*.jpg; *.jpeg||");
CFileDialog selDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter);
if (selDlg.DoModal() == IDOK)
{
m_xvEditFile = selDlg.GetPathName();
UpdateData(FALSE);
}
return;
} |
ファイル選択ダイアログは、CFileDialogクラスを使います。コンストラクタの引数でダイアログのいろいろなカスタマイズができます。デフォルトでよい場合は指定する必要はありません。
explicit CFileDialog::CFileDialog(
BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL,
DWORD dwSize = 0
); |
| 説明: |
コンストラクタ |
| 引数: |
bOpenFileDialog: |
[ファイルを開く]ダイアログの場合TRUE、[ファイル名を付けて保存]ダイアログの場合FALSE |
| lpszDefExt: |
自動付加される規定の拡張子。NULLの場合付加されない。 |
| lpszFileName: |
初期表示されるファイル名。NULLの場合表示されない。 |
| dwFlags: |
カスタマイズするためのフラグ |
| lpszFilter: |
ファイル名のフィルタ |
ここではlpszFilterを設定しています。これを設定すると、指定した拡張子のファイル以外は表示されなくなります。フィルタは、"説明|拡張子||"という形式の文字列を渡します。拡張子が複数ある場合はセミコロンで区切ります。
ファイルが選択されると、CFileDialog::DoModal()関数がIDOKを返します。CFileDialog::GetPathName()関数で、選択されたファイルパスを取得できます。
次は"参照2..."ボタンのイベントハンドラです。こちらは複数選択の場合です。
// "参照2..."ボタン押下
void CFileSelectDlg::OnBnClickedReferList()
{
CString filter("JPEG Files (*.jpg;*.jpeg)|*.jpg; *.jpeg||");
CString filePath, strBuf;
POSITION pos = NULL;
CFileDialog selDlg(TRUE, NULL, NULL,
OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT, filter);
int err = 0, lbErr = 0;
// ファイル名リスト用メモリ確保
if (!err)
{
try
{
selDlg.GetOFN().lpstrFile = strBuf.GetBuffer(MAX_PATH *100);
selDlg.GetOFN().nMaxFile = MAX_PATH *100;
}
catch (...) {err = 1;}
}
if (!err) if (selDlg.DoModal() != IDOK) err = 1;
if (!err) if ((pos = selDlg.GetStartPosition()) == NULL) err = 1;
if (!err)
{
while (pos)
{
filePath = selDlg.GetNextPathName(pos);
if (!err)
{
lbErr = m_xcListFile.InsertString(-1, filePath);
if (lbErr == LB_ERR || lbErr == LB_ERRSPACE) err = 1;
}
if (err) break;
}
UpdateData(FALSE);
}
strBuf.ReleaseBuffer();
return;
} |
複数選択にする場合は、dwFlagsにOFN_ALLOWMULTISELECTを追加します。
ダイアログを表示する前に、複数のファイルパスを格納するのに十分な大きさのバッファを用意し、CFileDialogクラスオブジェクトに渡しておきます。CFileDialog::GetOFN()関数でOPENFILENAME構造体が取得できるので、lpstrFileにバッファ、nMaxFileにそのサイズを設定します。
もし指定したバッファが足りなかった場合は、DoModal()関数がIDCANCELを返します。
ファイルパスを取得するには、CFileDialog::GetStartPosition()とCFileDialog::GetNextPathName()関数を使って一つずつ取得していきます。使い方はコードを見ればわかると思いますが、選択されたファイルがない場合、GetStartPosition()関数はNULLを返します。また、最後のファイルパスを取得したときに、GetNextPathName()関数はposをNULLに設定します。
では、ビルドして実行してみましょう。"参照1..."ボタン、"参照2..."ボタンを押してファイルを選択すると、それぞれ、エディットボックス、リストボックスにファイルパスが表示されます。



|