Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Win32_f.doc
Скачиваний:
2
Добавлен:
03.05.2019
Размер:
899.07 Кб
Скачать

250 Глава 27

sine[] и cosine[] можно было на этапе инициализации, например, в конструкторе MyWindow. В сле­дующем примере, где предусмот­рен вывод любой комбинации графиков по желанию, их вычис­ление в функции Paint() становит­ся более оправданным.

Действия с объектами меню

Базовые операции с меню, рассмотренные в предыдущем примере, не требовали использо­вания классов меню, определен­ных в библиотеке OWL - доста­точно было установить меню с помощью функции AssignMenu() и предусмотреть таблицу и функ­ции откликов на команды меню.

Если же в программу желательно включить элементы динамического управления меню, такие, как до­бавление, удаление или модификация команд меню (прикладного или системного), добавление к пунк­там меню маркеров, гашение недоступных пунктов, вывод меню в произвольное место окна и др., то следует обратиться к классам меню библиотеки OWL. В OWL описаны три класса меню - класс TMenu, в котором определено большинство функций, требуемых для работы с меню, класс TSystemMenu, назна­чение которого видно из названия, и класс TPopupMenu для работы со всплывающими меню. В примере 27-3 будет продемонстрировано использование классов TMenu и TPopupMenu.

Пример 27-3 является развитием предыдущего. В меню "Графики" добавлены команды для вывода на экран еще двух тригонометрических функций - sin(x)/x и cos(x)/x. Предусмотрена возможность ото­бражения на экране любого сочетания четырех доступных графиков, причем вывод графика сопровожда­ется появлением маркера перед соответствующей командой меню, а вторичный выбор этой команды га­сит как маркер, так и сам график. Щелчком правой клавиши мыши активизируется плавающее меню, в котором можно выбрать масштаб вывода графиков. На рис. 27.5 показан вывод приложения 27-3 в одном из вариантов.

//Приложение 27-3. Действия с объектами меню

//Файл 27-3.rс

//Отличается от примера 27-2 увеличением числа команд (до 4) в пункте "Графики"

//Файл 27-3.h #define CM_ABOUT 101 #define CM_SIN 102 #define CM_COS 103

Обработка сообщений Windows 251

#define CM_SINX 104

#define CM_COSX 105 #define CM_200 106 #define CM_100 107 #define CM_50 108

//Файл 27-3.cpp

#include <owl\framewin.h>

#include "27-3.h"

#include <math.h>

/*Класс приложения, производный от Tappllication*/

class MyApp:public TApplication{

public:

void InitMainWindow();//Замещаем функцию InitMainWindow

};

/*Класс главного окна, производный от TframeWindow*/ class MyWindow:public TFrameWindow{

double sine[640],cosine[640],sinX[640],cosX[640] ;//Массивы данных для 4 графиков

bool sinIs,cosIs,sinXIs,cosXIs;//Индикаторы наличия данных для 4 графиков

int k;//Масштаб по оси у

TMenu* menu;//Объявляем указатель на объект основного меню

TPopupMenu popupMenu;//Создаем объект плавающего меню

virtual void SetupWindow(); //Замещаем функцию TWindow.: SetupWindow ()

virtual void CleanupWindow() ; //Замещаем фукнцию TWindow::CleanupWindow ()

void Paint(TDC&,bool,TRect&);//Переопределяем функцию Paint

void CmAbout(); //Функции

void CmSin(); //откликов

void CmCos(); //на команды

void CmSinX(); //основного меню

void CmCosX(); //Функции

void Cm200(); //откликов

void Cm100(); //на команды

void Cm50(); //плавающего меню

void EvRButtonDown(UINT,TPoint&); 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), на пункты

EV_COMMAND(CM_SINX,CmSinX), основного

EV_COMMAND(CM_COSX,CmCosX), меню

EV_COMMAND(CM_200,Cm200), Макросы для откликов

EV_COMMAND(СМ_100,Cml00), на пункты

EV_COMMAND(СМ_50,Сm50), плавающего меню

EV_WM_RBUTTONDOWN,

END_RESPONSE_TABLE;//Завершаем таблицу откликов /*Конструктор класса MyWindow*/ MyWindow::MyWindow(TWindow*parent,const char far* title):TframeWindow

(parent,title){

AssignMenu("MainMenu");//Загрузка меню из файла приложения

sinIs=false; cosIs=false; sinXIs=false; cosXIs=false;//Начальные значения

//индикаторов

k=100; // Начальное значение масштаба

popupMenu.AppendMenu(MF_STRING,CM_200,"1.0=200 пикселов");//Формируем

popupMenu.AppendMenu(MF_STRING,CM_100,"1.0=100 пикселов");//плавающее

popupMenu.AppendMenu(MF_STRING,CM_50,"1.0=50 пикселов");//меню из 3 пунктов

}

/*3амещенная функция SetupWindow*/ void MyWindow::SetupWindow(){

TWindow::SetupWindow();//Вызываем замещенную функцию SetupWindow

menu=new TMenu(HWindow);//Образуем объект класса TMenu

}

/*3амещенная функция CleanupWindow()*/ void MyWindow::CleanupWindowО{

delete menu;//Удаляем созданный ранее объект меню

TWindow::CleanupWindow();//Вызываем исходную функцию

}