////////////////////////////////////////////////////////////////////////////////
開発環境 : Visual C++ 6.0
動作環境 : Windows 98 Second Edition
MFC使用 MDIベース
////////////////////////////////////////////////////////////////////////////////
現在、MDIのプログラムを作っておりシリアル化などの実装も終わり、データをファイルとして
保存することができるようなっています。ここで、フォルダ上でこのファイルを一度に複数選択
し、.exeのアイコン上にドロッグ・アンド・ドロップして、一度に全てのファイルを開くよう
にしたいと思ったのですが、できるのでしょうか。現在、同様のことを行うと、ファイルが一つ
しか開かれません。
皆さん、お忙しいとは思いますが、何かお気づきな点があれば教えてください。よろしくお願
いします。
C*App::InitInstance()にある
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if (!ProcessShellCommand(cmdInfo))
return FALSE;
がEXEに渡された引数の解析と実行をしていますが、
ファイル1つにしか対応していません。
まず、CCommandLineInfoの派生クラスを作って、
CCommandLineInfo::ParseParamをオーバーライドし、
複数のファイルに対応させます。
また、CWinApp::ProcessShellCommandを真似して
複数ファイルを開く処理を記述する必要があります。
dairygoodsさん、早速のお返事ありがとうございます。
一見、読んだ感じだと私には難しそうな気がしましたが、少しやってみます。
やってみよう!とは思ったものの、やはり、私にはまだまだ難しそうで、今回はあきらめようか
と思いました。独自のファイルが大量にできてしまい、ひとつひとつ開いていくのは大変だった
ので何とかいい方法はないかとは思っていたのですが、他の方法を探してみようかと思います。
CWinAppの中身などは、あまり見たことがないのですが、いろいろ見てみると勉強になりそうで
すね。最後になりましたが、いつもいつものことで恐縮ですが、dairygoodsさん、今回もあり
がとうございました!
ちょっと別のところにも書いたのですが、簡単に試してみました。参考になればと思います。
CClientDC mydc(this);
for(int i=0; i<__argc; i++)
mydc.TextOut(0, 20*i, __argv[i]);
ドラッグ&ドロップ出来る数って、制限有り?という結果でした。
> ヘルプに見つからないので参考まで。使えているので。
> __argv[1]で、1つめのパスがショートファイルネームで取得できます。
> ロングファイルネームにして下さい。
> __argcも、普通のmain(int argc, char *argv[])と同じ。
デバッガで追ってみれば、そんなに大したことをしているわけでは
ないことが分かると思いますよ。
引数1つ1つがParseParamに渡されるので
それを覚えておけばよいだけです。
ご参考まで。
class CMultiFileCommandLineInfo : public CCommandLineInfo
{
public:
void ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast)
{
CCommandLineInfo::ParseParam(lpszParam, bFlag, bLast);
if (!bFlag) {
m_files.Add(lpszParam);
}
}
CStringArray m_files;
};
BOOL CxxApp::InitInstance()
{
...
// DDE、file open など標準のシェル コマンドのコマンドラインを解析します。
CMultiFileCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// コマンドラインでディスパッチ コマンドを指定します。
if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen) {
for (int i = 0; i < cmdInfo.m_files.GetSize(); i++) {
if (!OpenDocumentFile(cmdInfo.m_files[i]))
return FALSE;
}
} else {
if (!ProcessShellCommand(cmdInfo))
return FALSE;
}
...
}