SDI exe でファイルをドロップされた時,関連する異なるファイルを開きたくなった.
次の様に,変換済みのデータが存在している時はそれを対象とする.
https://dev.mish.work/wordpress/2021/03/03/win-prevent-2nd/
ドキュメントクラスの OnOpenDocument で変更するのは可能だが「MRU ファイル リスト」に残ってしまう.
15 年位前に,ブラウザからリンクをドロップして動作させるコードを書いた.
最近のブラウザでは,当時の様な操作はできないみたい.
WM_DROPFILES でリンクのテキストが取れたのだったと思う.
この時,何を参考にしてここにたどり着いたかは不明.
それを見ると CMainFrame::OnDropFiles にコードが書いてある.
デフォルトのコードとしては,CFrameWnd::OnDropFiles を呼出している.
::DragQueryFile でファイル名を取って CWinApp::OpenDocumentFile を呼出している.
CMainFrame::OnDropFiles でファイル名を取った後,処理を追加して CWinApp::OpenDocumentFile を呼べば良い.
手順としては (VC)\…\atlmfc\src\mfc\winfrm.cpp の CMainFrame::OnDropFiles をコピーして編集している.
void CMainFrame::OnDropFiles(HDROP hDropInfo) { SetActiveWindow(); // activate us first ! CWinApp* pApp = AfxGetApp(); ASSERT(pApp != NULL); v_tstring files = ::DropFilesTo(hDropInfo) ; if (files.size() > 0) { tstring file = files[0] ; // ここで,必要に応じてファイル名を変更するなどの処理 pApp->OpenDocumentFile(file.c_str()) ; } ::DragFinish(hDropInfo); // CFrameWnd::OnDropFiles(hDropInfo); }
今回は SDI なのでこんな感じ.MDI であればループで回せば良い.
[…] ドキュメントのドロップ時のファイル名の変更 には対応したが,今度は起動時のドキュメントの変更. InitInstance の所をデバッガで追いかけると,CWinApp::ProcessShellCommand の前後で対応できそう. 次の様に,対象のファイルを変更して起動できることは確認. […]