Окна и манипуляторы ver 2.0

Вступление

В первом номере журнала вы уже познакомились с понятиями окно и манипулятор окна. Напоминаю: окно - это объект, занимающий прямоугольный участок экрана. Он может содержать другие окна, называемые дочерними. Манипулятор окна это способ идентификации окна в системе.
В этой статье мы продолжим изучать окна и их свойства.

Координаты и размеры окна

В данной статье вы узнаете, с помощью каких Api функций можно получить или поменять координаты и размер окна:

1. Получаем координаты и размер окна:

'Функция для получения координат и размера окна
Private Declare Function GetWindowPlacement Lib "user32" (ByVal hwnd As Long, lpwndpl As WINDOWPLACEMENT) As Long
'Необходимые структуры
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type RECT
Left As Long 'Координата X верхнего левого угла
Top As Long 'Координата Y верхнего левого угла
Right As Long 'Координата X нижнего правого угла
Bottom As Long 'Координата Y нижнего правого угла
End Type
Private Type WINDOWPLACEMENT
Length As Long
flags As Long
showCmd As Long
ptMinPosition As POINTAPI 'Координаты окна в свёрнутом состоянии
ptMaxPosition As POINTAPI 'Координаты окна в развёрнутом состоянии
rcNormalPosition As RECT 'Координаты окна в нормальном состоянии
End Type

Использование:

Dim ord As WINDOWPLACEMENT
GetWindowPlacement Me.hwnd, ord
MsgBox "Form.Left = " & ord.rcNormalPosition.Left & " Form.Top = " & ord.rcNormalPosition.Top
'ord.rcNormalPosition.Left и ord.rcNormalPosition.Top описывают местонахождение верхнево левого угла окна.
В данном примере выдаётся диалоговое окно о текущем положении формы. Выдаётся оно в пикселях, чтобы это справить и перевести в твипы, нужно
ord.rcNormalPosition.Left и ord.rcNormalPosition.Top, в данном примере умножить на 15 (Твип равен 1/15 пикселя). Вот так:
MsgBox "Form.Left = " & ord.rcNormalPosition.Left * 15 & " Form.Top = " & ord.rcNormalPosition.Top * 15
Теперь мы увидим координаты формы в пикселях.
Размеры окна можно рассчитать так:
Dim vHeight, vWidth
vHeight = (ord.rcNormalPosition.Bottom - ord.rcNormalPosition.Top) * 15 'Высота - Height
vWidth = (ord.rcNormalPosition.Right - ord.rcNormalPosition.Left ) * 15 'Ширина - Width
Таким образом, мы можем определить координаты и размеры любого окна в системе.

2. Меняем координаты и размер окна:


'Функция для изменения координат и размера окна
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
'Необходимые константы
Const SWP_NOSIZE = &H1 'Сохранить текущие размеры
Const SWP_NOMOVE = &H2 'Сохранить текущее положение

Использование:

1. Изменяем координаты окна
SetWindowPos Me.hwnd, 0, 100, 200, 0, 0, SWP_NOSIZE 'Меняем координаты формы на (100, 200)

2. Изменяем размеры окна
SetWindowPos Me.hwnd, 0, 0, 0, 233, 345 , SWP_NOSIZE 'Меняем координаты размеры формы на Width = 233, Height = 345

3. Изменяем размеры и координаты окна
SetWindowPos Me.hwnd, 0, 100, 200, 233, 345 , 0

Теперь вы можете изменять размеры и координаты любого окна в системе.
Автор статьи: Хованский Ян (web: yansoft.by.ru)