Главная Регистрация RSS
Приветствую Вас, Гость
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Ваша реклама здесь
Форма входа
Логин:
Пароль:
Наши сервисы
Запись на обучение
Научитесь бесплатно создавать нестандартные презентации PowerPoint!
Ваш e-mail: *
Ваше имя: *
Предмет: *
Поиск
Главная » Статьи » 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


Хочешь научиться программировать? Смотри Видео Уроки по программированию на языке DelphiХочешь научиться программировать? Смотри Видео Уроки по программированию на языке Delphi
   P.S. Если после попыток написания программ у Вас кнопка Пуск или Панель задач оказались вдруг не на том месте или их не видно вообще, и Вы не знаете, что делать - просто перезагрузите компьютер или перелогиньтесь - все станет на места!

   P.P.S. Если Вы хотите научиться программировать в системе Borland Delphi - рекомендую Вам:
Категория: Delphi | Добавил: MainTeacher (11.08.2010) | Автор: Максим Олегович Семенихин
Просмотров: 8175 | Комментарии: 2 | Теги: API-функции, оконные функции, программирование, Delphi | Рейтинг: 5.0/6
Всего комментариев: 1
1  
Спасибо большое!!!! Добавил страничку в закладки.
Пригодиться всегда!!

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]