Что нового

$SM_CXDLGFRAME - нагло врет, как получить актуальный размер границ окна?

Sαuron

Новичок
Сообщения
45
Репутация
1
Толщина вертикальных линий при стандартной теме windows 7, на глаз 6-7 пикселей, достаточно толстая рамка. Но почему, когда я прописываю
Код:
msgbox(64, 'Title', _winapi_getsystemmetrics($SM_CXDLGFRAME))

Я получаю ответ 3? - Это же вранье... Даже судя по размерам окна и клиентской области, толщина минимум 5 этих границ. Как получить реальный размер границ вертикальных/горизонтальных/заголовка?
 
Автор
S

Sαuron

Новичок
Сообщения
45
Репутация
1
Вот скрин, очевидно же, что граница намного шире 3 -.-
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Sαuron
реальный размер границ
Зависит от стиля окна
Код:
$GUI = GUICreate("")
;~ $GUI = GUICreate("", -1, -1, -1, -1, 0x80000000) ; $WS_POPUP
;~ $GUI = GUICreate("", -1, -1, -1, -1, 0x00CF0000) ; $WS_OVERLAPPEDWINDOW

$aPos = WinGetPos($GUI)
$aClient = WinGetClientSize($GUI)
$iBorder = ($aPos[2] - $aClient[0]) / 2
$iCaption = $aPos[3] - $aClient[1] - $iBorder

ConsoleWrite("Рамка: " & $iBorder & @CRLF & "Заголовок: " & $iCaption & @CRLF)
 
Автор
S

Sαuron

Новичок
Сообщения
45
Репутация
1
Все равно пишет 3 пикселя, очень странно...
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Sαuron
Потому что GuiCreate() по умолчанию создаёт окно с неизменяемыми размерами. Попробуйте с закомментированными строками: для стиля $WS_POPUP будет 0, для $WS_OVERLAPPEDWINDOW будет 8.
 
Автор
S

Sαuron

Новичок
Сообщения
45
Репутация
1
InnI сказал(а):
Sαuron
Потому что GuiCreate() по умолчанию создаёт окно с неизменяемыми размерами. Попробуйте с закомментированными строками: для стиля $WS_POPUP будет 0, для $WS_OVERLAPPEDWINDOW будет 8.
Так то ясно, но суть в том, что нужно замерить границы стороннего окна, убрать их совсем применяя стиль через user32 очень и очень шаткий вариант, через раз срабатывает, а иногда вообще как-то ломает границы... :(
Попробуйте поставить тему Aero 7 стандартную, посмотрите какие широкие границы у окон, но даже по принципу вычитания клиентского размера из основного, не получаются настоящие размеры границ.


Добавлено:
Сообщение автоматически объединено:

Теоретически, скрипт все верно считает, если создано окно 400, 400, а его размеры 406, 428, то очевидно что размеры рамки 3, а титла 28-3 = 25. Но, ФАКТИЧЕСКИ, рамка и титл намного жирнее, они отнимают размер внутреннего окна 400х400, оно где-то 396х395, рамка отжимает место внутреннее, как вообще так может быть, как понять размер реальной рамки, не от балды же она такой становится, где-то это прописано? Я очень хочу с этим разобраться. Вот скрин еще.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Sαuron
замерить границы стороннего окна
И в чём проблема? В моём примере $GUI - это дескриптор окна (handle). Подставьте дескриптор нужного вам окна и получите толщину его рамок.

не получаются настоящие размеры границ
Они получаются всегда. Просто иногда реальные отличаются от видимых, т.к. при некоторых стилях диспетчер окон dwm.exe дорисовывает рамку в соответствие с темой оформления. Посмотрите реализацию функции _ScreenCapture_CaptureWnd(). Там вы увидите вариант определения "расширенной" рамки через вызов "DwmGetWindowAttribute".
 
Верх