Шрифт:
• Это выглядит примерно так:
• Для решения этой проблемы, вы должны связать код событием 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)|< ?
Воспользуемся для этого двумя изображающими аппаратами, именно систематическими (двоичными) дробями с одной стороны и цепными (непрерывными) дробями — с другой, и оценим потребные для хранения числа а количества информации при каждом из способов представления.
Случай систематических дробей хорошо известен. При разложении числа в двоичную дробь длины m, т. е. при использовании m значащих бит для мантиссы погрешность приближения числа ? составит — (1/2)•2– m = 2-m-1. Поэтому для достижения потребной точности ? мы должны иметь
2– m-1 < ? => -m - 1 < log2 ? => m > -log2 ?
– 1 = log2(1/?) - 1.
Таким образом для достижения точности ? мы должны затратить по меньшей мере
I2(?) = log2 (1/?) — 1 (1)
бит информации.
2. Разложим теперь наше число ? в цепную дробь:
и возьмем в качестве представления числа ? последовательность {а1, а2…., аn}, обрезая цепную дробь на n– м члене, т. е. беря n– ю подходящую дробь (поскольку ? € (0,1), то, очевидно, а0 = 0).