So-net無料ブログ作成

ファイル選択ダイアログについて語る [日記]

Windows Vistaになって、ファイルを選択するためのダイアログ(ファイル選択ダイアログ)に新しいタイプのものが導入された。
そして、こっちをOSの標準として採用したようだ。
(従来の形式のファイル選択ダイアログも引き続き使える)

つまり、VistaのWindowsでは、2種類のファイル選択ダイアログを持っていることになる。

この2種類のファイル選択ダイアログ。
見た目や操作感が違うのはもちろんのこと、他のソフトウェアからの呼び出し方法も全く違う。
片やWin32 API。片やCOM。

ファイル選択ダイアログが持っている機能(出来ること)は大体同じなのに、その実現方法が大きく違う。
その影響がもっとも大きかったのが、「ファイル選択ダイアログのカスタマイズ」だ。

さて

ファイル選択ダイアログを使うソフトウェアを開発する場合、
XP以前とVista以降の両方に対応しようとしたら次の方法がある。

  • Vista以降でも(標準ではない)従来の形式のファイル選択ダイアログを使う
  • XP以前用とVista以降用の2つのソフトウェアを作る

Vistaで導入された新しいファイル選択ダイアログは、もちろんXP以前のOSでは使えないため、選択肢はこの2つとなる。

はっきり言って、どっちも嫌だ。

Visual Studio 2008 以降での Visual C++ (というか 付属のMFC)は、この違いをライブラリで吸収した。

ファイル選択ダイアログを表すクラス「CFileDialog」では、GetVersionEx APIを使ってOSの種類を調べ、処理を振り分けている。

そのため、アプリケーション側のプログラムでは、実行OSを気にすることなく、CFileDialogクラスを使えば、後はライブラリ側で良い感じに処理してくれる。

ただ、「ファイル選択ダイアログのカスタマイズ」だけは、どうにもならなかったようだ。

ダイアログをカスタマイズするためのメソッド SetTemplate は従来のダイアログ専用で、新ダイアログを使っているときに呼ぶと CNotSupportedExceptionを例外で投げる。
新ダイアログをカスタマイズするには、GetIFileDialogCustomizeメソッドを使って色々と行う(もちろん、これは旧ダイアログ使用時には使えない)。

つまり、従来ダイアログ用と新ダイアログ用の2種類のコードを書いて、実行時にOSにあわせて呼び分ける必要がある。

それが嫌(面倒)なら、Vista以降でも従来のファイル選択ダイアログを使うしかない。
方法は、CFileDialogのコンストラクタの一番最後に追加になった引数に FALSE を指定するだけで良い。

CFileDialog dialog(~(略)~, FALSE);

実はコレがちょっと曲者で…

この一番最後の、新ファイル選択ダイアログを使うかどうかを表す引数にはデフォルト引数が設定されていて、省略すると TRUE となる。
つまり、Visual Studio 2005 以前に開発したプログラムは、何の修正も無く正常にコンパイルが完了するということだ。
そして、ダイアログのカスタマイズを行っていると、ファイル選択ダイアログを表示しようとしたところで「サポートされていない操作を実行しました」とエラーを表示するというわけだ。

Visual Studio でプロジェクトを変換する際に、警告の1つでも出して欲しかったところだ。


ところで、

CFileDialog クラスで、新旧両方のダイアログに対応するためのコードはこうなっている。

if (m_bVistaStyle == TRUE)
{
    新ダイアログ用のコード
}
else
{
    旧ダイアログ用のコード
}

こんなコードが各メソッドに存在する。

「とにかくダサい」

今後さらに新しいファイル選択ダイアログが増えた場合、また if 文での分岐を全メソッドに追加するつもりなのだろうか。
今現在でも、実質3種類あるのに。

まともに設計したら、こう↓なると思うのだが、いかがだろうか。
(コードはかなり適当)

class CFileDialog
{
    IFileDialogImpl* impl;
    CFileDialog()
    {
        if (新ダイアログを使う)
            impl = new CFileDialogVista();
        else
            impl = new CFileDialogLegacy();
    }

    void 操作()
    {
        impl->操作();
    }
};

class CFileDialogVista : public IFileDialogImpl
{
};

class CFileDialogLegacy : public IFileDialogImpl
{
};

いわゆるデザインパターンで言うところの Strategyパターンというやつですね。

この設計を採用しなかった Microsoft の真意は如何に。

[車(セダン)] 今日の一冊
黒い森

黒い森

  • 作者: 折原 一
  • 出版社/メーカー: 祥伝社
  • 発売日: 2007/11
  • メディア: 単行本
表と裏の両方から読み進めるマルチサイト小説。結末は真ん中に袋とじ。
某会社が作ると、○○編、△△編、完結編の3冊にするんじゃなかろうか。(完結編がペラペラだけど)

タグ:MFC VisualC++
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。