forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Как разложить Hex значение на константы (http://forum.boolean.name/showthread.php?t=20433)

DarkInside 10.10.2016 17:56

Как разложить Hex значение на константы
 
Чет не знаю, как задать вопрос в поисковик... Допустим, мы получаем сумму стилей, примененных к окну = 0х16000000. Как это число разложить и узнать, какие константы суммируются? Как этот алгоритм называется?

Код:

Global Const $WS_TILED = 0
Global Const $WS_OVERLAPPED = 0
Global Const $WS_MAXIMIZEBOX = 0x00010000
Global Const $WS_MINIMIZEBOX = 0x00020000
Global Const $WS_TABSTOP = 0x00010000
Global Const $WS_GROUP = 0x00020000
Global Const $WS_SIZEBOX = 0x00040000
Global Const $WS_THICKFRAME = 0x00040000
Global Const $WS_SYSMENU = 0x00080000
Global Const $WS_HSCROLL = 0x00100000
Global Const $WS_VSCROLL = 0x00200000
Global Const $WS_DLGFRAME = 0x00400000
Global Const $WS_BORDER = 0x00800000
Global Const $WS_CAPTION = 0x00C00000
Global Const $WS_OVERLAPPEDWINDOW = 0x00CF0000
Global Const $WS_TILEDWINDOW = 0x00CF0000
Global Const $WS_MAXIMIZE = 0x01000000
Global Const $WS_CLIPCHILDREN = 0x02000000
Global Const $WS_CLIPSIBLINGS = 0x04000000
Global Const $WS_DISABLED = 0x08000000
Global Const $WS_VISIBLE = 0x10000000
Global Const $WS_MINIMIZE = 0x20000000
Global Const $WS_CHILD = 0x40000000
Global Const $WS_POPUP = 0x80000000
Global Const $WS_POPUPWINDOW = 0x80880000

UPD: Доперло, что можно каждую константу перемножать побитово, например:
Код:

If 0х16000000 И $WS_VISIBLE Then константа $WS_VISIBLE используется
и т.д. с каждым стилем, но это какое-то топорное решение или так и должно быть?

ABTOMAT 10.10.2016 18:05

Ответ: Как разложить Hex значение на константы
 
Биты?

DarkInside 10.10.2016 18:10

Ответ: Как разложить Hex значение на константы
 
Цитата:

Сообщение от ABTOMAT (Сообщение 309139)
Биты?

Вот так?

UPD: Доперло, что можно каждую константу перемножать побитово, например:

Код:

If 0х16000000 И $WS_VISIBLE Then константа $WS_VISIBLE используется
и т.д. с каждым стилем, но это какое-то топорное решение или так и должно быть?

Можешь какой-нить пример подкинуть на любом ЯП, разберусь..

RegIon 10.10.2016 18:33

Ответ: Как разложить Hex значение на константы
 
Эм, я думаю обратного точного решения нет. Возможно несколько комбинаций.
Константы на деле что-то типо такого:
Код:

0b00000000010000001
Это не сумма, а побитовое ИЛИ над ними применяется. Что правда лучше не делает, если пересекающиеся значения существуют (у тебя такие есть)
И для простого примера, где:
Код:

a = 0b0001
b = 0b0011
c = 0b0010

X:0b011 может разложиться как :
Код:

X = a || c
или
X = b

А у тебя еще и коллизии, как ты узнаешь верное значение?

DarkInside 10.10.2016 18:40

Ответ: Как разложить Hex значение на константы
 
Цитата:

А у тебя еще и коллизии, как ты узнаешь верное значение
В смысле как я получаю это значение? Через Win_API: GetWindowLongPtr($hWnd, $GWL_STYLE).

RegIon 10.10.2016 18:40

Ответ: Как разложить Hex значение на константы
 
Код:

Global Const $WS_MAXIMIZEBOX = 0x00010000
Global Const $WS_MINIMIZEBOX = 0x00020000

Global Const $WS_TABSTOP = 0x00010000
Global Const $WS_GROUP = 0x00020000

Коллизия.
Код:

Global Const $WS_POPUP = 0x80000000
Global Const $WS_POPUPWINDOW = 0x80880000
Global Const $WS_OVERLAPPEDWINDOW = 0x00CF0000

Бинарная коллизия:
Код:

0000 0000 1000 0000 0000 0000 0000 0000 0000 0000
0000 0000 1000 0000 1000 1000 0000 0000 0000 0000
0000 0000 0000 0000 1100 1111 0000 0000 0000 0000


DarkInside 10.10.2016 18:43

Ответ: Как разложить Hex значение на константы
 
Цитата:

Сообщение от RegIon (Сообщение 309144)
Код:

Global Const $WS_MAXIMIZEBOX = 0x00010000
Global Const $WS_MINIMIZEBOX = 0x00020000

Global Const $WS_TABSTOP = 0x00010000
Global Const $WS_GROUP = 0x00020000


А что это значит? :-)

RegIon 10.10.2016 18:48

Ответ: Как разложить Hex значение на константы
 
$WS_MINIMIZEBOX у тебя или $WS_GROUP ? Оба сылаются на один битовый флаг.

DarkInside 10.10.2016 18:50

Ответ: Как разложить Hex значение на константы
 
Цитата:

Сообщение от RegIon (Сообщение 309146)
$WS_MINIMIZEBOX у тебя или $WS_GROUP ? Оба сылаются на один битовый флаг.

Аааа, блин точно ведь...невнимательно посмотрел. Ну $WS_TABSTOP и$WS_GROUP можно в приципе выкинуть.

Черт возьми, у меня похоже еще константы старые, на msdn другие значения... То что у меня похоже для 32-битных систем.

Ну это не суть, главное научиться раскладывать

DarkInside 10.10.2016 19:16

Ответ: Как разложить Hex значение на константы
 
В общем, мне надо что сделать: в windows 10 по умолчанию шапка окна у приложений меняет цвет: у активного приложения серая, у неактивного белая. Надо сделать так, чтобы только у одного приложения цвет не менялся. Можно, конечно, свою рамку нарисовать, но желательно оставить стандартную. У меня есть приложение самсунговское, где цвет рамки всегда серый и рамка у него стандартная, вот узнать бы какие стили они намешали, чтобы так получилось. Ну и в целом надо с этими стилями разобраться, как убрать рамку, элементы меню, скрыть из панели задач - с каждым из этого по отдельности я уже разобрался, при комбинации приложение почему-то теряет фокус. Может из-за неправильных констант, кстати. Спасибо за наводку. PS. Надо клиентскую область MS Word встроить в свое приложение без ActiveX.


Часовой пояс GMT +4, время: 06:17.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot