C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




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

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();
    ...

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

Пользовательские цвета

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