Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВМИиП - Лабораторный практикум на Visual C++ 20...doc
Скачиваний:
2
Добавлен:
13.08.2019
Размер:
650.75 Кб
Скачать

Invalidate();

CView::OnChar(nChar, nRepCnt, nFlags);}

Функция Invalidate() автоматически вызывает функцию OnDraw ().для вывода данных):

void CLab2_1View :: OnDraw (CDC * pDC)

{

CLab2_1Doc* pDoc=GetDocument();

ASSERT_VALID(pDoc);

CSize s1=pDC->GetTextExtent(pDoc->Fio[pDoc->k]);//размер строк

if (pDoc->flag) //flag==true - это нажатие клавиши Enter

{

pDoc->k++; //переход на новую строку

pDoc->flag=false; //сброс флага состояния клавиши Enter

}

for (int i=0; i<((pDoc->k)+1); i++) //вывод на экран к строк

pDC -> TextOut (0, i*s1.cy, pDoc -> Fio[i]);//s1.cy-ширина строки

}

Запустить приложение и протестировать его.

lab2_2 «Управление курсором»

При выполнении приложения lab2_1 чувствовалось отсутствие курсора, также называемого кареткой, мигающей вертикальной черты, определяющей позицию следующего вводимого символа.

Цель работы - создание, отображение и скрытие курсора в окне, ввод символов со смещением курсора в конец текста.

Условие задачи: ввести массив строк ФИО, управляя ввод курсором, отобразить их на экране, использовать клавиши управления Backspace, Enter, Esc.

Создадим проект lab2_2 и повторим этапы lab2_1.

Создание курсора

- Объявить в объекте вида переменную сursor:

//lab2_2View.h

class CLab2_2View: public CView

{

protected;

CLab2_2View();

DECLARE_DYNCREATE(CLab2_2View);

boolean cursor; }

- Инициализировать cursor в конструкторе:

//lab2_2View.cpp

CLab2_2View:: Clab2_2View()

{

cursor=false; }

- Вызвать функцию GetTextMetrics() для заполнения структуры типа TEXTMETRIC. Структура имеет 20 полей и содержит всю информацию для выбора размера курсора:

void CLab2_2View::OnDraw(CDC* pDC)

{

Clab2_2Doc* pDoc=GetDocument();

ASSERT_VALID (pDoc);

if(!p)

return;

If (!cursor)//если курсор еще не создан, надо создать.

{

TEXTMETRIC tm;

PDC->GetTextMetrics(&tm);

}

CSize s1=pDC->GetTextExtent(pDoc->Fio[pDoc->k]);//размер строк

if (pDoc->flag) //flag==true - это нажатие клавиши Enter

{

pDoc->k++; //переход на новую строку

pDoc->flag=false; //сброс флага состояния клавиши Enter

}

for (int i=0; i<((pDoc->k)+1); i++) //вывод на экран к строк

pDC -> TextOut (0, i*s1.cy, pDoc -> Fio[i]);//s1.cy-ширина строки

}

- Создать высоту и ширину курсора . Вызвать функцию Create-SolidCaret(). Высота будет равна высоте символов tm.tmHeight, ширина - 1/8 средней ширины символа tm.tmAveCharWidth/8:

void CLab2_2View::OnDraw(CDC *pDC)

{//…

if (!cursor)//если курсор еще не создан, надо создать.

{

TEXTMETRIC tm;

…pDC->GetTextMetrics (&tm);

CreateSolidCaret(tm.tmAveCharWidth/8, tm.tmHeight);

}//...

}

Установка положения курсора

- Объявить объект положения курсора. Положение курсора будет храниться в объекте класса CPoint с именем pos. Класс CPoint имеет 2 переменные x и y, в которые будут записаны значения координат положения курсора:

//lab2_2View.h

class CLab2_2View: public CView

{

boolean cursor;

CPoint pos;

}

- Созданный курсор поместить в точку (0,0):

void CLab2_2View::OnDraw(CDC* pDC)

{//...

if (!cursor)//если курсор еще не создан, надо создать.

{

TEXTMETRIC tm;

…pDC->GetTextMetrics (&tm);

CreateSolidCaret(tm.tmAveCharWidth/8, tm.tmHeight);

pos.x = pos.y = 0;

}//...

}

-Задать позицию курсора, отобразить курсор на экране, установить логическую переменную cursor в true:

void CLab2_2View::OnDraw(CDC* pDC)

