![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Kostik88 |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Здравствуйте!
У меня такая проблема. Я рисую график в диалоговом окне используя двойную буферизацию... вроде всё работает, по крайней мере выводится на экран. На главном окне имеется слайдер при движении которого график диалога должен менятся. Если использовать при этом InvalidateRect то всё неприятно мигает =( . Может есть какойнибудь способ чтобы избежать этого мерцания? Вот код:
А вот что я пишу в оьработчике слайдера, чтобы изображение графика менялось в диалоге
Спасибо! |
||||
|
|||||
| mekhanikus |
|
|||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Если я правильно понял, график должен прокручиваться по горизонали?
Т.е. высота графика равна высоте окна, а ширина больше. Я бы сделал так: При создании окна (WM_CREATE) создавал CompatibleBitmap высотой в окно, шириной сколько надо. Рисуем график в hdcMem. В WM_PAINT достаточно сделать BitBlt из hdcMem в окно с нужным смещением. В WM_HSCROLL меняем смещение и опять BitBlt. И необязательно перерисовывать весь диалог. |
|||
|
||||
| Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
не совсем, слайдер распологается не на дмалоге, а на главном окне от куда и вызывается диалог графика. Слайдер нужен для того чтобы менять значения в таблице данных по которой и строится данный график. |
|||
|
||||
| mekhanikus |
|
|||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Нифига не понял, но все равно, не надо в WM_PAINT засовывать всю процедуру перерисовки. Сперва нарисуй, а затем GetDC-BitBlt-ReleaseDC, и все в окошке! Vожно даже без InvalidateRect, |
|||
|
||||
| Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
процедура перерисовки у меня располагается не в WM_PAINT, а в WM_HSCROLL.
Я сначала рисую в буфер потом вывожу на экран с помощью BitBlt, вопрос не в том как я рисую, а как мне избавиться от InvakidateRect и зменить её чемнибудь, что позволяло бы избавиться от мерцания графика при движении слайдера! Это сообщение отредактировал(а) Kostik88 - 23.7.2008, 15:36 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
перехвати сообщение WM_ERASEBKGND так:
если ты рисуешь задний план, то рисуй его так же на втором буфере, только что объяснял с чем связано моргание и как с ним бороться: http://forum.vingrad.ru/index.php?showtopi...t&p=1584779 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
GremlinProg, перехватл сообщение WM_ERASEBKGND , ваще хрень получилась =)
Я извиняюсь, я может не совсем конкретно сформулировал вопрос) Просто мне нужно както обновлять изображение, а то у меня в окне график не меняется.... а должен, я проверял с помощью InvalidateRect, всё работает идеально, только мигает... Двойная буферизация работает, т.к. всё выводится на экран, только при смене значений(с помощью слайдера) он почемуто не хочет менятся =(. Мне просто нужна както поменять картинку чтобы при выборе других данных график менялся. |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
Как это не хочет меняться, если вы вначале жаловались, что мигает.. формулируйте вопрос пожалуйста, чтоб не требовалось дофантазировать.
Вызов перерисовки надо вызывать именно так.. Мигает не из за этого..
Ну вот опять приходится дофантазировать чего это Вы там натворили. Совет перехватить очистку фона правильный и без его перехвата Вы не добьетесь нужного Вам эффекта. Как итог : для того чтоб избавиться от мигания нужно 1.поставить пустой обработчик на WM_ERASEBKGND 2. Использовать двойную буфферизацию и выводить только в WM_PAINT 3. для обновления окна вызывать InvalidateRect(..) Если после этого мигание останется пересмотрите свой код - однозначно что то упустили )) |
||||||
|
|||||||
| Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Ещё раз извеняюсь за неточный вопрос!
B]mes[/B], я пытаюсь избавиться от мерцания с помощью двойной буферизации изображения а не тем что вы мне написали. Мне нужен аналог, может даже алгоритм такой чтобы найти альтернативу ф-ции InvalidateRect, и кажется в самом начале я об этом упомянул.
от этого и происходит мигание! Добавлено через 4 минуты и 9 секунд Просто я пытался заменить InvalidateRect таким образом что я закрашивал клиентскую облась(естественно в hdcMem) какойнибудь кистью. А из обработки сообщения слайдера я посылал сообщения диалоговому окну ( if(hDialog!=NULL) SendMessage(hDialog,WM_PAINT,0,0); ). |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
Нет не от этого .. Данная функция всего лишь устанавливает область для перерисовки и никакого вывода на ькран не делает )) А от того что перед тем как вызвать WM_PAINT в котором Вы реализовали двойную буфферизацию, вызывается WM_ERASEBKGND которая заливает область сводя на нет все Ваши усилия... Как бороться с этим написано в предыдущем посте.. |
|||
|
||||
| Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Спасибо всем за помощь, особенно GremlinProg. Вроде теперь график не мигает) я просто забыл убрать копирование в буфер фона.
GremlinProg, к вам ещё один вопросец. У меня в диалоге имеются кнопки, вот они жутко мигают, как бы это можно убрать? Добавлено через 3 минуты и 44 секунды mes,
Мои усилия на двойную буферизацию или на закраску областью кистью? =) |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
||||
|
||||
| Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Ну не скажите... Я попробовал убрать её напрочь, двойную буферизацию всмысле, и результат не порадовал=) |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
У нас разговор двух глихих получился я говорил что как хорошо бы двойная буферизация не была бы сделана, стирание фона (WM_ERASEBKGROUND или другое небуфферизованное) добавляет "много" мигания что у нас уже оффтопик получается.. главное что все получилось! Удачи и в дальнейшем Это сообщение отредактировал(а) mes - 23.7.2008, 22:21 |
|||
|
||||
| Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Спасибо! Теперь буду ломать голову как мигание кнопок убрать
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
а кнопки у тебя над графиком располагаются? тогда установи флаг родителя вырезать_область_детей:
Это сообщение отредактировал(а) mes - 23.7.2008, 22:45 |
|||
|
||||
| Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Нет, у меня кнопки непосредственно в области рисования, под графиком распологаются. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
я и имел ввиду, что в области рисования - разницы то нет какое расположение у них по отношению к графику - главное, что перерисовка затрагивает область дочерних окон.. Решение проблемы - использование флага из предыдущего поста Это сообщение отредактировал(а) mes - 23.7.2008, 23:04 |
|||
|
||||
| Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Ок. Я попробую=)
|
|||
|
||||
| Kostik88 |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
mes, я попробовал изменить стиль класса окон с помощью ф-ции SetClassLong :
для диалога(родителя):
и для кнопки (ребёнок):
но мигание не исчезло. Может я чтото не так делаю? |
||||
|
|||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
1. WS_xxx - это стили окна, а не класса окна: не SetClassLong, а SetWindowLong
2. такие глобальные стили, как WS_CLIPCHILDREN обычно не выставляются функцией, а добавляются при инициализации окна 3. стиль - это флаг, или набор флагов, его нужно ставить такой комбинацией: new_style = old_style | style_flag, а не простым присваиванием, т.е. нужно дополнительно получить старые стили (GetWindowLong) 4. если ты уверен, что твое приложение будет запускаться только под OS XP, то все проблемы с морганием решит всего лишь один дополнительный стиль WS_EX_COMPOSITED, дешево и сердито Это сообщение отредактировал(а) GremlinProg - 24.7.2008, 16:18 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Можно увидеть каконибудь примерчик, если не трудно, я несовсем понял? 0о Это сообщение отредактировал(а) Kostik88 - 24.7.2008, 17:02 |
|||
|
||||
| GremlinProg |
|
||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
для диалога в редакторе ресурсов есть соответствующая галочка "Clip children", но можно и вручную задать любые флаги, для этого открываем файл *.rc в любом текстовом редакторе и находим ресурс диалога, я покажу пример на стандартном about-box'е:
здесь мы видим две ключевые строчки: STYLE и EXSTYLE чтобы дополнительно включить какой-нибудь стиль нужно добавить его в соответствующую строку через операцию or(|), например сейчас я добавлю дополнительный стиль, которого нет в редакторе форм:
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||||||
|
|||||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
2. установить флаг в CreateStruct перед вызовом функции CreateWindow или в редакторе ресурсов (как показал GremlinProg) 3. типа такого: SetWindowLong(hDlg,GCL_STYLE, GetWindowLong(hDlg,GCL_STYLE ) | WS_CLIPCHILDREN ); Это сообщение отредактировал(а) mes - 24.7.2008, 17:19 |
|||
|
||||
| Kostik88 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 9.5.2008 Репутация: нет Всего: 2 |
Спасибо огромное mes, GremlinProg. Вы меня опять выручили.
Всё заработало |
|||
|
||||
| Letchik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 5.1.2010 Где: UGTB Репутация: нет Всего: нет |
Не буду новую тему открывать и спрошу здесь
Говорят, что после процедуры рисования надо всегда удалять все объекты (RleaseDC, DeleteDC и т.д.). Только не понятно как тогда работает двойная буферизация. Ведь все, что я нарисовал должно храниться в отдельном контексте устройства, а мы его берём и удаляем... Ничего не понял!.. И почему нельзя в обработчике WM_CREATE создать контекст устройства не удаляя его до завершения программы? |
|||
|
||||
| ForceKeeper |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 17.3.2010 Где: Минск Репутация: нет Всего: нет |
Нужна помощь с устранением мерцания статус бара (стандартный). В стиль главного окна добавил WS_CLIPCHILDREN, сама основная часть бара мерцать перестала, но вот созданные нам нем две секции с текстом как творили беспредел, так и творят. Пробовал добавлять клипчилдрен при создании бара
(CreateStatusWindow (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, "Готов", hwnd, ID_STATUS)) - не помогло. |
|||
|
||||
| guenko |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 26.5.2010 Репутация: нет Всего: нет |
В InvalidateRec последний параметр используй FALSE
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |