![]() |
|
|
![]()
|
|
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Такая вот проблемка возникла. Создаю комбобокс, помещаю в него строки. Затем мне нужно его переместить методом MoveWindow, после чего текст в комбобоксе выделяется.
и вот, что, примерно, у меня получается в итоге ![]() может кто-то сталкивался с подобным? как убрать выделение? пробовал снимать выделение сразу после перемещение - всё ужасно мерцает. -------------------- ![]() |
|||
|
||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 12 Всего: 26 |
Ты-же сам выделяешь айтем Добавлено через 54 секунды Или попробуй сразу после перемещения снимать фокус с комбобокса -------------------- ????? ??, ??????? ?????. |
|||
|
||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Andrey44, SetCurSel не выделяет, а устанавливает тест из списка. Фокус снимать пробовал - не помогает, да и нет на нём фокуса.
И, кстати, если MoveWindow убрать, то всё отлично. Это сообщение отредактировал(а) Cheloveck - 24.4.2009, 15:41 -------------------- ![]() |
|||
|
||||
| Albor |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
По-моему со стилем DROPDOWN выбранный итем всегда выделен. Попробуй другой стиль (DROPLIST кажется)
|
|||
|
||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Не DROPLIST, а DROPDOWNLIST, но в них разница лишь в том, что второй создаёт ридонли комбобокс, а первый - редактируемый, выделяемость тут не при чём. -------------------- ![]() |
|||
|
||||
| Albor |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Да, это так. Я когда-то боролся с этим делом, сейчас поднял свой проект, там я использовал Ownerdraw Fixed комбобокс, выделение появляется только при получении фокуса - меня это устроило. |
|||
|
||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 12 Всего: 26 |
Cheloveck, используй не MoveWindow, а ::SetWindowPos с флагом SWP_NOACTIVATE.
Потому-что MoveWindow использует именно ::SetWindowPos но не известно с какими флагами. -------------------- ????? ??, ??????? ?????. |
|||
|
||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Andrey44, не помогло, эффект тот же :-(
-------------------- ![]() |
|||
|
||||
| voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
Cheloveck, у комбобокса есть метод SetEditSel
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Не может быть, чтобы убирание фокуса с комбобокса не убирало выделения. Значит, фокус неправильно убрал. Когда окно в фокусе - обязательно будет выделен элемент. Если у тебя Drop List можно только вместо выделения всего элемента поставить каретку.
-------------------- ... |
|||
|
||||
| Cheloveck |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
результат смотри выше. voov, метод SetEditSel это не то. да и не получится у меня снимать выделение после перемещения каждый раз. У меня комбобокс перемещается когда меняется размер формы, поэтому перерисовка очень частая и если снимать каждый раз выделение, то получается жуткая картина. -------------------- ![]() |
||||
|
|||||
| voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
а если SetCurSel заменить на SetWindowText?
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Вообще-то этот кусок кода ни о чем не говорит. Контекст-то неизвестен. Например, если этот код находится в функции OnInitDialog, и ты возвращаешь TRUE, можешь хоть обставиться фокусами, все равно фокус будет на другом контроле... Или если кнопка OK недоступна, можешь хоть 10 раз на нее фокус ставить. Но это так, к слову. Проверить-то просто. Табом перейди на следующий контрол и посмотри, во-первых, кто это будет, а во-вторых, не исчезнет ли выделение. Далее, если до перемещения комбобокс был не в фокусе, то нужно выяснить, почему на него фокус ставится. Тебе уже предлагали использовать SetWindowPos, и есть сомнения, что сделал это коррекстно. В любом случае, можно словить SetFocus на комбе и посмотреть что в стеке - откуда он приходит-то. А попытки тыкать пальцем в небо и искать какие-то эзотерические рецепты - заведомо бесполезны. -------------------- ... |
|||
|
||||
| Cheloveck |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Тогда я не буду знать какой айтем выбран и программа допишет в файл строку, которая там уже есть.
У меня в этом сомнений нет, я не только сделал, что советовали, но и прочитал MSDN и сделал ещё много вариантов. Ладно буду дебажить. Добавлено через 3 минуты и 10 секунд
В данном случае - да, это OnInitDialog, но это лишь пример, реально этот код находится в обработчике OnSize. Фокус ещё раз повторяю отсутствует на комбобоксе, кнопка доступна и фокус на ней!!! В проекте перекидывал фокус на другие контролы. -------------------- ![]() |
||||||
|
|||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Чего я не понимаю - это как сохраняется выделение при отсутствии фокуса...
Мне на стандарных комбобоксах добиться такого эффекта не удалось... -------------------- ... |
|||
|
||||
| Cheloveck |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
![]() Я сам вполне понимаю глупость ситуации. Но не может быть два фокуса!!! Это сообщение отредактировал(а) Cheloveck - 29.4.2009, 16:26 -------------------- ![]() |
||||
|
|||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Не, ну это уже перебор....
Опять всё то же... Я тут подумал, а если фокус помещается на комбобокс при перемещении, а потом уходит дальше, а выделение остаётся? Может есть какой-то флаг при создании комбобокса (или даже главного окна), чтобы текстовые поля без фокуса не выделялись? Это сообщение отредактировал(а) Cheloveck - 30.4.2009, 13:34 -------------------- ![]() |
|||
|
||||
| voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
Cheloveck, елси поменять местами вызовы SetCurSel и MoveWindow, то выделения нет.
такое решение устроит? |
|||
|
||||
| voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
елси использовать стиль CBS_DROPDOWNLIST вместо CBS_DROPDOWN, тоже помогает
Добавлено через 3 минуты и 11 секунд и вот еще такой код не оставляет выделения:
|
|||
|
||||
| Cheloveck |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Нет, не устроит, ибо мне надо перемещать после добавления и выбора строки.
Мне нужно редактируемое поле.
Ясно сказано, что текстовое поле заменяется статиком. Хотя в результате моей Spy-атаки на Explorer, я выяснил, что Microsoft всё же использует CBS_DROPDOWNLIST, вероятно проводя какие-то манипуляции по замене статика эдитом. Фокус убирать я тоже пробовал, НО, мне нужно перемещать контролы при изменении размера окна. И если постоянно снимать фокус - то выделение мерцает. //========================================================================== Очень интересные результаты показало исследование сообщений, при изменении размера комбобокса, точнее эдита в нём:
То есть, выделение устанавливается не так, как было прочитано, а EM_SETSEL nStart:0 nEnd:2147483647. Тем не менее решение найдено!!! Не оптимальное, но в моём случае достаточное.
Плюс к этому при изменении размеров я ввёл таймер, который производит перемещение контролов каждые 100 миллисекунд (собственно как в Qt). Мерцания не видно, выделение текста сохраняется, что и требовалось. P.S. тема закрыта. Это сообщение отредактировал(а) Cheloveck - 5.5.2009, 16:08 -------------------- ![]() |
||||||||||
|
|||||||||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |