- •Часть IV
- •Глава 25
- •224 Глава 25
- •226 Глава 25
- •Глава 26
- •230 ____Глава 26
- •232 Глава 26
- •234 Глава 26
- •236 Глава 26
- •238 Глава 26
- •240 Глава 26
- •242 Глава 26
- •Глава 27
- •Virtual void InitMainWindow();//Замещаем функцию InitMainWindow
- •246 Глава 27
- •248 Глава 27
- •250 Глава 27
- •252 . Глава27
- •Глава 28 Диалоговые окна
- •256 Глава 28
- •258 Глава 28
- •260 Глава 28
- •262 Глава 28
- •264 Глава 28
- •266 Глава 28
- •268 Глава 28
- •Глава 29
- •270 Глава 29
- •272 Глава 29
- •274 Глава 29
- •276 Глава 29
- •278 Глава 29
- •280 Глава 29
- •282 Глава 29
250 Глава 27
Действия с объектами меню
Базовые операции с меню, рассмотренные в предыдущем примере, не требовали использования классов меню, определенных в библиотеке 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();//Вызываем исходную функцию
}