VistaからCFileDialogの仕様が変更になっていた!

天体軌道計算ソフトOrbitLifeはVisual Studio 2005のC++で開発しているのですが、Windows 8.1ではそれが動作しないので、今回Visual Studio 2013でリビルドしました。
特に修正しなくても正常にコンパイルでき、OrbitLifeの一番複雑な処理である摂動計算も正しく動いたので、ちょっとした機能追加をして公開したのですが、次の日に「計算結果が正しく保存されません」との連絡が来ました。
保存するときは、正常なら下のような画面が表示されるのですが….


(1)計算結果ファイルを保存する時の正しい画面


やってみると下のような普通の保存画面が表示されてしまいます。正しい画面はCFileDialogクラスから派生させて保存形式等を選択できる機能を持たせたものです。しかもデフォルトの保存形式であるMPC8行形式が正しく出力されませんでした。


(2)Visual Studio 2013でリビルドしただけの画面


ネットで原因を調べようとしたのですが、キーワードが適切ではないのか、情報そのものが少ないのか、原因がすぐには判明しませんでした。
そこで、しぶしぶMSDNのCFileDialogクラス(Visual Studio 2013)を読んでみると…。ありました。公式文書は読むものですね ^_^; スクロールして中段くらいにある「解説」に明記されていました。これによると、Windows VistaでCFileDialogクラスの仕様が変更になり、Visual Studio 2013でそれに対応したために、従来のパラメータで呼び出しを行うとVista以降の形式で動作するのだと解釈ができます。しかも、Vista形式だとCDialog::OnInitDialog関数は無効になると明記されています。OnInitDialog関数で行っている処理をどのように作り変えれば良いのだろうとさんざん考えたのですが、よくわからず、試しに基底クラスのCFileDialogを呼び出すときに第7パラメータと第8パラメータを追加し、bVistaStyleをFALSEにするようにしてみました。

下は従来のコード

CFileOptionDlg::CFileOptionDlg(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
    DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :
    CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd)
{
    m_ofn.Flags |= OFN_ENABLETEMPLATE;
    m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILEOPTIONDLG);
}

下は改良後のコード

CFileOptionDlg::CFileOptionDlg(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
    DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :
    CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd, 0, FALSE)
{
    m_ofn.Flags |= OFN_ENABLETEMPLATE;
    m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILEOPTIONDLG);
}

これで、バッチリ、FileDialogの見た目も従来のままで、OnInitDialogも動くようになりました。



高知県ランキング
上のバナーをポチッと押していただくと著者が元気になりますのでよろしくお願いします。


1 comment for “VistaからCFileDialogの仕様が変更になっていた!

Comments are closed.