Сабклассинг ComboBox
Данный пост описывает мое решение проблемы. Может кому и пригодиться.
По ходу написания своей жутко крутой программы ;) столкнулся с необходимостью перехватывать нажатия клавиш в комбобоксе (созданном со стилем CBS_DROPDOWN). В частности, неоходимо ослеживать нажатие клавиши Enter при редактировании видимого элемента (т.е. того, который всегда на виду, а не те, что видны в выпадающем списке).
Спасибо уважаемому Matush'у за подсказки по сабклассингу.
Но возникла проблема. Комбобокс не посылает в свою оконную процедуру ни WM_CHAR ни WM_KEYDOWN с WM_KEYUP. Пошарившись в рунете (т.к. с английским я не очень дружу) ничего толкового на эту тему не нашел. Не зная как подойти к решению этой проблемы запустил MSDN и написал в строке поиска "subclassing" (и чего я так сразу не сделал?). Какого же было мое удивление, когда я узнал, что комбобокс не такой простой, каким я представлял его раньше. В нем самом уже используется сабклассинг. То самое окно редактирования с видимым элементом является ничем иным, как обыковенным EditBox'ом. И именно его, EditBox'а, оконную процедуру необходимо переопределять. В MSDN делается это так: создается комбобокс (видимый), с помощью функции ChildWindowFromPoint получается хендл едитбокса, который сидит внутри кобмо, ну и через SetWindowLong переопределяется оконная процедура едита. В ней и идет вся обработка нажатых клавиш.
ЗЫ. Когда создаете комбо, не делайте его размер слишком маленьким (например, если не хотите показывать комбо сразу), и координаты в ChildWindowFromPoint передавайте такие, чтобы они заведомо попадали на комбовский едитбокс.
ЗЗЫ. Побольше читайте MSDN, хоть он и английский :)
Цитата: bad_duck
Побольше читайте MSDN, хоть он и английский :)
+100000000!!!!!!!!!!!!!!!!