Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 августа!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.

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

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

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

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



<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS