![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
mekhanikus |
|
|||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Может кому-то вопрос покажется странным, но всетаки.
Началось все с того, что я решил сделать subclassing стандартного STATIC'а, написать для него собственный WM_PAINT. Задача была, в общем то, успешно решена. Однако, в процессе тестирования программы выявилась неприятная особенность: в момент раздачи STATIC'ам (их много на форме) значений через WM_SETTEXT, происходит неприятное мерцание этих самых STATIC'ов. Насколько я понял, это происходит потому, что "The DefWindowProc function sets and displays the window text" причем делает это дефолтным шрифтом и цветом, а потом все это заново перерисовывается моим WM_PAINT'ом. Подскажите, как этого можно избежать? Можно ли отучить DefWindowProc перерисовывать текст? Или как самому обработать WM_SETTEXT? |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 2 Всего: 33 |
Это из-за того что тело, вызывающее SendMessage() на ходится не в отдельном потоке.
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
GremlinProg |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
можно просто блокировать на некоторое время перерисовку любого рода: блокировать:
разблокировать:
субклассить Static и перехватывать WM_SETTEXT ( и WM_GETTEXT, если все еще нужно встроенное рисование static'а ) в процедуре окна, какие тут могут быть проблемы? ты ведь первое уже делаешь:
проблема моргания контролов уже неоднократно обсуждалась, достаточно поискать по форуму WM_PAINT -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||
|
|||||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: -1 Всего: 14 |
вам нужно заблокировать WM_ERASEBKGND - это он мерцает
|
|||
|
||||
mekhanikus |
|
||||||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Надо будет покурить в эту сторону.
Представте себе - проблема (для меня ![]() Не смог найти куда засунуть текст, полученый в WM_SETTEXT. Пожалуйста пните в нужном направлении. Добавлено через 12 минут и 46 секунд
Пробовал, не помогает. Причина, имхо, именно в реакции DefWindowProc на WM_SETTEXT. |
||||||
|
|||||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: -1 Всего: 14 |
такого попросту быть не может если вы перекрываете отрисовку и блокируете WM_ERACEBKGND то больше никто ничего не рисует если мерцание происходит в момент, когда ваш код перерисовывает контрол, то значит надо рисовать в буфер а потом копировать посредством BitBlt |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
J0ker, не стоит быть столь категоричным, когда речь идет о старых контролах виндоус. Насчет статика утверждать не берусь, но вот комбобокс точно рисуется не только на WM_PAINT...
Из вышесказанного, конечно, не следует, что аффтар все правильно сделал. Но такое вполне может быть (что отрисовка на settext идет не через стандартный WM_PAINT). С другой стороны, если сделать контрол полностью OwnerDraw, то должно помочь - тогда действительно все под контролем. -------------------- ... |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: -1 Всего: 14 |
вы неправильно понимаете процесс если что либо меняется для контрола, что требует его перерисовки, то контролу посылается WM_PAINT - если вы его (правильно) перехватили, то больше никто ничего в клиентской области рисовать не будет (за исключением, как я говорил выше, WM_ERACEBKGND) |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Как уже сказано, это не обязательно так, для некоторых старых контролов. Во всяком случае, комбобоксу не получается кастомизировать отрисовку без полного OwnerDraw, только перехватом WM_PAINT, а они со статиком ровестники, еще из Win 3 приползли, так что там костыль на костыле, и вполне возможна "оптимизация" отрисовки. -------------------- ... |
|||
|
||||
J0ker |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: -1 Всего: 14 |
стоит все контролы - это обычные окна что значит "рисуется на"??? WM_PAINT - мессадж, дающий команду на перерисовку клиентской области - других нет - все, что рисуется в клиентской области рисуется в ответ на WM_PAINT я так подозреваю, что вы имеете ввиду owner-drawn контролы - но это уже из другой оперы
не может
под контролем родительского окна
это что называется "через <--->" ЗЫЖ я столь категоричен не от упрямства, а от опыта ![]() Добавлено @ 09:43 как уже сказано - получается не поручусь за выпадающий список, но все остальное перерисовывается на ура: http://www.codeproject.com/KB/combobox/Com...x?display=Print Это сообщение отредактировал(а) GremlinProg - 12.5.2009, 01:49 |
||||||||
|
|||||||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: -1 Всего: 14 |
да, заыл сказать, что листбокс - разговор отдельный
|
|||
|
||||
mekhanikus |
|
|||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Оказывается может. Сначала, чтоб проверить, получился ли у меня сабклассинг, я сделал пустой WM_PAINT, который возвращает 0. (знаю, что это не правильно, но, вопрос не в этом). После запуска программы сабкассированные статики остались пустыми (что и требовалось доказать). Однако, после раздачи значений через WM_SETTTEXT они появились. Добавлено через 8 минут и 32 секунды А кто, всетаки, скажет, где хранится этот самый текст окна (WindowText)? Если б я это узнал, то сам бы обработал WM_SETTEXT, без лишней отрисовки. |
|||
|
||||
GremlinProg |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
а что подозревать, когда Earnest, так и пишет: а выпадающий список не контрол? и почему не поручишься, только что ведь утверждал, что все рисуются только в ответ на WM_PAINT ) это ты зря, бывают моменты, когда отрисовка идет, к примеру при захвате мыши (EDIT, RICHEDIT), т.е. она конечно на WM_PAINT тоже идет, но вот именно при "таскании" курсора по тексту, текущее выделение рисуется "на лету", перерисовка окна тут не происходит, накладно Добавлено через 7 минут и 38 секунд
это черный ящик, и дорога к нему закрыта обрабатывай сам, просто текст храни в своем буфере, чтобы при отрисовке обращаться только к нему -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: -1 Всего: 14 |
специфическая его часть
потому, что не рабботал с этой частью но не вижу причин, почему она должна быть исключением - так шо 99% - на WM_PAINT или WM_NCPAINT не вижу противоречия с моим высказыванием |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ну надо же, а я думал это обычный контрол, как и все а это оказывается какой-то хитрый специфический трюк винды не расстраивай меня J0ker, может ты еще будешь настаивать что и меню это не контрол, а какой-то очередной специфический трюк? я совсем тогда разочаруюсь ) тогда и не нужно так категорично настаивать рисовать может кто угодно, где угодно и когда угодно другой вопрос - какие могут быть причины, чтобы не рисовать чего-либо на WM_PAINT ну это уже совсем ни в какие ворота: от свои слов же не будешь отказываться я просто привел буквально самый очевидный пример, когда WM_PAINT добровольно вообще не посылается в контрол, пока не будет отпущена мышь как же нет противоречий-то? ps: конечно WM_PAINT ни кто ни кому не посылает (он генерируется в момент простоя, когда область перерисовки не пуста), это просто допустимый оборот речи в этом топике для краткости -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |