На рис. 27.2. приведен результат работы приложения 27-2.
//Приложение 27-2. Обработка сообщений от пунктов меню
//Файл 27-2.rс #include "27-2.h" #include <owl\window.rh> MainMenu MENU{ POPUP "&Файл"{
MENUITEM "&О программе", CM_ABOUT
MENUITEM "&Выход", CM EXIT
} POPUP "&Графики"{
MENUITEM "&Синус", CM_SIN
248 Глава 27
MENUITEM "&Косинус", CM_COS } }
//Файл 27-2.h #define CM_ABOUT 101 #define CM_SIN 102 #define CM_COS 103
//Файл 27-2.cpp
#include <owl\framewin.h>
#include "27-2.h"
#include <math.h>
/*Класс приложения, производный от ТApplication*/
class MyApp:public TApplication{
public:
void InitMainWindow();//Замещаем функцию InitMainWindow
};
/*Класс главного окна, производный от TframeWindow*/ class MyWindow:public TFrameWindow{
double sine[640],cosine[640]; //Массивы данных для графиков
bool sinIs,cosIs; //Индикаторы наличия данных для графиков
void Paint(TDC&,bool,TRect&);//Замещаем функцию Paint
void CmAbout();// Функция обработки сообщения от пункта "О программе"
void Cmsin(); //Функция обработки сообщения от пункта "Синус"
void CmCos();// Функция обработки сообщения от пункта "Косинус" public:
MyWindow(TWindow*parent,const char far* title); //Конструктор
DECLARE_RESPONSE_TABLE(MyWindow); //Объявляем таблицу откликов
}; DEFINE_RESPONSE_TABLE1(MyWindow,TFrameWindow) //Описываем
EV_COMMAND(CM_ABOUT,CmAbout), //таблицу откликов
EV_COMMAND(CM_SIN,CmSin), //от пунктов
EV_COMMAND(CM_COS,CmCos), //меню
END_RESPONSE_TABLE; /7Завершаем таблицу откликов /*Конструктор класса MyWindow*/ MyWindow::MyWindow(TWindow*parent,const char far* title):TframeWindow
(parent,title){
AssignMenu("MainMenu"); //Установка меню главного окна по идентификатору
// "MainMenu"
sinIs=false; cosIs=false; //Начальные значения индикаторов: данные отсутствуют
}
/*Функции откликов на сообщения*/ void MyWindow::CmAbout(){
MessageBox("Демонстрация математических функций","О программе", MB_ICONINFORMATION);
} void MyWindow::CmSin(){
for(int i=0;i<640;i++) //В цикле по 640 точкам
sine[i]=sin((double)i/20); //вычисляем и сохраняем в sine[] значения синуса
sinIs=true; //Данные для графика синуса есть
Invalidate(); //Инициируем сообщение WM_PAINT
} void MyWindow::CmCos(){
for(int i=0;i<640;i++)//В цикле по 640 точкам
cosine[i]=cos((double)i/20); //вычисляем и сохраняем значения косинуса
cosIs=true; //Данные для графика косинуса есть
Invalidate(); //Инициируем сообщение WM_PAINT
}
/*Замащающая функция InitMainWindov())*/ void MyApp::InitMainWindow(){
MyWindow* myWin=new MyWindow(0,"Программа 27-2");
SetMainWindow(myWin);
EnableBWCC (); //Разрешаем загрузку и. использование BWCC.DLL }
/*Функция обработки сообщения WM_PAINT*/ void MyWindow::Paint(TDC&dc,bool,TRect&) {
int y0=150; //Сдвиг начала координат по оси у
dc.MoveTo(0,у0); //Смещаем текущую позицию к началу оси X
dc.LineTo(640,y0); //Проводим ось X
if(sinIs==true) //Если данные по синусу есть,
for(int i=0;i<640;i++) //то в цикле по 640 точкам
Обработка сообщений Windows 249
dc.SetPixel(i,y0-(int)(sine[i]*100),TColor::LtBlue); //выводим точки графика if(cosIs==true) //Если данные по косинусу есть,
for (int i = 0; i<640; i++) // то в цикле по 640 точкам dc.SetPixel(i,y0-(int)(cosine[i]*100),TColor::LtGreen);//выводим точки графика
} /*Главная функция приложения OwlMain*/
int OwlMain(int,char*[]){return myApp().Run();}