- •Кафедра вычислительных систем и программирования высокоуровневые методы информатики и программирования
- •Санкт-Петербург
- •1.Общие положения по организации
- •2. Программирование информационной мини-системы управления методом процедурно-ориентированного программирования (тема 2).
- •2.1. Постановка задачи и проектирование программы
- •2.2. Реализация программы
- •Vyvod(cout, client);
- •Vyvod(outprintf, client);
- •Void dobzap(fstream &dobf)
- •Int tabn;
- •Int operator!(); //элемент-функция класса
- •Int akt::operator!()
- •4. Блоки лабораторных работ по разделу «Объектно-
- •4.1. Блок по теме «Создание Windows-приложений»
- •4.2. Блоки по теме «Управление многооконными
- •4.2.1. Блок «Ввод/вывод информации»
- •Int k;//номер текущей вводимой строки
- •Invalidate();
- •If (!cursor)//если курсор еще не создан, надо создать.
- •Int X,y;//объявить переменные для хранения координат мыши
- •4.2.2. Меню, акселераторы, кнопки
- •Invalidate();
- •Invalidate(); }
- •4.2.3. Диалоговые окна
- •Invalidate();
- •4.2.4. Управление файловой обработкой
- •Invalidate(); //при вводе символа вид объявл. Не действительным
- •Void AddText(uint text) {data.AppendChar(text);} //доб. В конец стр.
- •Invalidate(); //при вводе символа вид объявл. Не действительным
- •Void Serialize(cArchive& archive);//прототип переопред. Функции
- •Void cData::Serialize(cArchive& archive)
- •If (archive.IsStoring())
- •Implement_serial(cData, cObject, 0)//класс,баз. Класс,номер
- •Invalidate();
- •Invalidate();
- •5.2. Блок по теме «Поддержка баз данных»
- •If (m_Add) //если true, то добавление записи
- •5.3. Блок по теме «Программирование для Internet»
- •If (!pIs) //2 проверка подключения компъютера к Internet
- •If (!pIs) //3 проверка подключения
- •If (!pFc) //5 проверка соединения с ftp-узлом
- •6. Рекомендуемая литература
- •7. Содержание
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;