JPEGプレビュー付ファイルダイアログ(Preview)


■ 概略説明
タイトルのとおり、通常のファイルダイアログに、選択されたJPEG及び、ビットマップファイルを表示する機能を追加したものです。ダイアログの下の[プレビュー]チェックにより表示を切り替えます。
■JPEGライブラリーの入手と作成 (これが無いと動きません!!
JPEGファイルとDIBファイルに関しては、Smaller Animals Softwareが公開しているjpeglibを使用しています。
サイトの場所に関しては、リンクページを参照して下さい。
ファイルのある場所は、Smaller Animals Softwareの[Home]〜[C++Source]〜[JpegFile Page]に行くと一番下に[Download Jpeg.zip]とあります。このページにいろいろと注意や説明があるので見てください。
ダウンロードしたプロジェクトは、Jpeglib.libとサンプルプログラムが入っていますから、まずこれらをビルドして実行してみてください。
次にこのプレビューサンプルをダウンロードして解凍後のディレクトリに以下のファイルを上記のプロジェクトからコピーしてください。
・jpeglib.lib
・jpeglib.h, jconfig.h, jmorecfg.h
■ プログラムの説明@ファイルダイアログのカスタマイズ方法
CFileDialogを含むコモンダイアログのカスタマイズには、いくつかの方法があるようですが、今回は自分で作成したダイアログにコモンダイアログを埋め込む方法を使用しています。
大まかな手順は、以下のとおりです。

1. resource.hを開き、一番最後に
#include <dlgs.h>
を追加し、これを保存し閉じます。

2. 次にVisual Cのシステムディレクトリ内にあるfileopen.dlgを開きます。今回は単一ファイル選択のみですから、その中のNEWFILEOPENORDのダイアログ部分をコピーし、自分のリソースファイルをテキストモードで開き、ダイアログ指定部分の最後にこれを貼り付けます。そしてこれを保存し閉じます。

3. ワークスペース・リソース内のダイアログに、"NEWFILEOPENORD"という文字列のダイアログができるのでこれをプロパティで適当なID形式に直します。今回はMY_NEWFILEOPENORDです。

4. 次に、通常の要領でカスタマイズの為のダイアログを作成します。今回はIDD_MYFILEDLGです。
このダイアログのプロパティを以下の個所を変更します。
4-1. [スタイル]ページ
[スタイル]を[チャイルド]、[境界線]を[しない]、[兄弟ウィンドウをクリップ]をチェック、[子ウィンドウをクリップ]をチェック
4-2. [その他のスタイル]ページ
[コントロール]をチェック

5. このダイアログにコントロールを追加します。
5-1. まず、CFileDialogがはいるスタティック テキストコントロールを配置します。大きさは大体でOKです。
このIDをstc32にします。dlgs.h内で設定されています。
5-2. 他の必要なコントロールを通常の方法で追加します。今回は[プレビュー]のチェックのみです。

6. このダイアログからクラスウィザードで新しいクラスを作成します。基本クラスをCFileDialogにします。今回はCMyFileDlgです。

7. このダイアログのヘッダーファイルに以下のコードを追加します。
//{{AFX_DATA(CMyFileDlg)
enum { IDD = IDD_MYFILEDLG }; <- 4で作成したダイアログのID.
//}}AFX_DATA
これにより、クラスウィザードで処理を追加することができます。

8. コンストラクタに以下のコードを追加します。
m_ofn.Flags |= dwFlags;
m_ofn.Flags |= OFN_EXPLORER;
m_ofn.Flags |= OFN_ENABLETEMPLATE;

SetTemplate(MY_NEWFILEOPENORD, IDD_MYFILEDLG);
■ プログラムの説明Aプレビュー表示に関する簡単な説明
JPEG及びビットマップ自体の読込み、表示に関する説明はSmaller Animals Softwareさんのソースをほとんどそのまま使用しているので割愛させて頂きます。
プレビューのウィンドウですが、CFileDialog内のファイルを表示するリストビュー自体の大きさを変えて、その空いた場所にウィンドウを作成する方法を取っています。このリストビューですが、スパイを使うとわかると思いますが、ダイアログの下に直接存在するのではなくその間に或るウィンドウが同じ大きさで存在しています。当初このウィンドウのサイズも変えてそこにプレビューを表示したのですがOnPaint()でプレビューを更新した後に、どうしても縮めたはずの空間が描き直されてプレビューが消えてしまいました。そこで今回は、この間のウィンドウのサイズは変更せずに、この上にプレビューウィンドウを作成しています。
■ ファイルのダウンロード
(MFC6.0プロジェクトファイル51KB)