Смекни!
smekni.com

Федеральное государственное образовательное учреждение Высшего профессионального образования «Южный федеральный университет» Авакян Леон Александрович «использование win api функций в среде делфи» (уч (стр. 4 из 6)

Основные функции, необходимые нам для работы с меню:

- CreateMenu – создаёт главное меню

- CreatePopupMenu – создание всплывающего меню

- AppendMenu – добавление какого-либо пункта в меню

- ModifyMenu – изменение свойств пункта или группы

- SetMenu – установка меню для окна

Удаление пунктов (DeleteMenu) используется редко и остается для самостоятельного изучения.

Обработка сообщений присланных меню аналогична работе с кнопками – приходит сообщение WM_COMMAND с идентификатором пункта.

Ниже приведен код, который создает главное меню окна и всплывающее меню:

const sClassName = 'myWindow'; // Имя класса окна id_Button = 100; // id for button click id_edit = 101; // id for edit // ids for menu id_action = 1; id_save = 2; id_about = 3; id_exit = 4; … WM_CREATE: begin // create button hButton := CreateWindowEx (0,'BUTTON','&Click here', ws_Child or ws_Visible or bs_PushButton, 10, 100, 200, 80, hWnd, id_Button, hInstance, nil); // create edit hEdit := CreateWindow ('EDIT', 'Hello', WS_CHILD or WS_VISIBLE or WS_TABSTOP or ES_MULTILINE or ws_border, 10, 10, 250, 24, hWnd, id_Edit, hInstance, nil) ; SetWindowText( hEdit, 'некоторый текст'); // create memo hMemo := CreateWindow('EDIT', 'Memo1', WS_VISIBLE or WS_CHILD or WS_DLGFRAME or WS_VSCROLL or ES_MULTILINE or ES_AUTOVSCROLL, 5, 180, 250, 70, hWnd, 0, hInstance, nil); // создание меню m_main := CreateMenu; m_file := CreatePopupMenu; // MF_STRING - обычная строка // MF_SEPARATOR - разделительная полоса в меню // MF_POPUP - добавляет всплывающее меню // заполняем всплывающее меню AppendMenu(m_file, MF_STRING, id_save, 'сохранить как'); // сохранить содержимое memo AppendMenu(m_file, MF_SEPARATOR, 0, nil); // разделитель AppendMenu(m_file, MF_STRING, id_exit, 'выход'); // выход из программы // заполняем главное меню AppendMenu(m_main, MF_POPUP, m_file, 'файл'); // "цепляем" всплывающее меню AppendMenu(m_main, MF_STRING, id_about, 'о программе'); // добавляем пункт // выравниваем пункт меню "о программе" по правому краю ModifyMenu(m_main, 1, MF_BYPOSITION or MF_HELP, id_about, 'о программе'); // назначаем главное меню программы SetMenu(hWnd, m_main); end;

Для задания реакции на выбор конкретного пункта меню обрабатываем сообщение WM_COMMAND, как и в случае кнопки, например, следующим образом:

WM_COMMAND: case LoWord (wParam) of id_Button: … id_about: // окошко о программе MessageBox(hWnd, 'программа на чистом WinAPI', 'о программе', MB_ICONINFORMATION); id_exit: // отправляем сами себе сообщение о закрытии окна PostMessage( hWnd, WM_CLOSE, 0, 0 ); end;

Полученное меню представлено на рисунке:

2.5. Стандартные диалоговые окна

Стандартные компоненты OpenDialog, SaveDialog и аналогичные также используют чистый WinAPI код. Но необходимые для их создания функции находятся в библиотеке “commdlg32.dll”. Следовательно, для того, чтобы их использовать, необходимо подключить модуль CommDlg.pas к нашему проекту (добавить его в секцию uses).

Для создания и работы с диалогами существует множество функций, но нам понадобится только одна: GetSaveFileName. Эта функция открывает стандартное окно выбора файла для сохранения, схожее, как две капли воды, с окном, открываемым TSaveDialog’ом. Результат функции при неудачном выборе файла (нажатие кнопки отмены или другие напасти) равен нулю.

Для её использования нам необходимо описать структуру TOpenFilename, характеризующую окно диалога (фильтры, максимальная длина имени файла, выбор нескольких файлов и другие флаги).

Изменим код предыдущего примера так, чтобы при выборе пункта меню “Сохранить”, открывалось стандартное диалоговое окно сохранения для выбора файла. Для этого добавим следующий код в область обработки сообщения WM_COMMAND:

id_exit: // отправляем сами себе сообщение о закрытии окна PostMessage( hWnd, WM_CLOSE, 0, 0 ); id_save: begin // заполняем структуру TSaveDialog ZeroMemory(@SaveDialog, SizeOf(SaveDialog)); with SaveDialog do begin lStructSize := SizeOf(SaveDialog); hWndOwner := hWnd; lpstrFilter := 'Текстовые документы (*.txt)'#0'*.txt'#0#0; lpstrDefExt := 'txt'; // папка должна существовать и файл доступен для записи Flags := OFN_PATHMUSTEXIST or OFN_HIDEREADONLY; // максимальная длина имени файла nMaxFile := 250; nMaxFileTitle := nMaxFile; GetMem(lpstrFile, nMaxFile); // подготовка буфера для имени файла ZeroMemory(lpstrFile, nMaxFile); end; if GetSaveFileName(SaveDialog) then begin // пользователь указал имя файла GetMem(p, 32*1024); GetWindowText(hMemo, p, 32*1024); AssignFile(F, SaveDialog.lpstrFile); Rewrite(F, 1); BlockWrite(F, p^, Length(p)); CloseFile(F); FreeMem(p); end; FreeMem(SaveDialog.lpstrFile); end;

Проектное задание

Модифицировать программу, полученную в конце модуля, так, чтобы при изменении размеров окна элементы управления меняли свои позиции и размеры. Добавить возможность загрузки текстового файла.

Указание: обработать сообщение WM_RESIZE, изменять размеры компонентов функцией SetWindowRect.

Тест рубежного контроля №2

Тест содержит 5 заданий, на выполнение которых отводится 3 минуты. Выберите наиболее правильный, по Вашему мнению, вариант ответа и отметьте его любым значком в бланке ответов.

1. Любая программа под Windows, имеющая окна и интерфейс пользователя должна содержать

1)

