![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
feodorv |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Уважаемые форумчане!
Может, кто сталкивался с подобной проблемой. Работаю на чистом WinAPI. Есть диалог с табом, при переключении которого отображается соответствующий ListView через ShowWindow( SW_HIDE/SW_SHOW ). Вседа работал в ListView с выбранными (SELECTED) элементами, но разрешал только один такой элемент. Теперь решил перейти на чисто фокусный элемент (FOCUSED) с тем, чтобы покрасивше можно было его оформить. Так вот, при одном запуске одной и той же программы ListView рисуется нормально, с прерывистой рамкой у фокусного элемента ListView, а при другом запуске - эта рамка уже не отображется (ни на одном ListView). Если бы не подсветил фокусный элемент другим цветом заднего плана, то и не поймёшь, где там фокус. При этом все клавиши перемещения текущего элемента (Up/Down/PgUp etc) работают исправно, фокус перемещается. Такое впечатление, что что-то недоинициализировано, и какая-то переменная получает случайное значение, но что именно, не могу понять. Чуть больше информации
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||||
|
|||||||||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Вставил логгирование в обработчик уведомления NM_CUSTOMDRAW. Выяснил, что один и тот же элемент ListView отрисовывается дважды подряд. Естественно, рамка пропадает, поскольку DrawFocusRect второй раз просто стирает ранее нарисованную рамку:
Не прав. Когда рамка рисуется, данные тоже запрашиваются 2 раза подряд... Это сообщение отредактировал(а) feodorv - 1.8.2013, 17:08 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
Вот здесь что-то похожее на вашу проблему.
Главный вывод из прочитанного: это таки обычное поведение для вендузятины (если вас это успокоит ![]() (подозреваю что поведение этой рамки еще слегка варьируется от версии венды) Ну а выход... может плюнуть на эту рамку и отрисовывать что-то похоже самому? Добавлено через 8 минут и 41 секунду
то есть она вообще только при заходе клавиатурой должна отрисовываться. а это не ваш случай. |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
volatile, спасибо большое за ответ и ссылку
![]() Ничего, зато есть над чем подумать ![]()
В принципе, можно жёстко диалогу UISF_HIDEFOCUS поставить, и в CDRF_NOTIFYPOSTPAINT рамку рисовать. Но как-то это неестестественно, что ли))) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Случай, кстати, явно похожий, только более тонкий)))
Если при старте программы (когда активным становится первый ListView) в диалоге нажать два раза TAB, то прямоугольник фокуса появляется... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
feodorv |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Дело точно в установленном флаге UISF_HIDEFOCUS. Поставил на него проверку:
И что получил:
Кто-то из контролов всё испортил ![]() Вставил после initDialog в WM_INITDIALOG
Теперь так:
![]() Это сообщение отредактировал(а) feodorv - 1.8.2013, 21:28 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||
|
|||||||||
feodorv |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Ну, кажись, всё
![]() Вместо
Да уж. Знаю по собственному опыту))) Да и в свиснутом у Microsoft коде полно комментов типа
или
![]() -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||
|
|||||||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Опять не прав. Так не починилось.
Оставил WM_CHANGEUISTATE в WM_INITDIALOG, а WM_UPDATEUISTATE послал, когда исчерпалась очередь сообщений диалога. Танцы с бубнами, forever. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
feodorv, интуитивно чувтвую что - лучше все-же сделать своими руками.
Даже если вы и отладите на своей ОS, не факт что глюк не вылезет на другой. Они же что-то там подкручивают еще. Еще и темы оформления бывают ... Как это будет там? никто знает... ![]() В общем я бы сделал подсветку своими руками. (Ну или клавиатурные комбинации посылайте чтоли, не знаю. но это .. ![]() |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Да, согласен, "подушка безопасности" нужна))) Думаю как раз про этот вариант ![]() А чо? Нормальное решение - подождать, пока всё успокоится и нанести ответный удар ![]() -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
ну если оно будет работать, то возможно ... Может кто что еще посоветует... Честно говоря, конкретно с этим, я дел не имел, просто почитал тот топик, и мне показалось что это одно из тех многочисленных мест в венде, где мелкомягкие устроили танцы с бубном. А это они делать умеют. Пару раз натыкался на такие места... Вроде бы уже все нормально, но в последний момент опять что-то вылазило ни с того, ни сего... ![]() А вобще писать гуй на чистом винапи... это что-то... ![]() |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
"Поживём - увидим" ©))) Да не, ссылка дана хорошая, симптомы почти совпадают. Я вот найти подобное не смог, пришлось в их сурсы лезть... Это мазохизм!!! Даже не знаю, чем оправдаться. Но вот так сложились обстоятельства ![]() -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |