Главное меню
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Ваша реклама здесь
Форма входа
Наши сервисы
Запись на обучение

Поиск
Главная » Статьи » Delphi | [ Добавить статью ] |
Оконные API-функции, или Как в Delphi свернуть кнопку Пуск и "исчезнуть" панель задач
Очень краткое содержание статьи Что такое "окно"? На сегодняшний день самой популярной операционной системой является Windows, что в переводе означает "окна". С точки зрения пользователя, окно - это один из элементов графического интерфейса, в котором отображается открытый документ или работающая программа. Но с точки зрения самой операционной системы, окно - это буквально каждый видимый пользователем объект. Любая кнопка - это окно, текстовое поле - окно, панель задач - окно и т.д. В операционной системе имеются специальные команды - API-функции - для работы с окнами, которые можно вызывать из любой системы программирования под Windows, такой как Delphi, Visual Basic, Visual C++. В этой статье вы познакомитесь с основными понятиями программирования окон. Все тексты программ будут приводиться для Delphi. Для лучшего понимания того, что я только что сказал об окнах, скачайте себе программу WindowScanner. Работающее приложение имеет такой вид: ![]() Рис.1. Окно программы WindowScanner Назначение программы очень простое - выдавать пользователю параметры окна, над которым в данный момент находится курсор мыши. Наведите мышью на кнопку "Пуск", и Вы получите информацию о ней. Кнопка Пуск представляет собой отдельное окно. Сместите курсор немного вверх или вправо, и в окне WindowScanner появится другая информация. Это значит, что мы переместили указатель в область другого окна. Поперемещайте мышь по монитору и Вы увидите, что окон на экране очень много. Речь идет об окнах с точки зрения операционной системы, а не пользователя. Кстати, у программы есть одна интересная функция - она позволяет сворачивать любое окно. Чтобы это сделать, наведите мышь на нужное окно и нажмите Alt+Shift+F9. Сверните, например, кнопку Пуск. Для разворачивания выполните двойной щелчок по свернутому окну. Параметры окна Каждое окно имеет ряд параметров, или свойств. Программа WindowScanner отображает только три из них: 1. Имя окна - его название. Придумывает программист при составлении приложения. 2. Имя класса окна - тип, к которому принадлежит окно. Например, все текстовые поля относятся к классу Edit, а все кнопки - к классу Button. Наведите курсор мыши на кнопку Пуск, и увидите, что у нее имя класса окна - Button. В Windows существуют стандартные типы окон, программист также может создать свой тип. 3. Дескриптор окна (жарг. хэндл) - уникальный числовой идентификатор, который получает окно при создании и который однозначно идентифицирует это окно. Не может быть двух окон с одинаковыми дескрипторами. Зная дескриптор окна, с ним можно проделывать различные манипуляции. Что можно сделать с окном, зная его дескриптор? Все, что угодно: свернуть, развернуть обратно, скрыть, отобразить, переместить и т.д. Сейчас мы рассмотрим два важных вопроса: 1) с помощью каких команд можно проводить манипуляции с окнами и 2) с помощью каких команд можно определить дескриптор окна. Для того, чтобы материал был понятным, Вы должны иметь хотя бы минимальный опыт программирования на Delphi. Если же такового у Вас нет - отсылаю к своей разработке видеоуроков по программированию на Borland Delphi 7. Пройдя хотя бы 4 первых урока, Вы можете возвращаться к чтению данной статьи. Команды (функции WinAPI) для манипуляций с окнами. Как это делается 1) Запустите Delphi, бросьте на форму единственную кнопку. 2) Теперь запустите WindowScanner. Наведите курсор мыши на кнопку Пуск, и запомните или запишите ее дескриптор (числовое значение). 3) Создайте обработчик события-щелчка по кнопке и напишите в нем: procedure TForm1.Button1Click(Sender: TObject); begin ShowWindow(ХХХХХХ,SW_HIDE); end; где ХХХХХХ - числовое значение дескриптора "Пуска". 4) Теперь запустите программу и нажмите на Вашу единственную кнопку. "Пуск" исчезнет с экрана. Но не волнуйтесь - не навсегда! Закройте программу, вернитесь в Delphi и измените строку в обработчике на следующую: ShowWindow(ХХХХХХ,SW_SHOWNORMAL); выполните программу еще раз, и кнопка Пуск опять появится. 5) Сверните кнопку Пуск из своей программы. Для этого напишите команду CloseWindow(ХХХХХХ); Для разворачивания окна просто выполните двойной щелчок по свернутому. 6) Вы можете делать окна доступными или недоступными. Сделаем кнопку Пуск недоступной: EnableWindow(ХХХХХХ,False); После выполнения этой команды сколько бы Вы ни нажимали на Пуск, главное меню не появится. Обратно восстановить доступность кнопки можно командой EnableWindow(ХХХХХХ,True); 7) Теперь немного сместим положение кнопки. Учтите, что кнопка Пуск принадлежит окну Панели задач, потому перемещаться она будет только в пределах Панели задач. Отделить кнопку Пуск от Панели задач нельзя. MoveWindow(ХХХХХХ,200,15,90,25,true); где: 200 - новая координата X кнопки, 15 - новая координата Y кнопки, 90 - новая ширина кнопки, 25 - новая высота кнопки. Чтобы поставить кнопку на место, выполните команду MoveWindow(ХХХХХХ,0,0,90,25,true); Вместо чисел 90 и 25 методом "математического тыка" подберите свои значения высоты и ширины кнопки. 8) Есть еще одна команда, которую я не рекомендую применять к кнопке Пуск, но которая играет важную роль в программировании - это DestroyWindow, разрушающая окно: DestroyWindow(ХХХХХХ); Итак, мы узнали несколько команд (API-функций) для работы с окнами: ShowWindow, CloseWindow, EnableWindow, MoveWindow, DestroyWindow. Для каждой из этих команд необходимо указывать дескриптор (хэндл) окна, с которым будет производиться действие. Манипуляции можно производить не только с кнопкой Пуск, которая взята просто для примера, но и с любым окном Windows. Но вот незадача: дескриптор окна выдается ему только на один сеанс работы программы. Это значит, что при перезагрузке, например, компьютера все числовые значения дескрипторов поменяются. Кроме того, если Вы запустите какую-то программу типа игры "Сапер" или текстового редактора Word, потом закроете ее и снова запустите, то дескрипторы окон при первом и втором запуске будут отличаться! В связи с этим возникает вопрос: Как узнать дескриптор окна? Для этого существует две команды (WinAPI-функции): FindWindow и FindWindowEx. При перезагрузке компьютера или перезапуске программы меняется дескриптор окна, но постоянными остаются имя окна и имя его класса. По этим данным можно определить дескриптор. Функция FindWindow определяет (возвращает) дескриптор окна по его имени и классу. Панель задач не имеет имени окна и принадлежит к классу с названием Shell_TrayWnd. С помощью функции FindWindow можно определить дескриптор панели задач и присвоить его переменной h типа integer: var h:integer; begin h:=FindWindow('Shell_TrayWnd', nil); {Shell_TrayWnd - имя класса окна. Поскольку имени окна нет, вместо имени окна пишем nil} {Теперь в переменной h находится дескриптор панели задач} ShowWindow(h, SW_HIDE); {скрываем панель задач. С дескриптором h можно проделывать те же манипуляции, что и с кнопкой Пуск из предыдущего раздела} end; Функция FindWindowEx позволяет находить дочерние окна. Сейчас я не буду особо вдаваться в подробности, просто приведу пример нахождения дескриптора кнопки "Пуск" с помощью этой функции: h:=FindWindowEx(FindWindow('Shell_TrayWnd', nil),0,'Button','пуск'); где: FindWindow('Shell_TrayWnd', nil) - дескриптор родительского окна (Панели задач); 0 - дескриптор дочернего окна (у кнопки Пуск нет дочерних окон, потому ставим 0); 'Button' - имя класса окна 'пуск' - имя окна. После этого дескриптор кнопки Пуск оказывается записанным в переменную h, и с ним можно проводить различные манипуляции с помощью оконных функций. Итоги и выводы 1. Понятие "окно" с точки зрения пользователя отличается от понятия "окно" операционной системы. 2. Каждое окно в Windows имеет: имя окна, имя класса окна и дескриптор - уникальный идентификатор, получив который, можно проделывать с окном различные манипуляции. 3. Оконные функции: ShowWindow, CloseWindow, EnableWindow, MoveWindow, DestroyWindow. 4. Функции для получения дескриптора: FindWindow и FindWindowEx. 5. Выражение, которое используется для находжения дескриптора Панели задач: FindWindow('Shell_TrayWnd', nil); 6. Выражение, которое используется для находжения дескриптора кнопки Пуск: FindWindowEx(FindWindow('Shell_TrayWnd', nil),0,'Button','пуск'); 7. Надеюсь, после прочтения этой статьи Вы сможете написать такую программу :-) Продолжение следует... Максим Семенихин, руководитель проекта http://um-razum.ru
| |||
Просмотров: 10326 | Комментарии: 2
| Теги: |
Всего комментариев: 1 | ||
| ||