wParam/lParam в VBA

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

wParam/lParam в VBA

Сообщение SergeySV » 10.10.2003 (Пт) 11:23

Только не бейте меня ногами, просто раньше в VBA мне это не нужно было, а вот сейчас приперло и никакой справочной инфы по такому простому вопросу я не нашел.

Как проще всего на VBA разложить lParam/wParam на high/low-order word. В СИ проблем нет, всякие там LOWORD и т.д., да и вообще если надо до нескольких битов внутри lParam добраться (считать/записать)

Насколько я понимаю устанавливать можно через тоже AND/OR, но если надо какой-нибудь старший бит, это надо спец. число-маску готовить..... :-(, а считать как лучше: я только до CopyMemory додумался, не самое лучший вариант.

Видел примеры потрошения на RGB, там делят на какие-то числа... а по подробнее объяснить нельзя, какая логика (вернее приблизительно то логика понятна, все эти битовые операции. и т.п. и т.д. но только удержать все это в голове тяжело, интересен какой метод расчета, как подбирать-то эти числа).
Главное двигаться не быстрее, чем думает твоя голова.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.10.2003 (Сб) 7:07

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 13.10.2003 (Пн) 10:53

Спасибо конечно за ссылку, но как раз в этом моменте я и так разобрался: когда есть константы-флаги, каждая из которых отвечает за свой бит, то зная их (в том же шестн. виде для удобства) комбинировать через OR сложности не вызывает.

Проблема как раз если у нас нет готовых переведенных в нужный вид чисел для комбинирования опер. OR. Например у меня координаты x и y и мне их надо засунуть в wParam - 32 разр., т.е. по 16 на каждую координату, "y" например надо засунуть в верхн. 16 разр. - а оно у меня пока просто число типа long. Чтобы комбинировать x и y через OR, надо сначала к этому "y" добить в конец положенное количество нулей чтобы все значищ. единицы ушли за 16 разр. (для краткости переводим это число в шестн. систему) и уже потом их через OR - остается только вопрос как лучше это сделать на практике??? брать "y" и умножать его на 2^16, я правильно понимаю?

И соответсвенно обратный вопрос. А вытащить верхн. 16 разр. из 32 разр.? (тот же "y" например из wParam). Тут по идее надо сдвинуть все число вправо на 16 разр. - получается поделить что ли на 2^16???

Вообщем, не сочтите за труд ответить, правильной ли мы дорогой идем товарищи...
Главное двигаться не быстрее, чем думает твоя голова.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.10.2003 (Вт) 7:29

Эге, а со ссылочкой-то я промахнулся :shock:
Долбанутая она какая-то. Че хочет, то и открывает. А имел я в виду совет № 22. Там же функции есть для перевода. В частности, функция MakeDWord.
Да, действительно, нужно умножать на 65536. Но здесь две проблемы.
Во-первых, по идее нужен битовый сдвиг, а он в VB отсутствует, поэтому и приходится умножать на степень двойки, что влечёт кучу сопутствующих операций, в то время как сдвиг - это одна команда процессора.
Во-вторых, все числа, кроме байта, являются signed. А при составлении длинного числа из коротких нужно бы unsigned. Поэтому, если первый бит старшего слова установлен, то нужно его снять, потом умножить на 65536, и лишь потом бит вернуть операцией OR. В противном случае будет переполнение на умножении.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 14.10.2003 (Вт) 10:07

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

потом нашел такой очевидный вариант из СИ, если мы хотим извлечь определенные биты (или последовательность), то, например хотим извлечь с 0-5 бит:
исхд. число маска рез.
10101110101 AND 00000011111 10101
(ну все это конечно проще задавать через шестн. сист.)
т.е. в маске мы указываем единицы на тех позициях, которые мы хотим выцепить из числа и через побитовое AND получаем то что надо

конечно если надо с 5-8, то у тебя еще будут нули болтаться до 5 бита, но их легко потом вычесть из конечного числа
Главное двигаться не быстрее, чем думает твоя голова.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList