1

Тема: AHK: Высота и ширина вкладок tab

На буржуйском форуме нарыл способ изменять минимальную ширину вкладок в элементе управления tab.
Выглядит код просто:


Gui, Add, Tab, vMyTab HWNDtabID
SendMessage, TCM_SETMINTABWIDTH := 0x1331, 0,20,,ahk_id %tabID%

где 20 - минимальная ширина вкладки.
Но справка майкрософт предлагает более продвинутый способ изменения размеров вкладки
Здесь предлагается сообщение вида  TCM_SETITEMSIZE,  в котором можно менять и ширину, и высоту.
Только вот все эти LOWORD и HIWORD для меня - темный лес. Как все это правильно прикрутить в  SendMessage?

2 (изменено: YMP, 2013-12-21 04:30:11)

Re: AHK: Высота и ширина вкладок tab


TCM_SETITEMSIZE := 0x1329
lparam := width | hight << 16

3

Re: AHK: Высота и ширина вкладок tab

Хм... что-то не догоняю...


SendMessage, TCM_SETITEMSIZE := 0x1329, 0,width | hight << 16,,ahk_id %tabID%

не работает....

4 (изменено: serzh82saratov, 2013-12-21 20:18:20)

Re: AHK: Высота и ширина вкладок tab

Вроде так:


Gui, Add, Tab2, HWNDtabID w333 h333, 1|2
Gui, Show 
SendMessage, TCM_SETITEMSIZE := 0x1329, 0, lparam := 111 | 222 << 16, , ahk_id %tabID%
 ; SendMessage, TCM_SETMINTABWIDTH := 0x1331, 0,111,,ahk_id %tabID%
MsgBox, % "LOWORD = " lparam & 0xFFFF
        . "`nHIWORD = " lparam >> 16 
Return

Только ширина незадаётся.

И вопрос, правильно-ли я извлекаю:


MsgBox, % "LOWORD = " lparam & 0xFFFF
        . "`nHIWORD = " lparam >> 16 

И что значат & 0xFFFF и >> 16

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Высота и ширина вкладок tab

Sets the width and height of tabs in a fixed-width or owner-drawn tab control.


; TCS_FIXEDWIDTH := 0x400
Gui, Add, Tab2, +0x400 HwndtabID, General|View|Appearance|Settings
Gui, Show
Return

GuiClose:
    ExitApp

F11::
    width = 40
    height = 20
    SendMessage, TCM_SETITEMSIZE := 0x1329, 0, width | height << 16,,ahk_id %tabID%
Return

6

Re: AHK: Высота и ширина вкладок tab

serzh82saratov пишет:

И вопрос, правильно-ли я извлекаю:


MsgBox, % "LOWORD = " lparam & 0xFFFF
        . "`nHIWORD = " lparam >> 16 

И что значат & 0xFFFF и >> 16

Правильно. Операторы "и" и побитовый сдвиг.

7

Re: AHK: Высота и ширина вкладок tab

Правильно. Операторы "и" и побитовый сдвиг.

Но для дилетанта, это как об стенку горохом.
Не могли-бы Вы объяснить подробнее.

width | height << 16

Что именно делают | и << 16?

lparam & 0xFFFF

Что значат &  и 0xFFFF?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Высота и ширина вкладок tab

Но что именно объяснять? Сдвиг сдвигает на указанное число позиций, а оператор "или" производит операцию "или". 0xFFFF — это число. В общем, я вас не пойму.

9

Re: AHK: Высота и ширина вкладок tab

Небольшое уточнение (чтоб было понятней), в случае сдвига речь идет о двоичной системе.
00000101b << 2 = 00010100b
Как впрочем, и все логические операции проще понять, когда числа представлены в двоичном виде.

10 (изменено: serzh82saratov, 2013-12-22 18:57:10)

Re: AHK: Высота и ширина вкладок tab

Спасибо.
Но мне всё равно пока ничего не ясно.

речь идет о двоичной системе.
00000101b << 2 = 00010100b

если система двоичная, что значит лат. "b"?

SetFormat, IntegerFast, h
MsgBox, % 1 | 2 << 16

На выходе: 0x20001

Что куда смещено? На 16 позиций чего? Что всё таки "делает" "|"? Ничего непонятно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Высота и ширина вкладок tab

если система двоичная, что значит лат. "b"?

Видимо, это уточнение (D / H / B / O).

12 (изменено: serzh82saratov, 2013-12-22 20:36:33)

Re: AHK: Высота и ширина вкладок tab

Видимо, это уточнение (D / H / B / O).

Мой случай совсем запущенный - (D / H / B / O) тоже ни о чём не говорит.
Двоичная система в моём понимании это только единицы и нули.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Высота и ширина вкладок tab

Decimal, hexadecimal, binary, octal.

14

Re: AHK: Высота и ширина вкладок tab

Хорошо - 00010100 это байт. И что далее из этого проистекает?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: Высота и ширина вкладок tab

Irbis пишет:

00000101b << 2 = 00010100b

