Форма отчета по лабораторной работе Отчет должен содержать: титульный лист, цель работы, условие задачи, исходные тексты программ с комментариями, скриншот окна с геометрическими фигурами, выводы по работе.
Вопросы для самоконтроля
1. Понятие потока и потоковой многозадачности.
2. Создание потока.
3. Потоковая функция и ее параметр.
4. Синхронизация потоков.
5. Синхронизация процессов.
6. Стандартный класс для задания потока в языке Си++.
Лабораторная работа № 7. Изучение библиотеки классов MFC
Цель и задачи работы, требования к результатам ее выполнения
Цель работы состоит в овладении навыками разработки графического интерфейса пользователя с использованием классов библиотеки MFC (Microsoft Foundation Classes). Для достижения цели необходимо выполнить следующие задачи:
- изучить необходимые учебные материалы, посвященные библиотеке классов MFC [6];
- разработать программу на языке Си++ для решения заданного варианта задания;
- отладить программы;
- представить скриншот окна с результатами работы программы;
- подготовить отчет по лабораторной работе.
Краткая характеристика объекта изучения
Обзор упрощенной иерархии классов библиотеки MFC
Библиотека классов MFC (Microsoft Foundation Classes) первоначальное название Application Framework eXtensions (AFX) используется для программирования графического интерфейса пользователя и решения других задач вместо API- функций Windows.
Для использования библиотеки подключается заголовочный файл afxwin.h.
Упрощенная иерархия некоторых классов библиотеки:
CObject
– CWinThread // Архитектура приложения
• CWinApp // Класс приложение
– CDocTemplate // Классы шаблонов
• CSingleDocTemplate
• CMultiDocTemplate
– CDocument // Класс документа
– CWnd // Поддержка окон
• CFrameWnd // Масштабируемые окна
– CMDIFrameWnd
– CMDIChildWnd
• CDialog // Диалоговые окна
– CColorDialog // Диалоговое окно для выбора цвета
– CFileDialog // Диалоговое окно для выбора файла
• CView // Области просмотра
• CControlBar // Панели элементов управления
– CStatusBar
– CDialogBar
• // Элементы управления
• CAnimateCtrl
• CButton // Кнопка
• CComboBox // Комбинированный список
• CEdit // Поле редактора
• CListBox // Список
• CScrollBar // Полоса прокрутки
• CSliderCtrl // Регулятор
• CStatic
– CException // Особые ситуации
– CFile // Работа с файлами
– CDC // Поддержка графики
• CClientDC
• CWindowDC
• CPaintDC
– CGdiObject // Графические объекты
• CBitmap
• CBrush
• CFont
• CPen
• CRgn
• CPalette
– CMenu // Меню
– CDatabase // Поддержка ODBC
– CDaoDatabase // Поддержка DAO
– CArray // Массивы
– CList // Списки
Классы не порождаемые от CObject:
• CArchive, CRuntimeClass, CPoint, CRect, CString, CTime ,…
Состав простейшего приложения в MFC
Простейшее приложение, создающее окно, состоит как минимум из двух классов:
• класс окна, заголовок имеет вид:
class CMainWin: public CFrameWnd
• класс приложения, заголовок имеет вид:
class CApp: public CWinApp
Обработка сообщений в MFC
Для обработки сообщений необходимо выполнить 3 действия:
- включить в класс макрос
DECLARE_MESSAGE_MAP() // Макрос-
//объявляет очередь сообщений для класса
- включить макрокоманду в очередь сообщений:
BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd)
// Начало очереди сообщений для класса
ON_WM_CHAR() // Ввод символа
ON_WM_LBUTTONDOWN() // Нажатие левой кнопки мыши
ON_WM_LBUTTONUP() // Отпуск левой
// кнопки мыши
ON_WM_MOUSEMOVE() // Перемещение мыши
ON_COMMAND(ID_M1, OnCircle) // Обработка
// элемента меню
ON_WM_PAINT() // Перерисовка
END_MESSAGE_MAP() // Закрыть очередь
// сообщений
• включить в класс функцию-обработчик сообщения, например:
afx_msg void OnChar(UINT Ch, UINT Count, UINT Flags); // Описание в классе
void CMainWin::OnChar(UINT Ch, UINT Count, UINT Flags) {…}
// Определение за пределами класса
Некоторые функции обработчики
Ввод символа:
afx_msg void OnChar(UINT Ch, // Код символа
UINT Count, // Число введенных символов
UINT Flags); // Флаг несущий доп. информацию
// например о нажатие клавиш Ctrl, Shift,..
Нажатие левой кнопки мыши:
afx_msg void OnLButtonDown(UINT Flags,
// Флаг, несущий доп. информацию
CPoint P); // Координаты курсора мыши
Перемещение мыши:
afx_msg void OnMouseMove(UINT Flags, CPoint P);
Выбор элемента меню:
afx_msg void OnCircle();
Перерисовка:
afx_msg void OnPaint();
Вывод графики в MFC
Для рисования в окне используются классы контекстов устройств, производные от класса СDC. Некоторые конструкторы классов контекстов устройств:
• CPaintDC(CWnd* pWnd) // Используется при перерисовке
• CWindowDC(CWnd* pWnd) // Поверхность всего окна
• CСlientDC(CWnd* pWnd) // Клиентская область окна
Заголовки некоторых методов класса CDC:
COLORREF SetPixel(int x, int y, COLORREF crColor);
COLORREF SetPixel(POINT point, COLORREF crColor);
CPoint MoveTo(int x, int y);
CPoint MoveTo(POINT point);
BOOL LineTo(int x, int y);
BOOL LineTo(POINT point);
BOOL Ellipse(int x1, int y1, int x2, int y2);
BOOL Ellipse(LPCRECT lpRect);
BOOL Polygon(LPPOINT lpPoints, int nCount);
BOOL Rectangle(int x1, int y1, int x2, int y2);
BOOL Rectangle(LPCRECT lpRect);
BOOL TextOut(int x, int y, LPCTSTR lpszString, int nCount);
BOOL TextOut(int x, int y, const CString& str);
COLORREF SetTextColor(COLORREF crColor);
COLORREF SetBkColor(COLORREF crColor);
Методы для загрузки объектов в контекст устройства:
virtual CGdiObject* SelectStockObject(int nIndex);
// Загрузить стандартный объект
CPen* SelectObject(CPen* pPen);
CBrush* SelectObject(CBrush* pBrush);
CFont* SelectObject(CFont* pFont);
CBitmap* SelectObject(CBitmap* pBitmap);
int SelectObject(CRgn* pRgn);
Графические объекты
Для задания «пера» используется класс CPen, конструкторы и некоторые методы класса CPen:
CPen();
CPen(int nPenStyle, int nWidth, COLORREF crColor);
BOOL CreatePen(int nPenStyle, int nWidth, COLORREF crColor);
BOOL CreateStockObject(int nIndex);
Для задания «кисти» используется класс CBrush. Конструкторы и некоторые методы класса CBrush:
CBrush();
CBrush(COLORREF crColor);
CBrush(int nIndex, COLORREF crColor);
CBrush(CBitmap* pBitmap);
BOOL CreateSolidBrush(COLORREF crColor);
BOOL CreateHatchBrush(int nIndex, COLORREF crColor);
BOOL CreateStockObject(int nIndex);
В библиотеке классов MFC можно создавать стандартные типы проектов в соответствии с шаблонами, например, можно создать однодокументное приложение (Single document). Классы однодокументного приложения:
class CMyProectApp : public CWinApp // класс-приложение
class CMainFrame : public CFrameWnd // класс главного окна
class CMyProectDoc : public CDocument // класс - документ
class CMyProectView : public CView //класс - представление
Некоторые полезные методы:
Получить документ для представления:
• CDocument* CView::GetDocument();
В главном окне есть методы:
• CDocument* CFrameWnd::GetActiveDocument();
• CView* CFrameWnd::GetActiveView();
В классе приложения есть поле - указатель на главное окно:
• CWnd* m_pMainWnd;
Указатель на объект- приложение можно получить с помощью глобальной функции библиотеки MFC:
• CWinApp * AfxGetApp();
|