=============================================================================== だいなファイラー 拡張Viewモジュール EXTVIEWMOD_VER 2 2021/02/12 by Key,Hx2 =============================================================================== ●概要  だいなファイラー v3.30 から外部モジュールにより、画像ビュアーを拡張できるよう になりました(Key氏による発案・初期実装。Thanks!)  動画の再生モジュールなどが想定されておりますが、拡張モジュールにはdyna本体の ウィンドウハンドルおよびウィンドウメッセージが渡されるため、拡張モジュール側で 子ウィンドウを作ったりすることで自由なビュアーが作成可能な設計としています。  拡張モジュールの拡張子は 32bit版では .dpi、64bit版は .dph とします。 だいなファイラー本体は、SUSIEプラグインと同じタイミングで、dyna.exe と同じディ レクトリ内の *.dpi(64bit版は*.dph)を読み込み、拡張モジュール側で指定している ファイルタイプ(拡張子)を登録します。 ●拡張モジュール実装 ExtViewModule.h をinclude し、DLLプロジェクトとして作成します。 DLLのExport関数は「GetExtViewModuleInfo」の一つのみです。 ●Export関数 ------------------------------------------------------------------------------- ExtViewModule* WINAPI GetExtViewModuleInfo( DWORD dwFlags ) ------------------------------------------------------------------------------- 概要 ExtViewModule構造体へのポインタを返します。 引数 dwFlags RFU ※未使用。もともとSJIS版、UNICODE版を一つのDLLで実装するためのフラグとして  利用予定でした。 ●ExtViewModule構造体 ------------------------------------------------------------------------------- typedef struct { LPCSTR magicStr; // 識別文字列へのポインタ(EXTVIEWMOD_STRを設定する) DWORD version; // 構造体のバージョン(EXTVIEWMOD_VERを設定する) DWORD flags; // モジュールの特性を示すフラグ DWORD reserved; // 予約 LPCSTR moduleshortname; // 短いモジュール名 LPCSTR defaultfilter; // 入力ファイルのデフォルトフィルタ //('|'で区切って複数指定) LPCWSTR modulefullname; // モジュール名 LPCWSTR copyrights; // コピーライト HANDLE (WINAPI *Create)( DWORD dwFlags ); void (WINAPI *Release)( HANDLE hExView ); int (WINAPI *Load)( HANDLE hExView, LPCWSTR pFileName, const BYTE* pBuffer, size_t dwBufferSize, BOOL* pKeepBuffer, HDC hDC, HWND hWndLoading, LOADPROGRESS ProgProc, LONG_PTR lProgData ); int (WINAPI *SetViewWindow)( HANDLE hExView, HWND hWnd ); int (WINAPI *Show)( HANDLE hExView, HDC hDC, const LPRECT rcSrc, const LPRECT rcDst, bool bUseHalfToneMode ); int (WINAPI *MessageProc)( HANDLE hExView, UINT msg, WPARAM wParam, LPARAM lParam ); } ExtViewModule; ------------------------------------------------------------------------------- LPCSTR magicStr 識別文字列へのポインタ("DynaExtViewModule"を設定する) DWORD version 構造体のバージョン(現行1を設定する) DWORD flags 拡張モジュールの特性を示すフラグ。次のフラグの組み合わせ。 #define EXTVIEW_ATTR_NONE 0x00000000 #define EXTVIEW_ATTR_NOMEMORYSUPPORT 0x00000001 // Loadにてメモリ入力を // サポートしない。本フラグが設定されるとdyna本体は書庫内のファイルを扱 // う場合には一時ファイルとして解凍する。 DWORD reserved 予約(0を指定) LPCSTR moduleshortname 短いモジュール名 ※今のところ本体未使用 例)ExtViewTest LPCSTR defaultfilter 入力ファイルのデフォルトフィルタ('|'で区切って複数指定) dyna本体のファイル種類設定に自動的に登録されます。 例)*.avi|*.mpg LPCWSTR modulefullname モジュール名 ※今のところ本体未使用 例)Test Ext Viewer v1.0 LPCWSTR copyrights コピーライト ※今のところ本体未使用 ------------------------------------------------------------------------------- HANDLE (WINAPI *Create)( DWORD dwFlags ) 引数 DWORD dwFlags 予約 ※今のところ未使用 戻り値 拡張モジュールのハンドルを返す。 説明 拡張モジュールをインスタンス化し、そのハンドルを返します。以降の関数では 本ハンドルを引数に渡します。DLL内部ではメインのクラスを生成しそのポイン タもしくは識別子などを返答してください。 void (WINAPI *Release)( HANDLE hExView ) 引数 HANDLE hExView Create()で得られたハンドルが渡されます。拡張モジュール側でポインタに 読み替えてください。 説明 ハンドルで指定されたインスタンスを開放します。 ------------------------------------------------------------------------------- int (WINAPI *Load)( HANDLE hExView, LPCWSTR pFileName, const BYTE* pBuffer, size_t dwBufferSize, BOOL* pKeepBuffer, HDC hDC, HWND hWndLoading, LOADPROGRESS ProgProc, LONG_PTR lProgData ) 引数 HANDLE hExView Create()で得られたハンドルが渡されます。拡張モジュール側でポインタに 読み替えてください。 LPCWSTR pFileName ファイル読み込み時は対象ファイル名をフルパスで示します。常にワイド文 字列で渡されます。メモリ読み込み時は読み込み元の仮想ファイル名のフル パスを示します。仮想書庫と書庫内パスは\\で区切られています。 (例:"C:\Data\TestArchive.LZH\\TestData.mpg") const BYTE* pBuffer メモリ読み込み時はファイルが読み込まれたメモリブロックの先頭アドレス を示します。メモリブロックはGlobalAlloc(GMEM_FIXED)で確保されます。 ファイル読み込み時はpFileNameと同じ値が設定されます。 size_t dwBufferSize メモリ読み込み時はファイルを読み込んだメモリブロックのサイズを示しま す。最大で2GB-1。ファイル読み込み時は0です。 BOOL* pKeepBuffer メモリ読み込み時に渡されるメモリブロックを、Load後も保持しておくか開 放するかを指示します。TRUEを設定するとモジュールが解放される(Release 呼び出し直後)までメモリブロックは保持されます。FALSEを設定するとLoad から処理が返された直後にメモリブロックは開放されます。 既定値はFALSEです。 ファイル読み込み時には設定した値は常に無視されます。NULLポインタが渡 されることはありません。 HDC hDC スクリーン全体のデバイスコンテキストが渡されます。 HWND hWndLoading 読み込み用のウィンドウハンドルが渡されます。このウィンドウハンドルを 元に描画したり変更したりしないでください。 ディスプレイの設定を取得したり、画面上に表示されているウィンドウとし てのウィンドウハンドルが必要な場合に使用してください(現在の実装で はDYNAのステータスバーのウィンドウハンドルですが、将来変更される可能 性があります)。描画用のウィンドウハンドルはLoadが成功を返した後に SetViewWindowで設定されます。 LOADPROGRESS ProgProc 進捗状況を更新するコールバック関数が渡されます。利用すると、ステータ スバー左下の進捗バーが更新されます。 LONG_PTR lProgData ProgProc の引数に渡してください。 戻り値 成功したら EXTVIEW_RESULT_OK を返してください。 エラーの場合はEXTVIEW_RESULT_ERROR を返してください。その場合画像ビュア ーには遷移しません。 説明 画像ファイルをロードするために呼ばれます。 ExtViewModule構造体で EXTVIEW_ATTR_NOMEMORYSUPPORT が指定されてる場合は メモリバッファが渡されることはありません。 ------------------------------------------------------------------------------- int (WINAPI *SetViewWindow)( HANDLE hExView, HWND hWnd ) 引数 HANDLE hExView Create()で得られたハンドルが渡されます。拡張モジュール側でポインタに 読み替えてください。 HWND hWnd 描画用のウィンドウハンドルです。このウィンドウに描画を行ってください。 戻り値 成功の場合 EXTVIEW_RESULT_OK を返してください。 エラーを返答する場合でも、画像ビュアーにはすでに遷移しているので次の Show にて何かしらエラーを描画する必要があります。 説明 Loadが成功して、画像ビュアーに遷移すると(画像ビュアーのウィンドウハンド ルが準備できると)呼ばれます。 ------------------------------------------------------------------------------- int (WINAPI *Show)( HANDLE hExView, HDC hDC, const LPRECT rcSrc, const LPRECT rcDst, bool bUseHalfToneMode ) 引数 HANDLE hExView Create()で得られたハンドルが渡されます。拡張モジュール側でポインタに 読み替えてください。 HDC hDC 描画用のデバイスコンテキストが渡されます。 const LPRECT rcSrc 対象元データの描画範囲です。 EXVIEW_MSG_GET_NATIVESIZEを処理しない場合にはウィンドウサイズが入り ます。 const LPRECT rcDst 描画先の位置・大きさです。 EXVIEW_MSG_GET_VIEWSIZEを処理しない場合にはウィンドウサイズが入りま す。 bool bUseHalfToneMode DYNA本体のGDI補間の有無設定が渡されます。必要に応じて使用してくださ い。 戻り値 成功の場合 EXTVIEW_RESULT_OK を返してください。 説明 SetViewWindowが終わった後、ウィンドウサイズ変更後、スクロール・拡縮操作 後、など描画対象エリアを通知するために呼ばれます。 rcDst の範囲外はDYNA本体が背景描画をします。rcDst内はDYNA本体は描画しま せん。 EXVIEW_MSG_GET_NATIVESIZE, EXVIEW_MSG_GETを実装していない(処理していな い)場合、ウィンドウ全体を拡張モジュール側で描画してください。スクロール ・拡縮処理なども実施されません。 ------------------------------------------------------------------------------- int (WINAPI *MessageProc)( HANDLE hExView, UINT msg, WPARAM wParam, LPARAM lParam ) 引数 HANDLE hExView Create()で得られたハンドルが渡されます。拡張モジュール側でポインタに 読み替えてください。 UINT msg ウィンドウメッセージ(WM_xxx および EXVIEW_MSG_xxx)です。 WPARAM wParam ウィンドウメッセージのwParamです。 LPARAM lParam ウィンドウメッセージのlParamです。 戻り値 EXTVIEW_RESULT_DISCARDを返した場合は、DYNA本体はそのメッセージを処理しま せん。それ以外の戻り値の場合は DYNA本体もそのメッセージを処理します。 説明 画像ビュアー(拡張モジュールの描画ウィンドウに設定されているウィンドウ) に送られるWM_xxx がすべて拡張モジュール側にも渡されます。必要なものがあ れば処理してください。戻り値に EXTVIEW_RESULT_DISCARDを返すとその後DYNA 側ではそのメッセージを破棄します。それ以外は通常通り処理します。 ●拡張モジュールへのメッセージ MessageProcでは、WM_xxx 以外にも、DYNA本体が拡張モジュール側に送る独自メッセージ があります。 拡張モジュール側の処理としてはすべてオプショナルで、必要ないもの(処理しないもの )はデフォルトで EXTVIEW_RESULT_NOTIMPL を返してください。 操作系のメッセージも定義されていますが、現在未使用です。動画系以外のビューも考え らるよう、DYNA本体には操作系のメッセージは今のところ実装しない方針です。操作系の 実装は、マウス・キーボードのメッセージ(WM_RBUTTONDOWN, WM_KEYなど)を処理し、モ ジュール側で実装してください。子ウィンドウを作成することで、操作系のパネルを作成 することも可能です。なお、操作系パネルを作成して、かつDYNA本体による拡縮・スクロ ールなどを制御させたい場合は EXVIEW_MSG_GET_NATIVESIZE, EXVIEW_MSG_GET_VIEWSIZE の他に、EXVIEW_MSG_ADJUSTVIEWRECT で必要に応じて操作パネル部分を除外してください。 ------------------------------------- #define EXVIEW_MSG_CONFIG_DIALOG (WM_USER + 0) 説明 未使用(RFU)です。 設定ダイアログを表示する際に送る想定です。 ------------------------------------- #define EXVIEW_MSG_GET_STATE (WM_USER + 1) // wParam:int* 説明 未使用(RFU)です。 再生状態を取得する際に送る想定です。 ------------------------------------- #define EXVIEW_MSG_PLAY (WM_USER + 2) 説明 Create,Load,SetViewWindow が完了したあと、再生するまえに一度だけ送られま す。 処理しない場合は SetViewWindowで再生を開始してください。 ------------------------------------- #define EXVIEW_MSG_STOP (WM_USER + 3) 説明 未使用(RFU)です。 再生状態を停止する際に送る想定です。 ------------------------------------- #define EXVIEW_MSG_PAUSE (WM_USER + 4) 説明 未使用(RFU)です。 再生状態を一時停止する際に送る想定です。 ------------------------------------- #define EXVIEW_MSG_GET_NATIVESIZE (WM_USER + 5) // wParam:SIZE* 説明 描画対象のデータサイズを取得します。データサイズはソースデータのサイズで 、アスペクト比などを考慮する前のものです。 wParamで指定されている SIZE構造体へのポインタに、幅・高さを設定してくだ さい。 本メッセージを処理しない場合、ウィンドウ全体の描画が拡張モジュール側に任 せられます。Showの項も参照してください。 ------------------------------------- #define EXVIEW_MSG_GET_VIEWSIZE (WM_USER + 6) // wParam:SIZE* 説明 描画対象の表示サイズを取得します。データサイズからさらにアスペクト比など を考慮した実際に表示すべき大きさです。データサイズがすでにアスペクト比と マッチしている場合は EXVIEW_MSG_GET_NATIVESIZE と同じ値になります。 wParamで指定されている SIZE構造体へのポインタに、幅・高さを設定してくだ さい。 本メッセージを処理しない場合、ウィンドウ全体の描画が拡張モジュール側に任 せられます。Showの項も参照してください。 ------------------------------------- #define EXVIEW_MSG_GET_DEPTH (WM_USER + 7) // wParam:int* 説明 描画対象のデータの1ドットのビット数を取得します。 ステータスバー右下のサイズ表示に使用されます。 本メッセージを処理しない場合は、0ビットと表示されます。(将来変わる可能 性あり) ------------------------------------- #define EXVIEW_MSG_GET_DURATION (WM_USER + 8) // wParam:long* 説明 描画対象の時間的長さを取得します。 wParamで指定される LONGLONG型へのポインタに格納してください。単位はミリ 秒です。 本メッセージを処理すると、ステータスバー右下に時間表示が追加されます。 また、本メッセージを処理すると、スライドショーにおいては取得した長さの後 に次の画像に移動します。本メッセージを処理しない場合は、スライドショーの 時間設定に応じて次の画像に移動します(デフォルト5秒)。 ------------------------------------- #define EXVIEW_MSG_GET_CURRENTPOS (WM_USER + 9) // wParam:long* 説明 描画対象の現在の時間的位置を取得します。 wParamで指定される LONGLONG型へのポインタに格納してください。単位はミリ 秒です。 EXVIEW_MSG_GET_DURATION を処理した場合に、ステータスバー右下の時間表示の ため呼び出されます。 ------------------------------------- #define EXVIEW_MSG_SEEK_OFS (WM_USER + 10) // wParam:long* #define EXVIEW_MSG_SEEK_ABS (WM_USER + 11) // wParam:long* 説明 未使用(RFU)です。 シーク操作での利用を想定しています。 ------------------------------------- #define EXVIEW_MSG_FRAMESTEP (WM_USER + 12) 説明 未使用(RFU)です。 基本フレームへのシーク操作での利用を想定しています。 ------------------------------------- #define EXVIEW_MSG_VOLUME_GET (WM_USER + 13) // wParam:long* #define EXVIEW_MSG_VOLUME_SET (WM_USER + 14) // wParam:long 説明 未使用(RFU)です。 音量操作での利用を想定しています。 ------------------------------------- #define EXVIEW_MSG_ROTATE_VIEW (WM_USER + 15) // wParam:int 説明 回転操作をした場合に呼ばれます。 wParamには回転角度(現状90か-90)が指定されます。 本メッセージを処理しない場合、回転できない旨のエラーメッセージが表示され ます。 ------------------------------------- #define EXVIEW_MSG_HIDE_CURSOR (WM_USER + 16) // wParam:int 説明 DYNA本体がマウスカーソルを消去・再開する時に呼ばれます。 wParam には 0(=再開)もしくは 1(=消去)が設定されます。 ユーザー操作中など、カーソル消去されたくない場合は EXTVIEW_RESULT_DISCARDを返信してください。 EXTVIEW_RESULT_OK、もしくは処理しない(EXVIEW_RESULT_NOTIMPL)の場合は、 DYNA本体は消去・再開動作を継続します。 一度 DISCARD しても、マウスなど操作後にはまた呼ばれます。 ------------------------------------- #define EXVIEW_MSG_SET_BGCOLOR (WM_USER + 17) // wParam:COLORREF 説明 DYNA本体から、背景色を通知するために使用されます。 wParam には COLORREF値が設定されます。 余白を描画する際にはここで通知された色で描画すると、DYNA本体の背景色と連 携することができます。 ------------------------------------- #define EXVIEW_MSG_ADJUSTVIEWRECT (WM_USER + 18) // wParam:RECT* 説明 DYNA本体が描画範囲を計算する際に呼び出され、拡張モジュール側が描画範囲を 調整することができいます。 wParam にはクライアントウィンドウのRECT構造体へのポインタが入っています。 Show()で指定されるrctDstは画面クライアントウィンドウの大きさを元に計算し ますが、拡張モジュール側で独自にユーザー操作パネルなどを表示している場合 、描画用クライアントウィンドウはそれを除外した範囲で考慮しなくてはいけま せん。そのような場合には、EXVIEW_MSG_ADJUSTVIEWRECT で渡されてきた RECT 構造体の値を変更してください。 ●拡張モジュールからの通知メッセージ 拡張モジュール側から、DYNA本体に通知するメッセージです。 必要に応じて拡張モジュール側の状態変更を知らせるのに利用します。 メッセージは PostMessage か SendMessage で送信してください。 #define EXVIEW_MSG_NOTIFY (WM_USER + 99) // wParam, lParam wParamには次の値を入れます。 ------------------------------------- #define EXVIEW_NC_COMPLETE 1 説明 未使用(RFU)です。 データ読み込みがバックグラウンドで実施されている場合に、その処理が完了し たことを通知することを想定しています。 ------------------------------------- #define EXVIEW_NC_STARTED 2 説明 未使用(RFU)です。 データ読み込みがバックグラウンドで実施されている場合に、再生が開始された ことを通知することを想定しています。 ------------------------------------- #define EXVIEW_NC_PAUSED 3 説明 未使用(RFU)です。 再生が一時停止されたことを通知することを想定しています。 ------------------------------------- #define EXVIEW_NC_SIZE_CHANGED 4 説明 描画対象のサイズが変更されたときに通知します。 DYNA本体はこちらの通知を受けるとウィンドウのサイズを再計算し、拡張モジュ ール側にもEXVIEW_MSG_GET_NATIVESIZE,EXVIEW_MSG_GET_VIEWSIZE, EXVIEW_MSG_ADJUSTRECTにて値を再取得します。 ------------------------------------- #define EXVIEW_NC_LENGTH_CHANGED 5 説明 描画対象の時間的長さが変更された場合に通知します。 DYNA本体はこちらの通知を受け取ると全体時間表示を更新します。