Пособие-самоучитель
on-line
"Visual Basic с нуля"
|
|||
§ 1. Окна. Хендл окна. Хендл окна в VB-проекте. Наша первая API - помигаем окном. | |||
Дата создания 06.04.2005 {Автор 4us} | |||
Наша
первая 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
|