Контрольная работа: Общая информация про MFC. Иерархия классов MFC. Место MFC в среде разработчика Visual C++
В традиционных Windows-программах контекст устройства получают вызовом функции GetDC() , а освобождают с помощью ReleaseDC() . Поскольку Windows может предоставить лишь небольшое количество контекстов, важно, чтобы программа освободила контекст после окончания работы с ним. MFC имеет соответствующие классы, способные руководить этим процессом. В частности, при создании экземпляра объекта типа CClientDC программе предоставляется контекст устройства. Если этот объект необходимо изъять, вызывается функция ReleaseDC() и контекст устройства автоматически освобождается. Конструктор класса СClientDC записывается в виде:
СClientDC (CWnd *Windows);
где параметр Windows является указателем на окно, которому предоставляется контекст устройства. Для активного окна можно указать ключевое слово this.
Вывод в клиентскую область окна программы может обеспечиваться с помощью функции TextOut() :
virtual BOOL CDC::TextOut(int X, int Y, LPCSTR lpszStr, int Length);
где X, Y – координаты точки начала вывода в пикселях (относительно левого верхнего угла окна программы), lpszStr – указатель на строку, которая выводится, а Length – его длина. Пример иллюстрирует возможный вариант реализации обработчика нажатия клавиш клавиатуры - в точку (1, 1) окна программы.
Пример обработчика нажатия клавиш клавиатуры
char str [80]; // строка символов для вывода
void CMainWin::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{CClientDC dc(this); // получение контекста окна
dc.TextOut(1,1," ", 3); // удаление старого текста
wsprintf(str,"%с", ch); // формирование строки с кодом клавиши
dc.TextOut(1, 1, str, strlen(str)); // вывод строки в координату (1, 1)
}
Таким образом, каждый раз, когда необходимо вывести информацию в рабочую область окна, необходимо получить контекст устройства с помощью CClientDC. Частным случаем является применения сообщения WM_PAINT.
Обновление содержимого рабочей области окна программы
Для обновления содержимого рабочего окна программы необходимо отослать сообщение WM_PAINT. Вне его применения содержимое окна может не отображаться. Т.е. каждый раз, когда есть потребность выводить информацию в окно программы, следует обращаться к этому сообщению.
Сообщению WM_PAINT отвечает макрокоманда ON_WM_PAINT(), а макрокоманде – обработчик OnPaint() . Этот обработчик может выглядеть следующим образом:
Пример обработчика сообщения WM_PAINT
void CMainWin::OnPaint()
{CPaintDC dc(this); // получение контекста окна
dc.TextOut(1,1, str, strlen(str)); // отображение символа
}
В примере приведен обработчик OnPaint() , который обеспечивает вывод на экран символа, введенного с клавиатуры пользователем соответственно обработчику OnChar() , записанному в предыдущем примере. Видно, что для получения контекста устройства здесь использован объект другого типа, а именно CPaintDC. В отличие от CClientDC, который работает только с клиентской частью окна программы, CPaintDC обеспечивает роботу со всей плоскостью окна.
В программе желательным было бы, чтобы Windows самостоятельно решала, когда ей вызвать сообщение WM_PAINT. Это так и происходит, например, когда пользователь программы минимизирует окно, максимизирует, движет экраном, изменяет размеры окна и т.п.. Но иногда необходимо проводить обновление окна принудительно. Для того, чтобы прислать сообщение WM_PAINT, программа вызывает функцию InvalidateRect() – член класса CWnd, которая имеет следующий прототип:
void CWnd::InvalidateRect(LPCRECT lpRegion, BOOL Erase=TRUE);
где lpRegion – указатель на область окна, которую необходимо обновить, Erase – флаг, который в значении TRUE устанавливает изъятие предыдущего содержимого окна. Если указать первому параметру значения NULL, произойдет полное обновление окна. Вызов функции InvalidateRect() обеспечивает принудительную посылку сообщения WM_PAINT и выполнение обработчика OnPaint().
Полное обновление окна, как например:
InvalidateRect(NULL);