Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Уроки по Visual C++ (MFC, платформа .NET)


Информационный Канал Subscribe.Ru

Visual C++. MFC. Уроки по программированию с сайта http://progs.biz

Рассылка №43

Visual C++. MFC. Урок 37. Стандартный диалог для открытия/сохранения файла.
Visual C++. MFC. Урок 38. Стандартный диалог для выбора цвета.

Полные версии уроков (с картинками) можно найти по адресам
Урок 37. Стандартный диалог для открытия/сохранения файла.
Урок 38. Стандартный диалог для выбора цвета.

Visual C++. MFC. Урок 37. Стандартный диалог для открытия/сохранения файла

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

Для диалогов, предназначенных для открытия и сохранения файла, предназначен один и тот же класс - CFileDialog. Сейчас мы с вами и посмотрим, как с ним можно работать.

Запустите Visual C++ и создайте новый проект типа MFC AppWizard (EXE). Для определенности задайте ему имя CFileDialog. На первом шаге мастера выберите тип проекта, основанный на диалоге. В последующих шагах мастера все оставьте без изменений, только на шаге 2 уберите галочку ActiveX Controls (они нам не нужны, так что не будем усложнять себе код).

После создания проекта перейдите на вкладку ResourceView и добавьте к нашему проекту меню с одним пунктом (добавляем меню верхнего уровня Options и его подменю FileOpen).

Имя идентификатора для меню можно оставить без изменений (IDR_MENU1).

Наше меню еще не подсоединено к форме. Для его подсоединения выберете идентификатор меню (IDR_MENU1) в combobox'е menu в окне свойств нашего диалогового окна.

