Visual Basic 6. Руководство разработчика

Размещение одного окна поверх других


Часто приходится сталкиваться с приложениями, которые размещают свое окно поверх окон других приложений независимо от того. какое именно из них является активным. Примером такого окна может служить окно 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, тогда пользователь не сможет изменить размер окна.


Содержание раздела