Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 11276 / 456 | Оценка: 4.12 / 4.01 | Длительность: 19:20:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 19:

Библиотека классов MFC среды проектирования Visual Studio .NET. Диалоги

< Лекция 18 || Лекция 19: 1234 || Лекция 20 >

Стандартные диалоги

Класс CCommonDialog - это базовый класс, инкапсулирующий поведение стандартных диалогов Windows. Библиотека MFC содержит классы стандартных диалогов, производных от CCommonDialog, включая следующие:

  • CFileDialog
  • CFontDialog
  • CColorDialog
  • CPageSetupDialog
  • CPrintDialog
  • CPrintDialogEx
  • CFindReplaceDialog
  • COleDialog

Для использования класса CCommonDialog следует подключить заголовочный файл afxdlgs.h.

Класс CFileDialog

Класс CFileDialog инкапсулирует поведение диалогов Open и Save As. Для работы с объектом типа CFileDialog сначала следует создать этот объект, используя конструктор, а затем управлять данным компонентом через поля структуры m_ofn типа OPENFILENAME.

Структура OPENFILENAME содержит информацию, используемую функциями GetOpenFileName и GetSaveFileName для инициализации диалогов Open или Save As .

Структура OPENFILENAME имеет следующее определение:

typedef struct tagOFN { 
  DWORD lStructSize;     // Длина структуры в байтах
  HWND hwndOwner;       // Дескриптор окна владельца 
                // данного диалога или NULL
  HINSTANCE hInstance; 
  LPCTSTR lpstrFilter;  // Указатель на буфер, содержащий 
                 // пары null-ограниченных строк: 
                // первая строка - это описание 
                // фильтра (например: "Программы"), 
                // вторая строка - шаблон 
                // (например: "*.exe;*.com")"
  LPTSTR lpstrCustomFilter; 
  DWORD  nMaxCustFilter; 
  DWORD  nFilterIndex; 
  LPTSTR lpstrFile;     // Указатель на буфер, 
                   // который  содержит 
                // имя файла, используемое для 
                // инициализации поля File Name, 
              // или NULL. При успешном завершении 
              // функции GetOpenFileName или 
              //GetSaveFileName поле содержит 
              // логический диск, путь и имя 
              // выбранного файла.
  DWORD   nMaxFile; 
  LPTSTR  lpstrFileTitle; // Указатель на буфер, 
      // содержащий имя и расширение выбранного файла
  DWORD     nMaxFileTitle; 
  LPCTSTR  lpstrInitialDir; // Указатель на null- 
      // ограниченную строку, которая представляет каталог, 
      // используемый для инициализации диалога
  LPCTSTR       lpstrTitle; 
  DWORD         Flags; 
  WORD          nFileOffset; 
  WORD          nFileExtension; 
  LPCTSTR       lpstrDefExt; 
  LPARAM        lCustData; 
  LPOFNHOOKPROC lpfnHook; 
  LPCTSTR       lpTemplateName; 
#if (_WIN32_WINNT >= 0x0500)
  void *        pvReserved;
  DWORD         dwReserved;
  DWORD         FlagsEx;
#endif // (_WIN32_WINNT >= 0x0500)
} OPENFILENAME, *LPOPENFILENAME;
Листинг 19.2.

Если метод DoModal, используемый для отображения диалога типа CFileDialog, возвращает значение IDOK, то для получения информации об имени файла можно использовать методы члены класса CFileDialog.

Если предполагается разрешить пользователю одновременно выбрать более одного файла, то до вызова метода DoModal следует установить флаг OFN_ALLOWMULTISELECT.

Например:

OPENFILENAME ofn;    // Данные для диалога
char szFile[260];    // Буфер для имени файла
HWND hwnd;           // Окно - владелец отображаемого диалога
HANDLE hf;           // Дексриптор файла
// Инициализация структуры OPENFILENAME
ZeroMemory(&ofn, sizeof(OPENFILENAME)); // Макрос, 
              // заполняющий нулями указанный блок памяти
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "Все\0*.*\0Текстовые\0*.TXT\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// Отображение диалога Open 
if (GetOpenFileName(&ofn)==TRUE) 
    hf = CreateFile(ofn.lpstrFile, GENERIC_READ,
        0, (LPSECURITY_ATTRIBUTES) NULL,
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
        (HANDLE) NULL);

