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にするようにしてみました。

 下は従来のコード


下は改良後のコード


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

 

高知県 ブログランキングへ

「読んだよ!」という合図にクリックお願いします。
著者がたいへん元気になります。 ^o^/

mira
静岡大学人工衛星STARS-Cを技術分野で応援しています。元・香川大学人工衛星チーム。芸西天文台(高知県)の70cm望遠鏡で彗星や小惑星を観測しています。小惑星2個発見!初回帰の彗星1個検出。一般公開では星空案内も。軌道計算ソフトOrbitLife公開中。休日は人工衛星開発、Raspberry Pi、Rapiro、マイコン電子工作、虫の写真。2アマ。本業は民間企業の天才プログラマーです^o^v
電書鳩: mira(あっとまーく)mail2.netwave.or.jp

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

  1. 和田聡覚
    2015年6月20日 at 00時02分

    どういう軌道計算法でもいいんですが
    勝手に系内惑星に丸めないでください。
    地球が系外惑星になることもあるので
    嘘偽りは禁物です。
    ですが嘘偽りの長沢式は優秀で
    地球が系外惑星になるのを防いでくれています。
    愛孫彗星の軌道で夜も眠れなくなりませんでしたか。
    大学に行ってディーゼルを買ってください。

    • mira
      Asteroid18365
      2015年6月20日 at 16時26分

      え!??
      地球が系外惑星になる?
      「天体軌道論 長谷川一郎著」の62.2式のことですか?

    • mira
      Asteroid18365
      2015年6月21日 at 00時56分

      たしかに、天体力学的には地球が太陽系の外に飛び出すことはありえます。
      しかし、いまのところそのような影響を与える巨大質量と軌道を持った天体が太陽系に突入してきたという情報は公になっていません。
      OrbitLifeは主に天体観測を支援したり、軌道計算の雰囲気を味わってもらうために作ったソフトですので、SF的な要素は組み込んでありません。
      (組み込めと言われても無理ですが)

コメントを残す

メールアドレスが公開されることはありません。

■まことにお手数ですが、迷惑な自動投稿防止のために答えをアラビア数字(0,1,2,...9)で枠に入力してから[コメントを送信]お願いします。 m(_ _)m Time limit is exhausted. Please reload the CAPTCHA.