Размещение одного окна поверх других
Часто приходится сталкиваться с приложениями, которые размещают свое окно поверх окон других приложений независимо от того. какое именно из них является активным. Примером такого окна может служить окно Find (Найти) редактора Microsoft Word. Чтобы предусмотреть такую возможность, воспользуйтесь API-функцией SetWindowPos().
Private Declare Function SetWindowPos Lib "user32" _
(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
ByVal x As Long, ByVal у As Long, _
ByVal ex As Long, ByVal cy As Long, _
ByVal wFlags As Long) As Long
Параметр
hWnd — дескриптор окна, х и у — координаты левого верхнего угла окна, сх и су — ширина и высота окна соответственно. Параметр h WndInsertAfter — дескриптор окна, после которого окно hWnd
находится в списке окон. Параметр hWnd
может принимать одно из значений, указанных в табл. 13.5.
Таблица 13.5. Значения параметра hWnd
Значение
| Расположение окна | ||
HWND_BOTTOM HWND_TOP HWND_TOPMOST
HWND_NOTOPMOST | Внизу списка окон
Поверх всех окон Наверху списка окон Наверху списка окон, под самым верхним окном |
Параметр wFlags является целочисленной константой, содержащей один или несколько флагов, приведенных в табл. 13.6.
Таблица 13.6. Флаги, составляющие параметр wFlags
Флаг | Действие | ||
SWP_DRAWFRAME | Рисует рамку окна | ||
SWP_HIDEWINDOW | Скрывает окно | ||
SWP_NOACTIVATE | Делает окно неактивным | ||
SWP_JMOMOVE | Сохраняет координаты текущего положения окна (параметры х и у игнорируются) | ||
SWP_NOREDRAW | Запрещает автоматическую перерисовку содержимого | ||
окна | |||
SWP_NOSIZE | Сохраняет данные о текущем размере окна | ||
SWP_NOZORDER | Сохраняет текущее положение окна в списке других | ||
окон | |||
SWP_SHOWWINDOW | Отображает окно |
Совет
Можно скопировать значения констант из окна API Viewer непосредственно в ваше приложение. Избегайте задания числовых констант в вашем коде.
Текст программы типичного приложения WinTop, демонстрирующего использование функции SetWindowPos(), приведен ниже.
Программа 13.9. Приложение WinTop
Option Explicit
Private Declare Function SetWindowPos Lib "user32" _
(ByVal hwnd As Long, ByVal hWndInsertAfter As Long,_
ByVal x As Long, ByVal у As Long,
ByVal ex As Long, ByVal cy As Long,
ByVal wFlags As Long) As Long
Const HWND_TOPMOST = -1
Const SWP_SHOWWINDOW = &H40
Private Sub Form_Load()
Dim retValue As Long
retValue = SetWindowPos(Me.hwnd, HWND_TOPMOST,_
Me.CurrentX, Me.CurrentY, 300, 300, SWP_SHOWWINDOW)
End Sub
Эту методику можно использовать для создания окна
Search & Replace (Поиск и замена) в проекте RTFPad (см. гл.9). При этом данное окно будет оставаться расположенным поверх других окон и видимым при переходе в окно формы редактора (рис. 13.7). Для этого вставьте объявление функции SetWmdowPos() и пару констант в модуль
Public Declare Function SetWindowPos Lib "user32" _
(ByVal HWND As Long, ByVal hWndInsertAfter As Long,_
ByVal x As Long, ByVal у As Long, ByVal ex As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long
Public Const HWND_TOPMOST = -1
Public Const SWP SHOWWINDOW = &H40
Рис. 13.7. Диалоговое окно Search & Replace (Поиск и замена) видимо даже в том случае, когда активным становится другое окно
Кроме того, потребуется изменить программу обработчика события команды меню Find (Найти). Строку
SearchForm Show
замените следующим оператором:
SetWindowPos SearchForm.hwnd, HWND_TOPMOST, _
Me.CurrentX, Me.CurrentY, 470, 155, SWP_SHOWWINDOW
Значения 470 и 155, указанные в программе, являются размерами окна Search & Replace в пикселях. Значение свойства BorderStyle формы Search должно быть установлено в Fixed, тогда пользователь не сможет изменить размер окна.