Чтение онлайн

на главную - закладки

Жанры

Интернет-журнал "Домашняя лаборатория", 2007 №1
Шрифт:

• Вы объявили две переменные целого типа для хранения предыдущих координат мыши. Заметьте, что вы их включили после слова public: — это означает, что эти переменные доступны всем функциям класса.

• Теперь модифицируем функцию OnMouseMove в файле DrawDIg.cpp

void CDrawDIg::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

////////Мой код начинается здесь///////////

if((nFlags & MK_LBUTTON)==MK_LBUTTON)

{

CCIientDC dc(this);

// dc.SetPixel(point.x, point.y, RGB(123,211,98));

CPen NewPen(PS_SOLID, 10, RGB(255,0,0);

dc.SelectObject(&NewPen);

dc.MoveTo(m_PrevX, m_PrevY);

dc.LineTo(point.x, point.y);

m_PrevX=poi nt.x;

m_PrevY=poi nt.y;

}

////////Мой

код заканчивается здесь///////////

CDialog::OnMouseMove(nFlags, point);

}

• Рассмотрим код приведенный выше:

• Код вызова функции SetPixel, помещен в комментарий, так как он нам больше не понадобиться.

• Следующий код CPen NewPen(PS_SOLID, 10, RGB(255,0,0)) создает новое перо с именем NewPen класса СРеn с заданным размером шрифта 10 пикселов и красным цветом. Параметр PC_SOLID говорит, что будет рисоваться сплошная линия.

• После этого выполняется функция SelectObject, выбирающая новое перо:

dc.SelectObject(&NewPen);

Этой функцией вы включаете перо в работу.

• Следующие два оператора:

dc.MoveTo(m_PrevX, m_PrevY);

dc.LineTo(point.x, point.y);

рисуют линию, используя координаты начала(это определяет функция MoveTo) и координат конца (LineTo).

• И последний два оператора:

m_PrevX=point.x;

m_P revY=point.y;

сохраняют в переменных m_PrevX и m_PrevY, текущие координаты, которые в следующий раз будут использоваться, как предыдущие(начальная позиция).

• Теперь запустите программу и проверьте правильность ее работы.

• Вы должны заметить, что при первом нажатии на кнопку мышки в любой области диалоговой панели, есть лишняя линия, которая выходит из краев окна. Дело в том, что вы при первом рисовании линии, т. е после первого щелчка мыши и ее передвижении, начальные координаты не определены, а будут известны только текущие.

• Это выглядит примерно так:

• Для решения этой проблемы, вы должны связать код событием WM_LBUTTONDOWN, которое происходит при нажатии на левую кнопку мыши.

• Выберете ClassWizard в меню View

• Выберете закладку Message Maps в панели ClassWizard

• Используйте диалоговую панель ClassWizard для выбора следующего события:

Class Name: CDrawDIg

Object ID: CDrawDIg

Messages: WM_LBUTTONDOWN

• Щелкните на кнопку Add Fucntion.

• Нажмите кнопку Edit Code и напишите следующий

код в функции OnLButtonDown:

void CDrawDlg::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

////////Мой код начинается здесь///////////

m_PrevX=point.x;

m_PrevY=point.y;

////////Мой код заканчивается здесь///////////

}

• Код, который вы напечатали, обновляет значения переменных m_PrevX и m_PrevY, тем местоположением мыши, где был совершен щелчок по ее левой кнопке, соответственно при первом и последующих нажатиях кнопки, линия будет начинаться из данной точки нажатия.

• Поэкспериментируйте с программой Draw и щелкните на кнопку Exit для ее прекращения.

Резюме и Упражнение

Упражнение

Сделайте так, чтобы линия, которую вы рисуете была шириной 5 пикселов.

Ответ к упражнению

Для того, чтобы выполнить упражнение вам необходимо изменить код функции OnMouseMove следующим образом:

void CDrawDlg::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

////////Мой код начинается здесь///////////

if((nFlags 8l MK_LBUTTON)==MK_LBUTTON)

{

CCIientDC dc(this);

// dc.SetPixel(point.x, poi nt.y, RGB(123,211,98));

CPen NewPen(PS_SOLID, 5, RGB(255,0,0);

dc.SelectObject(&NewPen);

dc.MoveTo(m_PrevX, m_PrevY);

dc.LineTo(point.x, point.y);

m_PrevX=poi nt.x;

m_PrevY=poi nt.y;

}

////////Мой код заканчивается здесь///////////

CDialog::OnMouseMove(nFlags, point);

}

Резюме

Вы создали и выполнили программу Draw.exe, с помощью которой вы можете рисовать, путем передвижения мыши, при нажатой ее левой кнопки. Также вы познакомились с функцией OnMouseMove, которая выполняется при передвижении мыши, и с функцией OnLButtonDown — при нажатии на левую кнопку мыши.

Вы закончили третий урок!

МАТЕМАТИЧЕСКИЙ ПРАКТИКУМ

Задачи с решениями

Ведет Данила Мастер

1. Положим, что мы хотим приблизить вещественное число ??(0,1) с точностью ? т. е. подобрать с помощью некоторого изображающего аппарата рациональное число — так чтобы p/q

| ? — (p/q)|< ?

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

Поделиться:
Популярные книги

Имя нам Легион. Том 6

Дорничев Дмитрий
6. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 6

Найди меня Шерхан

Тоцка Тала
3. Ямпольские-Демидовы
Любовные романы:
современные любовные романы
короткие любовные романы
7.70
рейтинг книги
Найди меня Шерхан

Темный Лекарь 7

Токсик Саша
7. Темный Лекарь
Фантастика:
попаданцы
аниме
фэнтези
5.75
рейтинг книги
Темный Лекарь 7

Барон Дубов 5

Карелин Сергей Витальевич
5. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов 5

Внебрачный сын Миллиардера

Громова Арина
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Внебрачный сын Миллиардера

Последний из рода Демидовых

Ветров Борис
Фантастика:
детективная фантастика
попаданцы
аниме
5.00
рейтинг книги
Последний из рода Демидовых

Черный Маг Императора 12

Герда Александр
12. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 12

Черный Маг Императора 10

Герда Александр
10. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 10

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Часовая битва

Щерба Наталья Васильевна
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Часовая битва

Голодные игры

Коллинз Сьюзен
1. Голодные игры
Фантастика:
социально-философская фантастика
боевая фантастика
9.48
рейтинг книги
Голодные игры

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Архонт

Служанка. Второй шанс для дракона

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Служанка. Второй шанс для дракона

Адаптация

Уленгов Юрий
2. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Адаптация