{//...

if (!cursor)//если курсор еще не создан, надо создать.

{

TEXTMETRIC tm;

…pDC->GetTextMetrics (&tm);

CreateSolidCaret(tm.tmAveCharWidth/8, tm.tmHeight);

pos.x = pos.y = 0;

SetCaretPos (pos);//задать позицию курсора

ShowCaret();//отобразить курсор на экране

cursor = true;

}

//...

}

Перемещение курсора при вводе текста

void Clab2_2View::OnDraw(CDC*pDC)

{

Clab2_2Doc* pDoc=GetDocument();

ASSERT_VALID (pDoc);

if (!cursor)//если курсор еще не создан, надо создать.

{

TEXTMETRIC tm;

PDC->GetTextMetrics(&tm);

CreateSolidCaret(tm.tmAveCharWidth/8, tm.tmHeight);

pos.x = pos.y = 0;

SetCaretPos (pos);//задать позицию курсора

ShowCaret();//отобразить курсор на экране

cursor = true;

}

CSize s1=pDC->GetTextExtent(pDoc->Fio[pDoc->k]);//размер строк

if (pDoc->flag) //flag==true - это нажатие клавиши Enter

{

pDoc->k++; //переход на новую строку

pDoc->flag=false; //сброс флага состояния клавиши Enter

}

for (int i=0; i<((pDoc->k)+1); i++) //вывод на экран к строк

pDC -> TextOut (0, i*s1.cy, pDoc -> Fio[i]);//s1.cy-ширина строки

CSize s2=pDC->GetTextExtent(pDoc->Fio[pDoc->k]);//конец строки

HideCaret();//скрыть курсор перед перемещением

pos.x=s2.cx;//присв. объекту курсора конец строки

pos.y=pDoc->k*s1.cy;

SetCaretPos(pos);//перемест. курсор в новое положение

ShowCaret ();//выв. Курсор на экран

}

Скрытие/вывод курсора при потере/получении фокуса

Когда пользователь щелкает внутри другого окна и передает в него фокус, необходимо скрыть мигающий курсор, как это принято в программах для Windows. При потере фокуса ввода наша программа получает сообщение WM_KILLFOCUS (окно теряет фокус), а при получении - сообщение WM_SETFOCUS (окно получает фокус).

- Скрыть курсор при потере фокуса.

Связать с сообщением WM_KILLFOCUS новый обработчик OnKillFocus():

Щелкнуть на вкладке Class View или на команде View->Class View. Появляется окно Class View.

Щелкнуть правой кнопкой на имени класса Clab2_2View и выбрать Properties. Появляется окно Properties.

Щелкнуть на кнопке Message. Появляется список идентификаторов сообщений.

Выбрать элемент WM_ KILLFOCUS, затем щелкнуть на кнопке со стрелкой справа от указанного элемента и выбрать команду <Add> OnKillFocus(). Появляется скелет функции-обработчика OnKillFocus().

Добавить вызов функции скрытия курсора:

void CLab2_2View::OnKillFocus (CWnd* pNewWnd)

{

CView::OnKillFocus (pNewWnd);

HideCaret();//скрыть курсор при потере фокуса

}

- Отобразить курсор при получении фокуса.

Аналогично связать с сообщением WM_SETFOCUS обработчик OnSetFocus():

void CLab2_3View::OnSetFocus (CWnd* pOldWnd)

{

CView::OnSetFocus(pOldWnd);

ShowCaret();//отображение курсора при получении фокуса

}

Запустить приложение и протестировать его.

lab2_3 «Управление мышью»

Цель работы - ввод текста в любом месте экрана с помощью указателя перемещения мыши.

Условие задачи: ввести массив строк ФИО, управляя ввод курсором и мышью, отобразить их на экране, использовать клавиши управления Backspace, Enter, Esc. Щелкнуть мышью в любом месте области, курсор переместится в указанную точку, и затем ввести текст.

Для создания приложения lab2_3 повторить этапы lab2_2.

Обработка сообщения для работы с мышью

- Создать функцию-обработчик

Для обработки сообщения Windows WM_LBUTTONDOWN (нажатие левой кнопки мыши) необходимо добавить новый обработчик OnLButtonDown().

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

{

CView::OnLButtonDown(nFlags, point);

}

Параметр nFlags содержит информацию о состоянии различных служебных клавиш (например, MK_LBUTTON - нажата левая кнопка мыши); параметр point , объект класса CPoint, содержит текущие координаты указателя мыши.

- Сохранить положение указателя мыши

Объявить переменные х и у для хранения координат указателя мыши и добавить код обработки в функцию OnLButtonDown:

//lab2_3View.h : интерфейс класса Clab2_3View

protected:

Clab2_3View();

DECLARE_PYNCREATE (Clab3bView)

CPoint pos;

boolean cursor;