複数のファイルをドロッグ・アンド・ドロップで一度に開くには – プログラミング – Home

複数のファイルをドロッグ・アンド・ドロ...
 
通知
すべてクリア

[解決済] 複数のファイルをドロッグ・アンド・ドロップで一度に開くには


はまち
 はまち
(@はまち)
ゲスト
結合: 23年前
投稿: 146
Topic starter  

////////////////////////////////////////////////////////////////////////////////

開発環境 : Visual C++ 6.0
動作環境 : Windows 98 Second Edition
      MFC使用  MDIベース

////////////////////////////////////////////////////////////////////////////////

現在、MDIのプログラムを作っておりシリアル化などの実装も終わり、データをファイルとして
保存することができるようなっています。ここで、フォルダ上でこのファイルを一度に複数選択
し、.exeのアイコン上にドロッグ・アンド・ドロップして、一度に全てのファイルを開くよう
にしたいと思ったのですが、できるのでしょうか。現在、同様のことを行うと、ファイルが一つ
しか開かれません。
 皆さん、お忙しいとは思いますが、何かお気づきな点があれば教えてください。よろしくお願
いします。


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

C*App::InitInstance()にある

CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);

if (!ProcessShellCommand(cmdInfo))
return FALSE;

がEXEに渡された引数の解析と実行をしていますが、
ファイル1つにしか対応していません。

まず、CCommandLineInfoの派生クラスを作って、
CCommandLineInfo::ParseParamをオーバーライドし、
複数のファイルに対応させます。

また、CWinApp::ProcessShellCommandを真似して
複数ファイルを開く処理を記述する必要があります。


返信引用
はまち
 はまち
(@はまち)
ゲスト
結合: 23年前
投稿: 146
Topic starter  

dairygoodsさん、早速のお返事ありがとうございます。

一見、読んだ感じだと私には難しそうな気がしましたが、少しやってみます。


返信引用
はまち
 はまち
(@はまち)
ゲスト
結合: 23年前
投稿: 146
Topic starter  

やってみよう!とは思ったものの、やはり、私にはまだまだ難しそうで、今回はあきらめようか
と思いました。独自のファイルが大量にできてしまい、ひとつひとつ開いていくのは大変だった
ので何とかいい方法はないかとは思っていたのですが、他の方法を探してみようかと思います。
CWinAppの中身などは、あまり見たことがないのですが、いろいろ見てみると勉強になりそうで
すね。最後になりましたが、いつもいつものことで恐縮ですが、dairygoodsさん、今回もあり
がとうございました!


返信引用
q55
 q55
(@q55)
ゲスト
結合: 22年前
投稿: 6
 

ちょっと別のところにも書いたのですが、簡単に試してみました。参考になればと思います。
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[])と同じ。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

デバッガで追ってみれば、そんなに大したことをしているわけでは
ないことが分かると思いますよ。

引数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;
}

...
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました