Re[10]: Получить HWND ListBox выбора при разворачивании Comb
От: Carc Россия http://www.amlpages.com/home.php
Дата: 22.05.09 12:09
Оценка:
Здравствуйте, std.denis, Вы писали:

SD>Честно говоря не пойму глубину проблемы:

SD>1. после создания комбика попробовать получить хэндл его ComboLBox и если есть, то засабклассить
SD>2. при CBN_DROPDOWN опять получаем хэндл и если он еще не засабклассен(*), то делаем это

Как в чем глубина? Ну нафиг мне все сабклассенные ComboLBox разом? Мне же не нужен полный перехват процедуры!
Мне только сдвинуть его в момент разворота надо и ОК, остальное пускай сама делает.

Потом: писано это всё на MFC, и через класс наследник от CComboBox, если я засабклассю все экземпляры комбобоксов в проекте (а их может быть от 0 до дофига в момент Икс), то необходимо звать старенькую оконную процедуру через CallWindowProc. Причем звать ее из функции НЕ класса (ну или static-функции). А чтобы оконную процедуру звать, нужно знать ее адрес, и следовательно где-то его хранить.
И где? На уровне класса нельзя, т.к. мне надо обращаться к ней из той же static-класса, соответственно она вообще где-то сбоку должна быть.
А для чего всё это!?! Для того чтобы только подвинуть ComboLBox мне достаточно в любой момент времени сабклассить (ну или уж хучить) только один ComboBox, т.к. второй не может быть развернут в этот же момент (в пределах GUI-потока).

Тогда при моем варианте, (вешается на лету хук, малехо подвигали туда-сюда, и сняли хук. По сути можно тоже сделать и через сабклассинг) избавляемся от
а) кучи лишних сабклассов, которые в 99 из 100 нифига не делают, а ждут свой WM_WINDOWPOSCHANGING (ну да это ладно, фиг с ним).
б) избавляемся от необходимости где-то хранить данные с адресами обычной WNDPROC для каждого HWND. А вот это уже действительно плюс, т.к. напортачить со структурой что-то вроде map<HWND,WNDPROC> можно как два пальца об асфальт.

SD>3. в сабкласс-WndProc ждем WM_WINDOWPOSCHANGING и корректируем позицию на свое усмотрение

SD>Вроде все вполне реализуемо и выглядит жизнеспособно

SD>(*) Проверять можно либо сравнением адресов WNDPROC (не безопасно), или через SetProp/GetProp

Ну разве что так
Но все равно не нужно более одного сабклассенного ComboLBox в момент времени Икс (в пределах потока конечно).
PS: поковырял еще: все таки размер ComboLBox меняет именно после CBN_DROPDOWN, а не где-то раньше. Ну собственно что и было ожидаемо.
В общем, думаю что по любому надо делать через динамику хук\сабкласс поставили, погоняли немного ComboLBox по экрану, и сняли — вопрос только сабкласс или хук.
Хук тут разве что предпочтительнее для старых ОС: CB_GETCOMBOBOXINFO вообще поддерживается XP и старше, а GetComboBoxInfo не поддерживается в древних NT. А в хук hwnd ComboLBox по любому придет, не мытьем, так катаньем.
Но с другой стороны в хук тем же самым не мытьем, так катаньем много чего может придти, любая ошибка может вынурнуть вообще черт знает где...
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.