Часть 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 © 2005 4us
Сайт создан в системе uCoz