Цикл обработки сообщений

2)

Точку входа

3)

Описание класса окна

4)

Все вышеперечисленное
2. Оконная функция позволяет

1)

Закрыть приложение

2)

Управлять операционной системой

3)

Задавать особую реакцию приложения на некоторые сообщения

4)

Необходима для поддержания цикла сообщений
3. Для создания кнопки необходимо создать окно функцией CreateWindowEx c классом:

1)

TButton

2)

Button

3)

Заранее зарегистрированным классом с помощью RegisterClass

4)

BitBtn
4. Создание однострочного и многострочного редактора отличаются

1)

Набором констант, определяющих стили

2)

Классом, указываемом при создании

3)

Всем вышеперечисленным

4)

Не отличаются – меняются лишь размеры
5. Функция CreatePopupMenu позволила в одном из приведенных выше примеров

1)

Создать иерархию вложенных меню

2)

Функция не использовалась

3)

Создать всплывающее меню

4)

Создать главное меню программы

Бланк ответов

1

2

3

4

1)

2)

3)

4)

5)

Критерии оценки

4 и более правильных ответов – отлично

3 правильных ответа – хорошо

2 правильных ответа – удовлетворительно

1 и менее правильных ответов - неудовлетворительно

Модуль 3. Управление сторонними приложениями

Комплексная цель: научиться получать сведения об окна (в частности, о его классе), собирать данные о сообщениях.

Краткое изложение программного материала: в модуле описана программа WinSight32, которая позволяет:

· Собирать данные об окнах в операционной системе

· Следить за сообщениями

Во второй части модуля приведены приемы работы со сторонними приложениями: манипуляции с его окнами (изменение заголовков, положения и т.д.) и управляющими элементами (нажатие кнопки, ввод информацию в редакторы, активация пунктов меню).

3.1. Утилита слежения за окнами и сообщениями WinSight32

Программа WinSight32 предоставляет отладочную информацию об оконных классах, окнах и сообщениях. Используя WinSight32, можно изучить, как любое приложение создает классы и окна, а также следить за получаемыми и передаваемыми сообщениями. Эта программа оказывается крайне полезной для того, чтобы определит класс и заголовок окон сторонних приложений, а также проследить за сообщениями, приходящими к ним. Знание класса окна необходимо для успешного и стабильного получения дескриптора окна (см. раздел 3.2), знание которого позволяет выполнять множество операций с окном. Программа WinSight является пассивным наблюдателем: она перехватывает и отображает информацию о сообщениях, но не препятствует сообщениям доходить до приложений.

Эта утилита входит в стандартную поставку Delphi, как правило, ее можно запустить из меню Пуск, физически же, она располагается в папке bin установки Delphi.

WinSight имеет два режима просмотра, которые управляются с помощью пункта главного меню View:

· Window Tree view (вид дерева окон)

· Message Trace view (вид отслеживания сообщений)

При первом запуске программа функционирует в первом режиме. Вид дерева окон отображает иерархию окон на рабочем столе (рабочий стол также является окном, причем его дескриптор всегда равен нулю).

Этот вид позволяет:

· Определять, какие окна существуют в данный момент времени

· Наблюдать за статусом окон, включая скрытые окна

· Узнать, какие окна получают сообщения

· Выбрать окна, за сообщениями которых нужно проследить

Данные о каждом окне отображаются в следующем формате:

Дерево Дескриптор {Класс} Модуль Положение “Заголовок”

Возможно получить более подробную информацию об окне, выполнив одно из следующих действий,

· Дважды щелкнуть по строке списка с интересующим окном