コモンダイアログでの上書き保存と新規保存の判定方法について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
wasawasa
記事: 94
登録日時: 11年前

コモンダイアログでの上書き保存と新規保存の判定方法について

#1

投稿記事 by wasawasa » 11年前

こんにちは、何度もお世話になっております。
WinAPIでGetSaveFileName()を用いてファイル保存用のコモンダイアログを使用する場合、OPENFILENAME構造体のFlagsにOFN_OVERWRITEPROMPTを指定する事で、既存のファイルと同じ名前のファイルを保存しようとした時に上書き確認用のメッセージを出す事が出来ますが、この上書き確認用のメッセージを経てファイルを保存しようとした時と上書き確認用のメッセージを出さず通常通りにファイルを保存しようとした時とで別々の動作をさせたいと思いました。(具体的にはCreateFile()の第5引数を前者ではTRUNCATE_EXISTING、後者ではCREATE_ALWAYSという風に使い分けたい)
しかし、このコモンダイアログで上書き確認用のメッセージが出たかどうかを判定する方法が思いつきません。
そこでお聞きしますが、GetSaveFileName()を用いて使用するファイル保存用のコモンダイアログにおいて、上書き確認用のメッセージを経てファイルを保存したかどうかを判定する方法はありますか?どなたかよろしくお願いします。

sleep

Re: コモンダイアログでの上書き保存と新規保存の判定方法について

#2

投稿記事 by sleep » 11年前

残念ながら、wasawasaさんが望んでいるような簡単に実現できる方法は恐らく無いです。
上書き保存のボタンが押されたときのメッセージをspy++のmessage viewなどで調べてフックさせるか
自分でカスタムコモンダイアログを作成するしかないと思われます。
(上記の方法やspy++などについては私は説明するつもりはないので他の方に聞くか自分で調べてください)

しかし、望んでいる動作ではないかもしれませんが
保存時にファイルが存在する場合、しない場合の判定は可能です。
以下のような方法はいかがでしょうか?

コード:

#pragma comment(lib, "Shlwapi.lib")
#include <Shlwapi.h>

#include <windows.h>
#define TITLE TEXT("Kitty on your lap")

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
	static OPENFILENAME ofn = { 0 };
	static TCHAR strFile[MAX_PATH];

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		ofn.lStructSize = sizeof(OPENFILENAME);
		ofn.hwndOwner = hWnd;
		ofn.lpstrFilter = TEXT("Text files {*.txt}\0*.txt\0")
			TEXT("All files {*.*}\0*.*\0\0");
		ofn.lpstrFile = strFile;
		ofn.lpstrDefExt = "txt";
		ofn.nMaxFile = MAX_PATH;
		ofn.Flags = OFN_FILEMUSTEXIST | OFN_OVERWRITEPROMPT;
		return 0;
	case WM_RBUTTONUP:
		if (GetSaveFileName(&ofn))
		{
			if (PathFileExists(ofn.lpstrFile))
				MessageBox(hWnd, "ファイルが見つかった", NULL, 0);
			else
				MessageBox(hWnd, "ファイルが見つからなかった", NULL, 0);
		}
		SetWindowText(hWnd, strFile);
		return 0;
	}
	return DefWindowProc(hWnd, msg, wp, lp);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	PSTR lpCmdLine, int nCmdShow) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style = CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc = WndProc;
	winc.cbClsExtra = winc.cbWndExtra = 0;
	winc.hInstance = hInstance;
	winc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	winc.hCursor = LoadCursor(NULL, IDC_ARROW);
	winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName = NULL;
	winc.lpszClassName = TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
		TEXT("KITTY"), TITLE,
		WS_OVERLAPPEDWINDOW | WS_VISIBLE,
		CW_USEDEFAULT, CW_USEDEFAULT,
		CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, NULL,
		hInstance, NULL
		);

	if (hwnd == NULL) return -1;

	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

wasawasa
記事: 94
登録日時: 11年前

Re: コモンダイアログでの上書き保存と新規保存の判定方法について

#3

投稿記事 by wasawasa » 11年前

sleepさん、返信ありがとうございます。
上書き確認メッセージの有無の確認が容易ではない事は残念ですが、提示して頂いた方法で代用できそうなので試してみたいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る