Часть
2. Использование API в VB.
|
||||||
06.04.2005 | ||||||
Окна.
|
||||||
Что
такое хендл (handle) окна.
Наша первая API - помигаем окном. |
||||||
Наша
первая API-функция, используемая в этой главе.
|
|
Функция FlashWindow | |
Назначение | Заставляет окно мигать, как при переключении из активного состояния в неактивное или наоборот. Используется для привлечения внимания к неактивным окнам. |
Объявление | Declare Function
FlashWindow Lib "user32" (ByVal
hwnd As Long, ByVal
bInvert As Long) As Long |
Аргументы | hwnd
(Long) - хендл окна, которое нужно заставить мигать bInvert (Long) - значение на переключение, при ненулевом значении (True) переключает окно в противоположенное состояние, при нулевом (False) возвращает к исходному. |
Функция FlashWindow возвращает ненулевое значение, если окно было активно перед вызовом. | |
|
Я где-то слышал,
что слово Windows имеет значение "окна". Возможно я и ошибаюся, но
уж коль Bill Gates назвал свою операционку именно так, значит окна в Windows
- довольно важная штука. Поэтому я решил начать с окон. Сегодня наша цель будет
добраться до окна и чего-нибудь с ним сделать. Ну что сделать, мы придумаем,
а вот как добраться до него - это вопрос. Ну темнить не буду, а сразу признаюсь,
что в Windows окно идентифицируется числом, которое называется handle
(хендл). Слово это переводят, кто во что горазд: определитель, держатель, манипулятор
и ручка от чайника. Я же ничего переводить не собираюсь и хендл буду так и называть
- ХЕНДЛ. Это одно из важнейших понятий в API. По нему функция получает доступ
не только к окну, но и массе других объектов. Ведь не только окно имеет хендл,
но и контекст устройства (hDC), и файл, и указатель мыши и иконка и черт еще
знает что. Но сегодня нас интересует именно хендл окна, который обозначается
hWnd. Определил хендл окна, считай, оно - наше. И делай с ним, что хошь (если
получится).
Ну в
Visual Basic узнать хендл окна довольно просто. Для этого у нас есть свойство
.hWnd, которое и возвращает хендл формы или элемента управления.
Давай создадим новый exe-проект и установим свойство формы Form1 AutoRedraw=True.
На форму ничего класть не надо. Теперь в процедуре Form_Load напишем одну-единственную
строчку:
Form1.Print
Form1.hwnd
и пожалуйста, запускаем проект
и на форме имеем то самое число, которое и называется хендл.
Обрати внимание, если ты перезапустишь этот проект, число станет
совсем другим. Это говорит о том, что окно не имеет постоянного хендла и запоминать
его в переменной, чтобы использовать "потом, по ходу программы" бессмыслено.
При открытии одного и того же окна каждый раз формируется новый хендл. Поскольку
раз окно закрыв, открывая его в следующий раз, ты открываешь новое окно (хотя
тебе кажется, что тоже самое).
Теперь, не зря ж мы так мучительно хендл искали, давай заставим окно помигать.
Для этого используем API-функцию FlashWindow. В нашем проекте создадим
стандартый модуль и используя утилиту API Viewer (как ею пользоваться
- см. Введение) скопируем объявление функции в наш модуль:
Public Declare Function
FlashWindow
Lib "user32" (ByVal
hwnd As Long, ByVal
bInvert As Long) As Long
Дело сделано, можно пользоваться.
Как это делать. Да очень просто. Как и самой обычной функцией. Закрываем модуль
и возвращаемся к коду формы.
Поскольку хендл у нас есть, то мы его должны подставить вместо аргумента hwnd
. А чтоб окно мигнуло, значение bInvert должно быть True. Но только
не буквально True, все-таки у нас ее тип Long, а не ноль. Не ноль обозначим
-1 (минус единица). Исходя из вышеизложенного пишем в нашу процедуру Form_Load:
Option
Explicit
Dim DDD As Long
Private Sub Form_Load()
DDD = FlashWindow(Form1.hwnd, -1)
End Sub
Запускаем проект и опа! Видел,
мигнуло!
Конечно одного раза маловато, но это дело техники. Постоянное мигание достигается
с помощью использования таймера. Если ты положишь на форму таймер и перепишешь
код как указано ниже, то можешь наслаждаться миганием до полного обалдения:
Option
Explicit
Dim DDD As Long
Private Sub Form_Load()
Timer1.Interval = 200
End Sub
Private Sub Timer1_Timer()
DDD = FlashWindow(Form1.hwnd, -1)
End Sub
Итак, мы уже поняли,
что найдя хендл окна, мы получаем к окну доступ. А можем мы получить доступ,
например, кTextBox'у? А можем! Потому, что он тоже окно. Конечно мигать этой
функцией мы его на заставим, но можем уяснить, что и текстбокс и кнопка и Picture
и другие элементы формы - тоже окна. Они имеют свой хендл и стало быть доступны
для наших опытов. Но не все. Вот лейбл не имеет хендла просто потому, что лейбл
не является окном. Для Windows лейбл просто совокупность точек на форме и все.
Не имеет хендла и таймер. Да не очень-то и нужно.
|
Copyright
|