Шаг 25.
Библиотека OWL.
Диалоговое окно Save (Сохранение файла)

    На этом шаге мы рассмотрим использование окна Save.

    Использование диалогового окна Save аналогично использованию диалогового окна Open, за исключением используемых флагов объекта TData, как показано в следующем примере.

#include <owl\applicat.h>
#include <owl\framewin.h>
#include <owl\opensave.h>
#include "pr25_1.rc"

//Класс приложения
class TApp: public TApplication
{
  public:
	 TApp():TApplication(){}
	 void InitMainWindow();
};

//Класс основного окна
class TWndw : public TFrameWindow
{
  public:
	 TWndw(TWindow *parent, const char far *title);
  protected:
	 void CmFileSave();

	 DECLARE_RESPONSE_TABLE (TWndw);
};

DEFINE_RESPONSE_TABLE1 (TWndw, TFrameWindow)
  EV_COMMAND(CM_FILESAVE, CmFileSave),
END_RESPONSE_TABLE;

TWndw::TWndw(TWindow *parent, const char far *title):
		  TFrameWindow(parent,title)
{
	// Добавить меню к главному окну.
	AssignMenu("MENU_1");
	// Определить расположение и размеры окна.
	Attr.X=50;
	Attr.Y=50;
	Attr.W=GetSystemMetrics(SM_CXSCREEN)/3;
	Attr.H=GetSystemMetrics(SM_CXSCREEN)/4;
}

// TWndw::CmFileSave()
// Эта функция реагирует на команду Save
// из пункта меню File, отображая диалоговое окно "Сохранить".
void TWndw::CmFileSave()
{
  char errorMsg[81];
  // Создать объект TData диалогового окна.
  TOpenSaveDialog::TData fileData (
	 OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
	  "Текстовые файлы (*.txt)|*.txt|Все файлы (*.*)|*.*|", 0, "\\ DOS", "TXT");
  // Создать диалоговое окно Save.
  TFileSaveDialog *dialog = new TFileSaveDialog(this, fileData);
  // Отобразить диалоговое окно Save.
  int result = dialog->Execute();
  // Ответить на кнопку "OK" диалогового окна.
  if (result == IDOK)
		 MessageBox(fileData.FileName, "Результат выбора", MB_OK);
  else if (fileData.Error != 0)
		 {
			wsprintf(errorMsg,"Возникла ошибка #%ld.", fileData.Error);
			MessageBox(errorMsg, "Ошибка",  MB_OK | MB_ICONEXCLAMATION);
		 }
}


void TApp::InitMainWindow()
{
  TFrameWindow *wndw= new TWndw(0,"Диалоговое окно \"Сохранение файла\"");
  SetMainWindow(wndw);
}

int OwlMain(int,char *[])
{
  return TApp().Run();
}

    Файл ресурсов:

#ifndef WORKSHOP_INVOKED
#include "windows.h"
#endif

#define CM_EXIT       24310
#define CM_FILESAVE     108


#ifdef RC_INVOKED

MENU_1 MENU
{
 POPUP "&File"
 {
  MENUITEM "&Save File...", CM_FILESAVE
  MENUITEM SEPARATOR
  MENUITEM "E&xit", CM_EXIT
 }
}

#endif
Текст этого приложения можно взять здесь.

    Когда вы запускаете эту программу и выбираете из пункта меню File команду Save File, вы увидите на экране диалоговое окно, показанное на рисунке 1.


Рис.1. Стандартное диалоговое окно "Сохранить как"

    Используйте управляющие элементы диалогового окна для выбора имени файла, а затем нажмите кнопку ОК. Если выбранный вами файл уже существует, Windows выведет на экран приведенное на рисунке 2 окно сообщений, запрашивая подтверждение того, что вы хотите записать файл поверх существующего.


Рис.2. Подтверждение перезаписи файла

    Все эти действия происходят внутри функции CmSaveFile(), вызываемой библиотекой OWL при выборе пользователем команды Save File из пункта меню File:

void TWndw::CmFileSave()
{
  char errorMsg[81];
  // Создать объект TData диалогового окна.
  TOpenSaveDialog::TData fileData (
	 OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
	  "Текстовые файлы (*.txt)|*.txt|Все файлы (*.*)|*.*|", 0, "\\ DOS", "TXT");
  // Создать диалоговое окно Save.
  TFileSaveDialog *dialog = new TFileSaveDialog(this, fileData);
  // Отобразить диалоговое окно Save.
  int result = dialog->Execute();
  // Ответить на кнопку "OK" диалогового окна.
  if (result == IDOK)
		 MessageBox(fileData.FileName, "Результат выбора", MB_OK);
  else if (fileData.Error != 0)
		 {
			wsprintf(errorMsg,"Возникла ошибка #%ld.", fileData.Error);
			MessageBox(errorMsg, "Ошибка",  MB_OK | MB_ICONEXCLAMATION);
		 }
}

    Эта функция очень похожа на предыдущую версию, которая управляла диалоговым окном Open. Основное отличие - флаги, которые являются первым аргументом конструктора TData. В данном случае функция устанавливает структуру TData таким образом, чтобы скрыть файлы, предназначенные только для чтения (кроме того, если это файлы только для чтения, пользователь не может переписывать эти файлы), и запросить подтверждение перезаписи. Кроме того, для разнообразия TData устанавливается так, чтобы отобразить по умолчанию текстовые файлы, открыть окно диалога в каталоге DOS и добавлять расширение ТХТ к любому имени файла, введенному пользователем без расширения. Все остальное в функции должно быть вам знакомо.

    На следующем шаге мы рассмотрим использование диалогового окна Color.




Предыдущий шаг Содержание Следующий шаг