|
Программирование >> Процедурные приложения
class CMainWnd : public CFrameWnd public: CMainWndO; afx rasg void OnPaintO; DECLARE MESSAGE MAP() ; class CmfcswpApp : public CWinApp public: BOOL Initlnstance(); } ; Ниже показан текст файла MFC SWP.CPP: mfcswp.cpp Эту программу можно использовать как шаблон для разработки других MFC -приложений. #include <afxwin.h> #include mfcswp.h CmfcswpApp theApp; CMainWnd::CMainWnd() { Create(NULL, A MFC Windows Application , WS OVERLAPPEDWINDOW, rectDefault, NULL, NULL); } void CMainWnd: :OnPaint () { CPaintDC dc(this); dc.TextOut(200, 200, Using the MFC Library , 21); } BEGIN MESSAGE MAP(CMainWnd, CFrameWnd) ON WM PAINT() END MESSAGE MAP () BOOL CmfcswpApp::Initlnstance() { m pMainWnd = new CMainWndO; m pMainWnd->ShowWindow(m nCmdShow); m pMainWnd->UpdateWindow() ; return TRUE; Файл MFC SWP.H В MFC -приложениях обычно используются файлы заголовков двух типов. Файлы первого типа, наподобие рассматриваемых в этом параграфе, описывают порождение классов приложений от базовых классов MFC . Их имена совпадают с именами приложений и имеют расширение Н. Файлы второго типа содержат идентификаторы элементов меню и диалоговых окон, а также описания различных констант. Для распознавания файлов этого типа мы будем в их именах добавлять букву R, что означает resource (ресурс). Такие файлы встретятся нам в этой главе в двух последних примерах программ. Итак, в нашем файле заголовков содержится описание двух классов: CMainWnd, порождаемого от CWinApp, и CmfcswpApp, потомка CFrameWnd. class CMainWnd : public CFrameWnd public: CMainWnd () ; afx msg void OnPaint(); DECLARE MESSAGE MAP () ; class CmfcswpApp : public CWinApp public: BOOL Initlnstance(); Класс CMainWndсодержит метод OnPaint() и макрос, связанный с обработкой сообщений. В случае обработчиков сообщений, например OnPaint(), вместо ключевого слова virtual используется afx msg. Наличие метода OnPaint() позволяет изменять содержимое рабочей области окна приложения. Эта функция автоматически вызывается каждый раз, когда объекту CMainWndпередается сообщение WM PAINT. Макрос declare message mapприменяется практически во всех MFC -приложениях и сигнализирует о том, что в классе организуется собственная схема обработки сообщений. Разработчики Microsoftрекомендуют использовать схемы сообщений, а не просто вызовы виртуальных функций, так как благодаря этому удается значительно сократить размер программного кода. Файл MFC SWP.CPP В основу нашего приложения положен код рассматривавшейся в главе 17 программы SIMPLE.CPP, однако между этими кодами имеется несколько существенных отличий. Они касаются, в частности, метода OnPaint(). Проанализируем показанный ниже фрагмент программы. void CMainWnd::OnPaint() CPaintDC do(this); dc.TextOut(200,200, Using the MFC Library , 21); Сначала создается контекст устройства, в рамках которого может вызываться любая GDI-функция. Когда метод OnPaint() завершает свою работу, автоматически вызывается деструктор класса CPaintDC. В данном приложении используется предельно короткая схема сообщений: BEGIN MESSAGE MAP(CMainWnd,CFrameWnd) ON WM PAINT;() END MESSAGE MAP() ..... В параметрах макроса begin message map указаны два класса: CMainWndиCFrameWnd. Первому адресуются сообщения, а второй содержит стандартные обработчики, которые вызываются по умолчанию. Макрос on wm paint() управляет обработкой всех сообщений wm paint и переадресовывает их только что рассмотренной функции OnPaint{). Макрос end message map завершает схему сообщений. Существенное преимущество любой схемы сообщений состоит в том, что с ее помощью удается избежать использования тяжеловесных и чреватых ошибками конструкций с характерными для процедурных приложений операторами switch/case. Запуск программы Создав файл проекта в компиляторе VisualC++, вы должны убедиться в том, что установили опцию использования библиотеки MFC , иначе во время компиляции программы получите серию непонятных сообщений об ошибках. Окно данного приложения показано на рис. 19.1. Рис. 19.1. Вывод текста в рабочую область окна Если вы хотите поэкспериментировать с различными графическими примитивами, удалите из программы функцию TextOut() и вставьте вместо нее функцию Rectangle (), Ellipse () или, скажем, LineTo(). В следующем примере о применении этих функций мы поговорим более подробно. Рисование графических примитивов в рабочей области окна Вторая программа рисует в рабочей области окна различные графические фигуры. О том, как это происходит, речь шла в главе 17. Данное приложение также будет представлено двумя файлами: файлом заголовков GDI.H и программным файлом GDI.CPP. Файл заголовков, по сути, не отличается от используемого в предыдущем примере. class CMainWnd : public CFrameWnd { public: CMainWnd (); afx msg void OnPaintO; DECLARE MESSAGE MAP() ; ); class CgdiAApp : public CWinApp { public: BOOLInitlnstance(); Теперь приведем текст программного файла: gdi.cpp Расширенный вариант приложения mfcswp.cpp, ориентированный на создание графических примитивов.
#include <afxwin.h> #include gdi.h CgdiAApp theApp; CMainWnd::CMainWnd() { Create(NULL, Experimenting With GDI Primitives , WSJDVERLAPPEDWINDOW, rectDefault, NULL, NULL); >> void CMainWnd::OnPaint() { static DWORD dwColor[9] = {RGB(0, 0, 0), черный RGB(255,0, 0), красный RGB (0, 255., 0), зелен1й
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |