hairy_hats Ответов: 1

Отличительной диспетчер перезапуска автоматическое сохранение от ручного сохранения


Есть ли встроенный способ отличить, вызывается ли мой код сохранения файла из диспетчера перезапуска или из ручного щелчка?

Что я уже пробовал:

Автоматическое сохранение вызывает onsavedocument напрямую, в то время как нажатие на меню File->Save вызывает OnSave, который, в свою очередь, вызывает OnSaveDocument, поэтому я мог бы установить флаг "ручное сохранение" в обработчике событий OnSave, но мне интересно, есть ли встроенный способ отличить их друг от друга.

1 Ответов

Рейтинг:
10

KarstenK

Вы должны реализовать собственный флаг для этого варианта использования. Члена класса bool должно быть достаточно.

Совет: Не забудьте сбросить флаг после использования, чтобы оба случая можно было дифференцировать.


hairy_hats

Самый простой способ, по-видимому, состоит в том, чтобы сравнить запрошенный путь сохранения файла с путем автоматического сохранения в OnSaveDocument и установить соответствующий флаг ручного / автоматического сохранения перед сохранением файла:

BOOL CMyDoc::OnSaveDocument(LPCTSTR lpszPathName) 
{
	CDataRecoveryHandler* autohandler = AfxGetApp()->GetDataRecoveryHandler();
	CString autosavepath = autohandler->GetAutosavePath();
	BOOL success = FALSE;

	if (CString(lpszPathName).Left(autosavepath.GetLength()).CompareNoCase(autosavepath) == 0)
	{
		// autosaving - just call the default
		m_manualSave = false;

		success = CDocument::OnSaveDocument(lpszPathName);
	}
	else
	{
		// manual save - do whatever is needed
		m_manualSave = true;

		success = CDocument::OnSaveDocument(lpszPathName);
	}
	
	return success;
}