Было двоичное (об этом говорит буква b на конце) число 00000101. Произвели сдвиг на два разряда влево, то есть нули и единицы сместились на две позиции влево, получилось двоичное число 00010100.

Если я понимаю, о чём речь.

http://static.diary.ru/userdir/2/7/0/3/2703370/74660013.jpg

16

Re: AHK: Высота и ширина вкладок tab

YMP пишет:

TCM_SETITEMSIZE := 0x1329
lparam := width | hight << 16

А как "упаковать" отрицательные значения?


LOWORD := -100
HIWORD := -200
Param := LOWORD | HIWORD << 16

MsgBox, % "LOWORD = " Param & 0xFFFF
        . "`nHIWORD = " Param >> 16 
 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: Высота и ширина вкладок tab

Судя по всему, даже 32-битный АНК использует в таких операциях 64-битные числа. Поэтому приходится сдвигать на 48, чтобы правильно извлечь отрицательное 16-битное число из младших 16 бит. Вот этот вариант работает для любых сочетаний знаков.


LOWORD := -100
HIWORD := -200
Param := LOWORD & 0xFFFF | HIWORD << 16

MsgBox, % "LOWORD = " Param << 48 >> 48
        . "`nHIWORD = " Param >> 16

18

Re: AHK: Высота и ширина вкладок tab

Есть такой пример работы GetCursorPos:


DllCall("GetCursorPos", "int64P", pt)
cwx := pt << 32 >> 32
cwy := pt >> 32

может тогда:

LOWORD := -100
HIWORD := -200
Param := LOWORD & 0xFFFFFFFF | HIWORD << 32

MsgBox, % "LOWORD = " Param << 32 >> 32
        . "`nHIWORD = " Param >> 32

Вопрос в том как функция которой передаётся параметр "распакует" его, то есть в любом ли случае она правильно получит LOWORD и HIWORD из

LOWORD & 0xFFFFFFFF | HIWORD << 32

и из

LOWORD | HIWORD << 16

?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Высота и ширина вкладок tab

Ну, вообще-то тип WORD — это 16 бит. Поэтому сдвиг на 32 бита тут не к месту. А в примере с GetCursorPos половинки числа имеют по 32 бита. Функция вполне нормально распакует, ведь она знает, что ей должны передать. То, что АНК оперирует в сдвигах 64-битными числами, не значит, что он их и передаст. Если тип указан как int или uint, то он при вызове функциии обрежет число до 32 бит.

20

Re: AHK: Высота и ширина вкладок tab

YMP пишет:

Ну, вообще-то тип WORD — это 16 бит.

То есть в вашем примере параметр также остаётся 32 бит? Просто не понятно число 48.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: Высота и ширина вкладок tab

Тут надо разделять число и параметр. Числа в АНК 64-битные, а параметр будет 32-битный, т.к. верхние 32 бита АНК отрежет при передаче числа. Если параметр 8-битный, он отрежет всё, что выше 8 бит. Мой код оперирует с числом, а не с параметром.

Здесь отрицательное 16-битное число упаковано в младшие 16 бит 64-битного числа и надо, чтобы при распаковке получилось отрицательное 64-битное число с тем же значением. Простое "& 0xFFFF" тут не годится, поскольку тогда все биты выше младших 16 будут нулями, а у отрицательного числа они должны быть все 1. Чтобы их заполнить единицами, и используются сдвиги. Сначала младшие 16 бит сдвигаются влево до упора (на 48 шагов), так чтобы старший бит 16-битного числа (1 у отрицательных) стал старшим битом 64-битного. Потом идёт сдвиг обратно вправо, и при этом освобождающиеся слева биты заполняются этим самым старшим битом. Это так называемый арифметический сдвиг, сохраняющий знак числа. Если бы 16-битное число было положительным, старший бит был бы 0 и освобождающиеся биты заполнились бы нулями. Конечно, для положительных чисел трюк со сдвигами не нужен, там достаточно "& 0xFFFF", но и вреда им от него не будет.

22

Re: AHK: Высота и ширина вкладок tab

Так сработает, только если число не выходит за границы Short:

SetFormat, IntegerFast, H  ; для нагдядности
a := -0x8001   ; Int
MsgBox, % a &= 0xFFFFFFFF   ; UInt
MsgBox, % a << 48 >> 48

a := 0x8000   ; Int
MsgBox, % a &= 0xFFFFFFFF   ; UInt
MsgBox, % a << 48 >> 48

Для 32-битных в общем случае так:

SetFormat, IntegerFast, H
a := -0x8001      ; Int
a &= 0xFFFFFFFF   ; UInt
MsgBox, % a > 0x7FFFFFFF ? -~a - 1 : a
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23

Re: AHK: Высота и ширина вкладок tab

teadrinker пишет:

Так сработает, только если число не выходит за границы Short:

Не совсем понял. Если ты о моём коде, то он и предназначен для Short.

24 (изменено: teadrinker, 2016-04-29 11:28:25)

Re: AHK: Высота и ширина вкладок tab

Наверно, просто у вас тут разговор вперемежку и о тех, и о других. Потом, иногда ведь нужно получить и Int из UInt тоже.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder