|
Программирование >> Программирование на языке c++
В НОВОЙ версии программы имеются следующие изменения и дополнения. 1. Изменен параметр конструктора для объекта класса TButton: new TButton{this,BUTTONJD, my button , 100,50,80,30); Здесь аргумент Id получает значение BUTTONJD. Константа BUTTONJD задана с помощью директивы #defme BUTTONJD 101 (значение этой константы равно 101). Директиву #define можно заменить следующим описанием: const WORD BUTTONJD =101; где тип WORD эквивалентен типу unsigned short. Разрешается выбирать любую константу, которая не используется в библиотеке ObjectWindows. Если теперь нажать кнопку (рис. 9.14), то будет автоматически генерироваться сообщение с именем BUTTON ID. Поскольку BUTTONJD= 101, константа 101 будет использоваться позже нашей программой, чтобы распознать это сообщение. 2. Класс DrawButton объявлен следующим образом: class DrawButton : public TWindow public: DrawButton(TWindow* parent = 0); void HandleButtonMessageO; Наше главное окно 2. Кнопка посылас! сообтсппс с >т1икал1,пым HOMq)oM Id 3. Объект DrawBution перехватывает сообнгепис Объекг I-DrawBuHon, 1. Нажатие кнопки 4. Обтлгкт DrawButton реядтфуе на сробиюкне (напримсз, вьпшает соответствутйЦ)!© функцию отклика, которая датаёт что-то полезное) Рис. 9,14. Генерация и обработка сообщений DECLARE RESPONSE TABLE(DrawButton); Здесь объявляется таблица отклика, которая имеет один аргумент DrawButton. Наряду с объявлением необходимо описать таблицу отклика. Такое описание можно поместить в любом месте программы за пределами класса. Оно начинается директивой DEFINE RESPONSE TABLEl с цифрой 1 в виде суффикса. Если задается цифра 1, то это является указанием компилятору на то, что наш класс (DrawButton) имеет один класс родитель (TWindow). Если используется множественное наследование и наш класс имеет два родителя, то необходимо использовать директиву DEFINE RESPONSE TABLE2. В общем случае это макроописание задается в виде DEFINE RESPONSE TABLE# и имеет #+1 аргументов, которыми являются: имя класса, в котором объявлена таблица отклика; последовательность из # имен всех непосредственных родителей (базовых классов). В нашем примере описание таблицы отклика является очень простым: DEFINE RESP0NSE TABLE1(DrawButton,TWindow) EV COMMAND(BUTrONJD,HandleButtonMessage), END RESPONSE TABLE; где DrawButton - наш класс и TWindow - его непосредственный базовый класс. Директива END RESPONSE TABLE завершает описание. Все директивы, записанные между DEFINE RESPONSE TABLE# и END RESPONSE TABLE, называются входами таблицы отклика. В нашем примере задан только один вход. Директива, описывающая вход, должна всегда оканчиваться запятой, а директива END RESPONSE TABLE - точкой с запятой. Различают два основных типа входов: обрабатывающих сообщения пользователя и обрабатывающих сообщения системы WINDOWS. В нашем примере мы использовали первый тип (сообщение генерируется, когда пользователь нажимает кнопку). Используемое выше макроимя EV COMMAND требует два параметра (аргумента) и устанавливает соответствие между первым и вторым параметрами. Первый аргумент задает имя поступающего сообщения, которое мы хотим пере- хватить и обработать. Второй аргумент определяет имя функции, которая должна быть вызвана в ответ на поступившее хообщение. Эта функция должна быть объявлена в том же классе (DrawButton). На рис. 9.15 демонстрируются основные этапы обработки сообщения. Окончательно, при нажатии кнопки, будет вызвана функция HandleButtonMes-sage. 3. Функция HandleButtonMessage описана следующим образом: void DrawButton :: HandleButtonMessageO { MessageBox( was pressed , Button ); } Функция MessageBox является компонентом класса TWindow и задается в следующем виде: int MessageBox(const char far* text, const char far* caption = 0, UINT type = MB OK); где text - указатель на строку, которая отображается внутри окна сообщений; caption - указатель на строку, которая отображается в виде заголовка окна сообщений (если caption=0, то отображается строка, заданная по умолчанию);1уре - константа системы WINDOWS (тип UINT эквивалентен типу unsigned int). Задание констант WINDOWS позволяет выво- 3. Перехват сообщения DEFINE... EV C0MMANn(Bi;TTON lD .iHaiidleBullonMessaM), END... - -- 4. Вызов функции HandleBultonMcssage шш обработки сообщения Рис. 9.15. Этапы обработки сообщений
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |