Здравствуйте, 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 по любому придет, не мытьем, так катаньем.
Но с другой стороны в хук тем же самым не мытьем, так катаньем много чего может придти, любая ошибка может вынурнуть вообще черт знает где...