Теперь добавьте обработчик для добавленного пункта меню FileOpen (с помощью ClassWizard'а).

Приступаем к написанию кода. В созданный обработчик добавьте следующий код:

void CCFileDialogDlg::OnOptionsFileopen()
{
    // TODO: Add your command handler code here
    CFileDialog dlg(TRUE);
    dlg.DoModal();
}

В написанном коде пояснений требует разве что конструктор. Он, как вы видите вызывается с параметром TRUE. Это означает, что будет создан стандартный диалог для открытия файлов. Если же в качестве параметра указать FALSE, то создастся стандартный диалог для сохранения файла (Save As...).

Программу можно запустить - при выборе нашего пункта меню будет показан диалог для открытия файла.

Теперь посмотрим, как можно изменять свойства диалогового окна. За это отвечает свойство m_ofn. Давайте, для примера, создадим диалоговое окно с заголовком "Открытие 123-файлов", с фильтрами для показа 123- и всех файлов и с начальной директорией c:\tmp. Кроме того, после закрытия диалогового окна мы покажем в messagebox'ах имя выбранного файла (с путем и без).

    ...
    CFileDialog dlg(TRUE);
    //Создаем фильтр
    dlg.m_ofn.lpstrFilter="123-файл\0*.123\0Все файлы\0*.*\0\0";
    //Делаем активным фильтр "Все файлы|*.*"
    dlg.m_ofn.nFilterIndex=2;
    //Задаем начальную директорию
    dlg.m_ofn.lpstrInitialDir="c:\\tmp";
    //Задаем заголовок диалогового окна
    dlg.m_ofn.lpstrTitle="Открытие 123-файлов";
    //Показывваем диалог
    dlg.DoModal();
    //Показываем имя открытого файла без пути
    MessageBox(dlg.m_ofn.lpstrFileTitle);
    //Показываем имя открытого файла с полным путем
    MessageBox(dlg.m_ofn.lpstrFile);
    ...

Назначение параметров ясно из комментариев. Обратите внимание на то, как задается фильтр. Он делится на пары строк - описание фильтра и расширения файлов, каждая такая строка заканчвается на нуль-символ (\0), в конце же этого свойства мы должны поставить два нуль-символа. Отметьте также, что нумерация для задания начального фильтра (подсвойство nFilterIndex) начинается с единицы.

После запуска программы при выборе меню появится стандартный диалог для открытия файлов.

Диалог для сохранения файлов работает точно также. Как уже говорилось, для его создания необходимо в конструкторе указать параметр FALSE.

Наверх

Visual C++. MFC. Урок 38. Стандартный диалог для выбора цвета

Это занятие мы посвятим изучению встандартного диалога для выбора цвета. Этот диалог представляет из себя экземпляр класса CColorDialog. Он, как и другие классы для стандартных диалоговых окон, является прямым потомком класса CCommonDialog. В созданном нами примере в этом диалоговом окне мы сможем задать цвет квадрата, который будет рисоваться на форме.

Создайте с помощью мастера AppWizard заготовку для приложения с SDI-интерфейсом. Все остальные установки AppWizard'а можно оставить без измененний. Добавьте с помощью редактора меню новое меню верхнего уровня Options и подменю для него Color. В добавленный с помощью ClassWizard'а обработчик для меню (обработчик должен принадлежать классу Вида) добавьте следующий код:

void CColorDialogView::OnOptionsColor()
{
    // TODO: Add your command handler code here
    CColorDialog dlg;
    dlg.DoModal();
}

Как вы видите, мы действуем как всегда - создаем в обработчике экземпляр диалогового окна и показываем его методом DoModal(). Только раньше мы создавали экземпляр нашего класса, а теперь - уже существующего в MFC. Разумеется, мы должны где-то в первых строчках этого файла добавить ссылку на заголовочный файл для нашего диалога (его имя выясняется из справки по классу CColorDialog):

...
#include <afxdlgs.h>
 ...

Теперь при выборе пункта меню будет показываться стандартное диалоговое окно для выбора цвета.

Сейчас нам надо передавать выбранный пользователем цвет в основное окно нашей программы. Для этого, во-первых, заведите в классе Вида переменную для хранения цвета типа COLORREF:

public:
    COLORREF m_color;
    ...

Далее измените обработчик для меню Color следующим образом:

void CColorDialogView::OnOptionsColor()
{
    CColorDialog dlg;
    dlg.m_cc.rgbResult=m_color;
    dlg.DoModal();
    m_color = dlg.m_cc.rgbResult;
    Invalidate();
}

Как вы видите, цвет передается через поле rgbResult структуры m_cc.

Теперь осталось только написать код для рисования квадратика нужного цвета. Это мы делаем в методе OnDraw класса Вида:

void CColorDialogView::OnDraw(CDC* pDC)
{
    CColorDialogDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    CBrush *br=new CBrush; //Заводим новую кисть
    br->CreateSolidBrush(m_color); //Создаем кисть цвета m_color
    pDC->SelectObject(br);  //Приписываем кисть к контексту устройства
    pDC->Rectangle(10, 10, 40, 40); //Рисуем
}

Теперь при запуске программы мы можем задавать нужный нам цвет посредством стандартного диалогового окна.

Работает наш диалог как положено - даже пользовательские цвета запоминает.

Но вот беда - при первом вызове программы пользовательские цвета все белые. Давайте посмотрим, как их можно заполять с самого начала. Всего пользовательских цветов 16 штук, так что давайте в классе Вида определим массив из 16 элементов типа COLORREF:

public:
    COLORREF m_color;
    COLORREF m_CustomColors[16];
    ...

Инициализируем этот массив в конструкторе класса Вида:

CColorDialogView::CColorDialogView()
{
    // TODO: add construction code here
    //Заполняем массив градациями серого
    for(int i=0; i<16; i++){
        m_CustomColors[i]=RGB(16*i,16*i,16*i);
    }
}

Укажем наш массив в качестве источника цветов для диалога для задания цвета:

void CColorDialogView::OnOptionsColor()
{
    CColorDialog dlg;
    //Передаем адрес массива в диалог
    dlg.m_cc.lpCustColors=m_CustomColors;
    dlg.m_cc.rgbResult=m_color;
    dlg.DoModal();
    ...

Вот и все. Теперь при наш диалог сразу будет иметь начальные пользовательские цвета.

С этим уроком все!

Наверх

Другие рассылки с сайта progs.biz

Рассылки Subscribe.Ru
Уроки по Java

Уроки по Java с самого начала. Основные конструкции языка, классы в Java, создание приложений с графическим интерфейсом, создание апплетов, работа в JBuilder от Borland'а, сетевые приложения.


Copyright Алексеев Игорь, 2002

Copyright cайт progs.biz, 2002



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное