Читайте также:
|
|
Реализация метода Inltlnstance().
Функция InitInstance() — это виртуальная функция класса CWinApp, переопределяемая для выполнения инициализации. Собственные версии функции InitInstance() предоставляют и класс RMApp и класс SampleApp.
Эта функция реализована следующим образом:
BOOL CTheApp::InitInstance()
{
m_pMainWnd=new CMainWnd(); // вызывает конструктор CMainWnd
// содержит указатель на главное окно приложения
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
Оператор new вызывает конструктор CMainWnd, рассмотренный в предыдущем разделе. Переменная класса m_pMain Wnd (префикс т_ указывает, что это переменная класса) содержит указатель на главное окно приложения. ShowWindow(), также функция-член класса, необходима для отображения окна на дисплее. Параметр m_nCmdShow инициализируется конструктором объекта "приложение". Функция UpdateWlndow() приводит к выводу окна на экран дисплея.,
Конструктор. (переписать пример, который сверху и там так и подписано, где конструктор)
Последний фрагмент текста вызывает конструктор объекта "приложение":
CTheApp TheApp;
Текст приложения в этом примере очень прост и прямолинеен. Программа лишь создает окно, но не позволяет вам что-либо изобразить в нем.
Запуск 23SIMPLE.CPP.:
Результатом Запуска 23SIMPLE.CPP. будет появление пустого окна с заданным заголовком (текст этой программы указан раньше и он нам типо пригодится потом. Для создания окон)
Упрощение структуры облегчает сопровождение.
Многократно используемые классы — главные козыри C++ в борьбе за упрощение структуры программ и облегчение их сопровождения. Библиотека MFC естественным образом расширяет язык C++, создавая впечатление, что ее классы составляют часть самого языка.
Диалоговые окна и элементы управления. Формирование ресурсов диалогового окна. Задание идентификаторов диалогового окна и элементов управления. Создание диалогового окна Sample Dialog.
Окна диалога позволяют пользователям отмечать элементы в списке, устанавливать флажки опций, вводить строки и числа непосредственно с клавиатуры и косвенным образом вводить вещественные числа (с плавающей точкой). Начиная с Windows 3.0, в окно диалога также может входить поле со списком. Поле со списком (combo box) — это сочетание однострочного поля редактирования с окном-списком. Окно диалога для программиста является ключевым элементом при организации в программе Windows ввода нетривиальных данных. Диалог также облегчает жизнь программиста, поскольку Windows берет на себя часть необходимых забот о нем.
Окна диалога вызываются при выборе команды из меню и появляются в виде раскрывающихся окон. Команда, которая вызывает появление окна диалога, обычно помечается многоточием после названия. Команды About Box... и Data Entry... в предыдущем разделе вызывают появление окна диалога
Каждый ресурс диалогового блока имеет идентификатор, который позволяет объекту диалогового блока задать, какой ресурс диалогового блока будет использоваться. Идентификатор может быть строкой или целым числом. Вы можете передать этот идентификатор конструктору диалогового блока.
Для построения объекта диалогового блока создайте его, используя указатель на родительское окно и идентификатор ресурса. Родительское окно почти всегда задается как this. Можно также использовать основное окно приложения (это единственное окно, всегда присутствующее в приложении ObjectWindows). Исключением является ситуация, когда вы задаете объект диалогового блока как клиентное окно в конструкторе TFrameWindow. Конструктор передает объект диалогового блока функции TFrameWindow::Init, которая автоматически устанавливает родительский объект диалогового блока.
Ресурс диалогового окна используется для вывода окна на экран самого окна и элементов управления, которые находиться на нем. Класс диалогового окна необходим для программной реализации управления окном и его элементами. Ресурсы диалогового окна создаются редактором ресурсов. Класс окна создает ClassWizard на основе ресурсов диалогового окна. Обычно все эти классы это дети от класса CDialog. Каждый элемент управления обычно имеет переменную в классе диалогового окна. При генерации приложения AppWizard'ом у Вас автоматически генерируется окно о программе.
Создание класса диалогового окна. Использование класса диалогового окна. Организация вывода диалогового окна на экран. За кулисами. Использование элемента управления типа список. Использование элементов управления типа переключатель.
Класс CDialog - базовый класс, используемый для отображения диалоговых окон на экране. Диалоговые окна имеют два типа: модальный и немодальный. Модальное диалоговое окно должно быть закрыто пользователем прежде, чем прикладная программа продолжается. Немодальное диалоговое окно позволяет пользователю отображать диалоговое окно и возвращаться к другой задаче без того, чтобы отменить или удалять диалоговое окно.
Объект CDialog - комбинация шаблона диалога и класса наследника CDialog. Используйте редактора диалога, чтобы создать шаблон диалога и сохранять его в ресурсе, затем используйте ClassWizard, чтобы создать класс, полученный из CDialog.
Диалоговое окно, подобно любому другому окну, получает сообщения от Windows. В диалоговом окне, Вы особенно заинтересованы в уведомительных сообщениях обработки из средств элементов управления блока диалога, именно так пользователь взаимодействует с Вашим диалоговым окном. ClassWizard просматривает потенциальные сообщения, сгенерированные каждым элементом управлением в Вашем диалоговом окне, и Вы можете выбирать, которые сообщения Вы желаете обработать. ClassWizard затем добавляет соответствующие входы карты сообщения и функции членства драйвера сообщения к новому классу для Вас. Вы только должны записать специфический для приложения код в функциях членства драйвера.
Функции GetFileName и GetFilePath по сути аналогичны, и предназначены для вывода диалогового окна выбора файла
(при этом можно указать стартовую папку для поиска файла, и тип\расширение выбираемого файла)
Функция GetFilenamesCollection позволяет выборать сразу несколько файлов в одной папке.
Функция GetFolderPath работает аналогично, только служит для вывода диалогового окна выбора папки.
Диалоговые окна Переключатели используются для предоставления во время установки до четырех взаимоисключающих вариантов выбора и возврата выбранного значения. Доступно три диалоговых окна Переключатели: Переключатели (2 варианта выбора), Переключатели (3 варианта выбора) и Переключатели (4 варианта выбора). Эти три диалоговых окна идентичны и различаются только количеством переключателей; каждое из них может быть добавлено к проекту развертывания лишь один раз.
Эти диалоговые окна содержат соответственно два, три и четыре переключателя с подписями и дополнительными метками для предоставления сведений пользователю. Тексты этих меток задаются во время разработки в окне Свойства. Каждый переключатель имеет дополнительные свойства для указания значения по умолчанию и варианта, выбираемого по умолчанию.
На следующем рисунке показано типичное диалоговое окно Переключатели (2 варианта выбора), отображаемое во время установки.
Во многих диалоговых окнах присутствует еще один компонент - блок списка. Этот список позволяет вам просматривать и выбирать запись из списка переменной длины, не выходя из диалогового окна.
Если в списке появляется мерцающий курсор и вы хотите что-то най ти, можно ввести слово (или его первые буквы), после чего IDE выполнит его поиск.
Активизировать блок списка можно щелкнув на нем кнопкой "мыши" или выбрав подсвеченную букву заголовка списка (либо нажать клавишу Tab или клавиши управления курсором, пока он не будет подсвечен). После вывода списка для его просмотра можно использовать полосу прокрутки или клавиши стрелок (вверх и вниз) на клавиатуре.
126. Научная графика: графическое представление функции с использованием меню и окон диалога. Заголовочный файл 24FOUR.H. Заголовочный файл ресурсов 24FOURR.H, файл описания ресурсов 24FOUR.RC и файл описания окна диалога 24FOUR.DLG.
Следующий пример 24FOUR изобразит в рабочей области окна график суммы ряда Фурье. Это приложение использует два ресурса Windows: меню и окна диалога.
С ростом сложности приложений увеличивается и количество файлов, не обходимых для их построения. Для этой программы требуется файл определения модуля (только при создании приложения Windows З.х) 24FOUR.DEF, заголовочный файл 24FOUR.H, заголовочный файл для ресурсов 24FOURR.H (с дополнительным "R" в имени), файл описания ресурсов 24FOUR.RC, файл с описанием окна диалога 24FOUR.DLG и файл с исходным текстом программы 24FOUR.CPP.
Ниже приведен листинг файла определения модуля 24FOUR.DEF:
NAME 24FOUR
DESCRIPTION 'Drawing A Fourier Series Waveform'
; Изображение суммы ряда Фурье
EXETYPE WINDOWS
STUB 'WINSTUB.EXE'
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE MULTIPLE
HEAPSIZE 4096
Заголовочный файл 24FOUR.H, листинг которого приведен ниже, содержит определения классов.
class CMainWnd: public CFrameWnd
{
public:
CMainWnd();
afx_msg void OnPaint();
afx_msg void OnSize(UINT,int,int);
afx_msg int OnCreate(LPCREATESTRUCT cs);
afx_msg void OnAbout();
afx_msg void OnFourierData();
afx_msg void OnExit();
DECLARE_MESSAGE_MAP();
};
class CTheApp: public CWinApp
{
public:
virtual BOOL InitInstance();
};
class CFourierDataDialog: public CModalDialog
{
public:
CFourierDataDialog(CWnd* pParentWnd= NULL)
: CModalDialog("FourierData", pParentWnd)
{ }
virtual void OnOK();
};
Функция OnPaint() вызывается автоматически, когда объекту класса CMainWnd от приложения или от Windows поступает сообщение WM_PAINT. OnSize() вызывается, когда приходит сообщение WM_SIZE, вызванное изменением размеров окна. Эта информация пригодится при масштабировании графика по размерам окна. OnCreate() указывает на структуру, несущую информацию о создаваемом окне. Там содержатся размер, стиль и другие параметры окна. OnAboat(), OnFourierData() и OnExit() — функции, которые реагируют на сообщения WM_COMMAND. Эти сообщения возникают, когда пользователь выбирает команду меню или окна диалога.
Следующий заголовочный файл содержит уже привычные идентификационные номера для меню и окон диалога. Этот файл называется 24FOURR.H.
#define IDM_FOUR 100
#define IDM_ABOUT 110
#define IDM_EXIT 120
#define IDD_TERMS 200
#define IDD_TITLE 201
IDM_FOUR, IDM_ABOUT и IDM_EXIT используются для обозначения пунктов меню, a IDD_TERMS и IDD_TITLE необходимы для окна диалога ввода данных.
Файл описания ресурсов 24FOUR.RC содержит описание меню и значка. Описание окна диалога помещено в отдельный файл.
#include <windows.h>
#include <afxres.h>
#include "24FOURR.h"
FourierMenu MENU
BEGIN
POPUP "Fourier Data"
BEGIN
MENUITEM "Fourier Data...", IDM_FOUR
MENUITEM "Fourier About...", IDM_ABOUT
MENUITEM "Exit", IDM_EXIT
END
END
rcinclude 24FOUR.dlg
В файл 24FOUR.RC включена ссылка на значок, созданный с помощью Icon Editor. Этот значок будет использован для обозначения приложения.
В файле 24FOUR.DLG содержатся описания двух окон диалога: простого окна "О Программе" (About) и окна для ввода данных.
Заголовочный файл ресурсов 24FOURR.H, файл описания ресурсов 24FOUR.RC и файл описания окна диалога 24FOUR.DLGиспользуются компилятором ресурсов для создания единственного файла с готовыми ресурсами Windows.
127. Файл исходного текста 24FOUR.СРР. Создание нового класса CMainWnd. Определение размера рабочей области окна. Рисование графика. Окно диалога "О Программе". Окно диалога для ввода данных. Обработка команды OnExit().
1,2. Можно задать параметры объекта CMainWnd путем создания класса окна при помощи AfxRegisterWndClass. Класс окна имеет много полей, четыре из которых легко изменить: стиль, курсор, фон и значок свернутого окна.
Небольшой фрагмент текста, приведенный здесь, демонстрирует синтаксис для изменения курсора на стандартный курсор в виде крестика (IDC_CROSS) и задания кисти, которая закрасит фон белым (WHITE_BRUSH).
CMainWnd::CMainWnd()
{ Create((AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,
LoadCursor(NULL,IDC_CROSS),
(HBRUSH) (GetStockObject(WHITE_BRUSH)),NULL)),
"Fourier Series Foundation Class Application",
WS_OVERLAPPEDWINDOW,rectDefault,NULL,"FourierMenu");}
Функции Create() передается имя меню для окна.
3. Метод OnSize()определяет размер рабочей области данного окна. Когда размер окна изменяется, оно получает сообщение WM_SIZE. Как показано ниже, размер окна запоминается в двух переменных, m_cxClient и т_су Client.
void CMainWnd::OnSize(UINT,int x,int y)
{ m_cxClient=x; m_cyClient=y; }
4. Чтобы избежать проблем масштабирования, для рисования создается масштабируемое поле.
Как показано в приведенном фрагменте кода, вызовом функции SetMapMode() режим отображения заменяется на MM_ISOTROPIC. Этот режим использует произвольные единицы для задания координат. dc.SetMapMode (MM_ISOTROPIC);
Следующая строка задает протяженность координатных осей по х и у в 500 единиц.
dc.SetWindowExt(500,500);
Это просто означает, что длина осей х и у будет составлять 500 единиц, независимо от размеров окна. Физические границы изображения устанавливаются по текущим размерам окна:
dc.SetViewportExt (m_cxClient, -m_cyClient);
В этом случае все 500 единиц на координатных осях попадут в окно.
Как показано далее, физическое начало отсчета устанавливается на середине оси у и на небольшом расстоянии (одной двадцатой ширины окна) от левого края по оси х.
dc.SetViewportOrg(m_cxClient/20,m_cyClient/2);
Затем в окне изображаются координатные оси х и у.
Метод рисования графика суммы ряда Фурье использует два цикла for. Переменная i управляет значением угла для функции синуса, а переменная j соответствует текущему номеру гармоники. Каждая точка на графике представляет собой сумму всех гармоник для данного значения угла. Таким образом, если потребовать от приложения изобразить ряд из 1000 гармоник, программе придется проделать 400 000 вычислений.
// рисуем; выводим график суммы ряда Фурье
for(i= 0; i<= 400; i++)
{ for(j= 1; j<= nterms; j++)
{ y= (150.0/((j*2.0)-1.0))*sin(((j*2.0)-1.0)*0.015708*ang); yp= yp+ y; }
dc.LineTo(i,(int) yp); yp-= yp; ang++;}
При помощи функции LineTo() точки графика соединяются последовательно, благодаря чему график изображается сплошной линией. Внутренняя область графика будет заполнена серым цветом. Для этого вызывается функция ExtFloodFill(), которой в качестве аргументов передаются координаты точек внутри заполняемого пространства и цвет границы. Параметр FLOODFILLBORDER указывает, что требуется заполнить все пространство до границы заданного цвета.
// Готовимся к закрашиванию графика
// кистью newbrush. newbrush.CreateSolidBrush(dwColor[7]);
newbrush.CreateSolidBrush(dwColor[7]);
oldbrush= dc.SelectObject(&newbrush);
dc.ExtFloodFill(150,10,dwColor[0],FLOODFILLBORDER);
dc.ExtFloodFill(300,-10,dwColor[0],FLOODFILLBORDER);
В конце работы выводится заголовок графика, а затем удаляется созданная ранее кисть.
// заголовок графика
ltitle= strlen(mytitle); dc.TextOut(200-(ltitle*8/2),185,mytitle,ltitle);
// удаляем кисть
dc.SelectObject(oldbrush); newbrush.DeleteObject();
Все объекты, выводимые в рабочую область, масштабируются по размерам окна.
5. Окно диалога "О Программе" используется, чтобы сообщить сведения о программе, ее разработчиках, дате регистрации авторских прав и так далее.
Когда пользователь выбирает пункт меню Fourier About..., создается модальное окно диалога. Процедура обработки OnAbout() занимает лишь несколько строк текста:
void CMainWnd::OnAbout()
{ CModalDialog about("AboutBox",this); about.DoModal();}
Конструктору класса CModalDialog в качестве окна-родителя передается указатель на текущее окно. Для этого используется указатель this, который обозначает используемый в данный момент объект. Функция DoModal() обеспечивает отображение окна диалога на экране. При нажатии на кнопку ОК окно диалога исчезает с экрана.
6. Окно диалога, воспринимающее ввод пользователя можно вызвать, выбрав в меню пункт Fourier Data...Пользователь может ввести заголовок графика и целое число, задающее количество гармоник ряда Фурье. Если пользователь нажал кнопку ОК, окно диалога закрывается, а рабочая область окна перерисовывается.
Как уже говорилось, класс CFourierDataDialog порожден от CModalDialog в заголовочном файле 24FOUR.H. Обратите внимание, что именно здесь приложение получает данные. Эти данные были введены пользователем в окно диалога. Вот текст, извлекающий эту информацию после нажатия кнопки ОК:
void CFourierDataDialog::OnOK()
{ GetDlgItemText(IDD_TITLE,mytitle,80);
nterms= GetDlgItemInt(IDD_TERMS,NULL,0); CModalDialog::OnOK();}
Функция GetDlgItemText() заносит информацию о заголовке в виде строки в переменную mytitle. Положение этой информации в окне диалога задается константой IDD_TITLE. Целое число вводится аналогично функцией GetDlgItemInt(). Его идентифицирует константа IDD_TERMS, а значение запоминается в nterms. Второй параметр GetDlgItemText() используется для сообщения об ошибках перевода текста в число, но в данном примере не используется. Если третий параметр GetDlgItemInt() не ноль, функция будет воспринимать числа со знаком. В данном случае возможны только положительные числа.
7. Последний пункт в меню приложения — Exit (выход). При выполнении этой команды окно уничтожается вызовом DestroyWindow():
void CMainWnd::OnExit()
{ DestroyWindow();}
Меню приложения дает пользователю возможность завершить программу, не прибегая к оконному меню.
128. Линейчатая диаграмма с использованием меню и окон диалога.
Вот листинг файла определения модуля 24BAR.DEF:
;24BAR.DEF for Visual C++
NAME 24BAR
DESCRIPTION 'Microsoft Foundation Class Bar Chart Program'
; Программа для вывода столбчатой диаграммы на основе MFC
EXETYPE WINDOWS
STUB 'WINSTUB.EXE'
CODE PRELOAD MOVABLE
DATA PRELOAD MOVEABLE MULTIPLE
HEAPSIZE 4096
В заголовочный файл 24BAR.H входят определения классов CMaiaWnd, CTheApp и CBarDataDialog, производных от классов из библиотеки MFC.
class CMainWnd: public CFrameWnd
{
public:
CMainWnd(); afx_msg void OnPaint(); afx_msg void OnSize(UINT,int,int);
afx_msg int OnCreate(LPCREATESTRUCT cs); afx_msg void OnAbout();
afx_msg void OnBarData(); afx_msg void OnExit(); DECLARE_MESSAGE_MAP();};
class CTheApp: public CWinApp
{public:
virtual BOOL InitInstance();};
class CBarDataDialog: public CModalDialog
{public:
CBarDataDialog(CWnd* pParentWnd= NULL)
: CModalDialog("BarDlgBox", pParentWnd)
{ }
virtual void OnOK();
};
Заголовочный файл для ресурсов содержит константы для идентификации меню и двух окон диалога.
#define IDM_ABOUT 10
#define IDM_INPUT 20
Файл описания ресурсов 24BAR.RC определяет меню и включает в себя ссылку (командой rcinclude) на описания окон диалога, находящиеся в отдельном файле.
#include <windows.h>
#include <afxres.h>
#include "24BARR.H"
BarMenu MENU
BEGIN
POPUP "Bar_Chart"
BEGIN
MENUITEM "About Box...", IDM_ABOUT
MENUITEM "Exit", IDM_EXIT
END
END
rcinclude 24BAR.dlg
Заголовочный файл 24BAR.H.
Отметьте, например, схожие объявления функций CMainWnd и таблицы сообщений.
afx_msg void OnPaint();
afx_msg void OnSize(UINT,int,int); afx_msg int OnCreate(LPCREATESTRUCT cs);
afx_msg void OnAbout(); afx_msg void OnBarData(); afx_msg void OnExit();
Заголовочный файл ресурсов 24BARR.H, файл описания ресурсов 24BAR.RC и файл описания окна диалога 24BAR.DLG.
Все эти файлы преобразуются компилятором ресурсов в единственный файл ресурсов 24BAR.RES.
Заголовочный файл ресурсов 24BARR.H содержит три константы для обозначения пунктов меню: IDM_ABOUT, IDM_INPUT и IDM_EXIT, а также тринадцать констант для элементов окон диалога. Три из них, DM_TITLE, DM_XLABEL и DM_YLABEL, обозначают соответственно заголовок диаграммы и подписи к осям х и у. Остальные десять (с DM_P1 по DM_P10) предназначены для задания высоты каждого из столбцов. Все они будут целыми числами.
Файл описания ресурсов содержит описание меню, которое показано на рисунке. Сопоставьте текст описания меню с изображением этого меню на экране.
Файл описания окон диалога содержит описания окна диалога "О Программе" и окна диалога ввода данных, который показан на рисунке.
Оба окна диалога были созданы редактором диалогов Dialog Editor, который способен создавать файлы описания окон диалога с расширением.DLG.
Исходный текст программы 24BAR.CPP.
В этом разделе основное внимание будет уделено тем возможностям программы, которые не встречались в предыдущих примерах. Приложение 24BAR даст пользователю возможность создавать линейчатые диаграммы презентационного качества. Пользователь может, пользуясь модальным окном диалога, ввести заголовок диаграммы, подписи к осям и высоты столбцов (до десяти значений). Диаграмма будет правильно масштабирована в окне, и каждый столбец будет изображен цветом из массива заранее определенных цветов.
В начале программы максимальное количество столбцов, maxnumbar, задается равным десяти:
#define maxnumbar 10
Это значение можно слегка варьировать, не забывая, однако, что хорошая диаграмма не загромождает экран слишком большим количеством столбцов.
Как видно из приведенного текста, начальные значения для заголовка и подписей к осям, а также высоты столбцов, содержатся в глобальных переменных.
char szTString[80]="(bar chart title area)"; // (место для заголовка диограммы)
char szXString[80]="x-axis label";//подпись к оси x
char szYString[80]="y-axis label";//подпись к оси y
int iBarSize[maxnumbar]={20,10,40,50};
Размеры рабочей области окна также заносятся в глобальные переменные. Их имена такие же, как в прошлом примере:
int m_cxClient, m_cyClient;
Поскольку программа отслеживает размер рабочей области, диаграмму можно масштабировать в соответствии с размерами окна.
Цвета столбцов последовательно выбираются из массива dwColor. Если бы в диаграмме было три столбца, они имели бы черный, красный и зеленый цвета. Можно поменять местами цвета, если нужно.
Классы CBrush и CFont позволяют передать объект-кисть и объект-шрифт методам классов, производных от CDC (базовый класс для контекста устройства). Для создания новой кисти и шрифта используется следующая конструкция:
CFont newfont; CFont* oldfont; CBrush newbrush;
CBrush* oldbrush;
Создание приложений с использованием библиотеки MFC. Особенности Microsoft Foundation Classes, относящиеся к Windows 95 и NT. Простое приложение, использующее MFC и несколько графических примитивов. Изучаем WIN32MFCTMP.CPP. Запуск программы WIN32MFCTMP.
Как отмечено ранее, библиотека содержит две важные группы классов: в одну из них входят десятки классов для программирования под Windows 95 и Windows NT, а в другую — классы для создания приложений OLE. За счет использования библиотеки MFC упрощается разработка программ и облегчается их сопровождение.
Помимо набора многократно используемых классов, в MFC входят наиболее важные структуры и вызовы функций API.
По сравнению с традиционными библиотеками функций, используемыми при программировании на С, библиотека Microsoft Foundation Classes дает большие преимущества. Они объясняются прежде всего использованием классов C++ и состоят в том, что:
· Не происходит коллизии имен функций и переменных
· Алгоритмы и данные инкапсулированы в иерархии классов
· Классы представляются естественным расширением языка
· Уменьшается объем исходного текста (как результат правильного проектирования библиотеки классов)
Существенное уменьшение объема исходного текста, необходимого для создания и отображения окна в Windows 95 или Windows NT, достигается исключительно за счет использования библиотеки Microsoft Foundation Classes.
Особенности Microsoft Foundation Classes, относящиеся к Windows 95 и NT.
Microsoft утверждает, что использующий Microsoft Foundation Classes программист будет иметь возможность пользоваться такими средствами, которые не предлагаются другими поставщиками объектно-ориентированных библиотек. Эти средства в особенности полезны при создании приложений Windows 95 и Windows NT. В них входят:
· Поддержка всех функций, управляющих элементов и сообщений Windows, графических примитивов GDI, меню и окон диалога.
· Ликвидация большинства операторов switch/case, использование которых часто служит источником ошибок. Для всех сообщений возможна непосредственная связь с методом класса.
· Улучшенная поддержка диагностики за счет возможности записывать в файл информацию об объектах программы. Есть также возможность проверять значения переменных класса.
· Лаконичный текст с эффективной реализацией.
· Определение типа объекта во время выполнения программы. Это позволяет динамически манипулировать полями объекта при создании экземпляра класса.
Изучаем WIN32MFCTMP.CPP.
В примере показано, как можно создавать в приложении MFC новые кисти и перья, а также использовать некоторые из графических примитивов GDI. Рассмотрим текст в начале функции OnPaint(). Здесь создается массив для хранения цветов, используемых при создании кистей и перьев.
static DWORD dwColor[12]=
{
RGB(0,0,0), // черный
RGB(255,0,0), // красный
RGB(0,255,0), // зеленый
RGB(0,0,255), // синий
RGB(255,255,0), // желтый
RGB(255,0,255), // лиловый
RGB(0,255,255), // циан
RGB(0,80,80), // оттенок 1
RGB(80,80,80), // оттенок 2
RGB(80,80,0), // оттенок 3
RGB(80,0,80), // оттенок 4
RGB(255,255,255) // белый
};
Классы CBrush и СРеn позволяют передать объект-кисть и объект-перо методам классов, производных от CDC (базовый класс для контекста устройства). Кисти могут быть сплошные (solid), штрихованные (hatched) или узорчатые (patterned). Перья могут рисовать сплошные (solid), пунктирные (dashed) и точечные (dotted) линии
CBrush newbrush; // новая кисть
CBrush* oldbrush; // старая кисть
CPen newpen; //новое перо
CPen* oldpen; //старое перо
Поскольку различные примитивы используются аналогичным образом, рассмотрим только два фрагмента. В первом из них изображается широкая черная линия, идущая по диагонали окна:
// толстая черная диагональная линия
newpen.CreatePen(PS_SOLID,6,dwColor[0]);
oldpen= dc.SelectObject(&newpen);
dc.MoveTo(20,20);
dc.LineTo(100,100);
dc.TextOut(60,20,"<-diagonal line",15);
При инициализации объекта- перо функцией CreatePen() задается сплошная черная линия шириной в шесть логических единиц. Когда перо проинициализировано, используется перегруженная функция Select0bject(), которая связывает готовое перо с контекстом устройства. Эта функция возвращает перо, использовавшееся ранее. Функции MoveTo() и LineTo() задают начальную и конечную точки линии, которая будет проведена выбранным пером. Наконец, функция TextOut() выводит подпись.
С кистями работают подобным же образом. В следующем фрагменте текста задается кисть, выполняющая перекрестную штриховку (HS_CROSS) синим цветом. Кисть выбирается в контекст устройства так же, как и перо.
// черный прямоугольник, закрашенный серым
newbrush.CreateSolidBrush(dwColor[7]);
oldbrush= dc.SelectObject(&newbrush);
dc.Rectangle(25,300,150,375);
dc.TextOut(50,325,"rectangle",9);
130. Научная графика с использованием ресурсов: меню, окна диалога и мультимедийного звука. Заголовочный файл WIN32MFCFOUR.H. Заголовочный файл ресурсов
Ниже приведен заголовочный файл WIN32MFCFOURR.H.
#define IDM_FOUR 100
В следующем файле находятся описания классов для этой программы. Этот файл называется WIN32MFCFOUR.H.
class CMainWnd: public CFrameWnd
{
public:
CMainWnd();
afx_msg void OnPaint();
afx_msg void OnSize(UINT,int,int);
afx_msg int OnCreate(LPCREATESTRUCT cs);
afx_msg void OnAbout();
afx_msg void OnFourierData();
afx_msg void OnExit();
DECLARE_MESSAGE_MAP();
};
class CNTApp: public CWinApp
{
public:
virtual BOOL InitInstance();
};
class CFourierDataDialog: public CModalDialog
{
public:
CFourierDataDialog(CWnd* pParentWnd= NULL)
: CModalDialog("FourierData", pParentWnd)
{ }
virtual void OnOK();
};
Описания окна диалога программы приведены в файле WIN32MFCFOUR.DLG.
DLGINCLUDE RCDATA DISCARDABLE
{
"WIN32MFCFOURR.H\0"
}
AboutBox DIALOG 14,22,200,75
STYLE WS_BORDER|WS_CAPTION|WS_DLGFRAME|WS_POPUP
CAPTION "About Box"
FONT 8,"MS Sans Serif"
{
CTEXT "A MFC Fourier Series With",-1,30,5,144,8
PUSHBUTTON "Okay",IDOK,84,55,32,14
}
FourierData DIALOG 74,21,142,70
STYLE DS_MODALFRAME|WS_POPUP|WS_VISIBLE|
WS_CAPTION|WS_SYSMENU
CAPTION "Forier Series Information"
FONT 8,"MS Sans Serif"
{
LTEXT "Title: ",-1,6,5,28,8
}
В файле описания ресурсов WIN32MFCFOUR.RC находится описание меню приложения.
#include <windows.h>
#include "WIN32MFCFOURR.H"
FourierMenu MENU
BEGIN
POPUP "Fourier Data"
BEGIN
MENUITEM "Fourier About...",IDM_ABOUT
MENUITEM "Forier Data...", IDM_FOUR
MENUITEM "Exit", IDM_EXIT
END
END
rcinclude WIN32MFCFOUR.dlg
///////////////////////////////////////////////////
CNTApp theApp;
CMainWnd::CMainWnd()
{
Create((AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,
LoadCursor(NULL,IDC_CROSS),
(HBRUSH) GetStockObject(LTGRAY_BRUSH),NULL)),
"A 32-bit MFC Fourier Series Under Windows 95 and NT",
WS_OVERLAPPEDWINDOW,rectDefault,NULL,"FourierMenu");
}
void CMainWnd::OnSize(UINT,int x,int y)
{
m_cxClient=x;
m_cyClient=y;
}
void CMainWnd::OnPaint()
{
CPaintDC dc(this);
// создание поля для рисования
dc.SetMapMode(MM_ISOTROPIC);
dc.SetWindowExt(500,500);
dc.SetViewportExt(m_cxClient,-m_cyClient);
dc.SetViewportOrg(m_cxClient/20,m_cyClient/2);
// оси координат
dc.MoveTo(0,240);
dc.LineTo(0,-240);
dc.MoveTo(0,0);
dc.LineTo(400,0);
dc.MoveTo(0,0);
// рисуем
for(i= 0; i<= 400; i++)
{
for(j= 1; j<= nterms; j++)
{
y= (150.0/((j*2.0)-1.0))*sin(((j*2.0)-1.0)*0.015708*ang);
yp= yp+ y;
}
dc.LineTo(i,(int) yp);
yp-= yp;
ang++;
}
// готовим ресурс для мультимедийного звука
// проигриваем звук после завершения рисования
sndPlaySound(szWave, SND_SYNC);
//oldfont= dc.SelectObject(&newfont);
// удалям шрифт
dc.SelectObject(oldfont);
newfont.DeleteObject();
}
void CFourierDataDialog::OnOK()
{
GetDlgItemText(IDD_TITLE,mytitle,80);
nterms= GetDlgItemInt(IDD_TERMS,NULL,0);
CModalDialog::OnOK();
}
void CMainWnd::OnFourierData()
{
CFourierDataDialog dlgFourierData(this);
if(dlgFourierData.DoModal()== IDOK)
{
InvalidateRect(NULL,TRUE);
UpdateWindow();
}
};
void CMainWnd::OnExit()
{
sndPlaySound(NULL,0);
DestroyWindow();
}
BOOL CNTApp::InitInstance()
{
m_pMainWnd=new CMainWnd();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
Дата добавления: 2015-12-08; просмотров: 85 | Нарушение авторских прав