Класс CFileDialog содержит поле m_ofn, которое является структурой типа OPENFILENAME, используемой для инициализации диалогов Open и Save As.

Для создания данного диалога применяется следующий конструктор:

CFileDialog( BOOL bOpenFileDialog, 
  LPCTSTR lpszDefExt = NULL,
 LPCTSTR lpszFileName = NULL, 
 DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
 LPCTSTR lpszFilter = NULL, 
 CWnd* pParentWnd = NULL,
 DWORD dwSize = sizeof( OPENFILENAME ));

Параметр bOpenFileDialog определяет тип создаваемого диалога: значение TRUE указывает диалог Open, а FALSE - диалог Save As. Параметр lpszDefExt указывает используемое по умолчанию расширение файла. Если пользователь не вводит расширение файла в поле File name, то данное значение автоматически добавляется к имени файла. Если значение этого параметра равно NULL, то расширение не добавляется. Параметр lpszFileName - это NULL или имя файла, отображаемое при открытии данного диалога. Параметр dwFlags определяет флажки, используемые для настройки диалога; lpszFilter - это пары строк, определяющие фильтры для выбора файлов. При использовании структуры типа OPENFILENAME строки фильтра следует ограничивать символом '\0', а в данном параметре следует использовать символ |. Параметр pParentWnd - это указатель на окно владелец или родительское окно данного диалога. Размер структуры OPENFILENAME указывается параметром dwSize.

Например:

void CMyDlg::OnFileOpen() 
{
   // szFilters - строка с описанием и шаблоном фильтров
   char CMyDlg::szFilters[]=
      "Текстовые файлы (*.txt)|*.my|Все файлы(*.*)|*.*||";
   // Создание диалога Open, использующего 
   // для отображаемых файлов расширение txt
   CFileDialog fileDlg = new CFileDialog (TRUE, 
                      "txt", 
                      "*.txt",
                      OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, 
                      szFilters, 
                      this);
   if( fileDlg.DoModal ()==IDOK ) // Отображение диалога
   {
      CString pathName = fileDlg.GetPathName();  
      CString fileName = fileDlg.GetFileTitle ();
   }
}

Отображение диалога стандартного Open также можно выполнить вызовом метода GetOpenFileName.

Например:

if (GetOpenFileName(&ofn)==TRUE) 
    hf = CreateFile(ofn.lpstrFile, GENERIC_READ,
        0, (LPSECURITY_ATTRIBUTES) NULL,
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
        (HANDLE) NULL);
Класс CColorDialog

Класс CColorDialog предназначается для реализации стандартного диалога Color, используемого для выбора цвета. Структура CHOOSECOLOR применяется для инициализации диалога. Для отображения стандартного диалога Color вызывается метод ChooseColor.

Например:

CHOOSECOLOR cc;     // Структура для инициализации диалога
static COLORREF acrCustClr[16]; // Массив цветов 
HWND hwnd;                      // Окно владелец
HBRUSH hbrush;                  // Указатель кисти
static DWORD rgbCurrent;  // Первоначально выбранный цвет
ZeroMemory(&cc, sizeof(cc));
cc.lStructSize = sizeof(cc);
cc.hwndOwner = hwnd;
cc.lpCustColors = (LPDWORD) acrCustClr;
cc.rgbResult = rgbCurrent;
cc.Flags = CC_FULLOPEN | CC_RGBINIT;
 
if (ChooseColor(&cc)==TRUE) {
    hbrush = CreateSolidBrush(cc.rgbResult);
    rgbCurrent = cc.rgbResult; 
}
< Лекция 18 || Лекция 19: 1234 || Лекция 20 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);