На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Перерисовка окна , проблема с перерисовкой окна
    Здравствуйте!
    Следующая проблема:
    Есть диалоговое окно. В окне находятся элементы 20 штук, в которые происходит текстовый вывод (информация о человеке, ФИО и т.д.) и фотография. Информация меняется с некой периодичностью. В заисимости от человека поля в окне не только меняют свой текст, размер шрифта, но и расположение и размер.
    Использую функции SetWindowPos или MoveWindow (в конечном результате проблема возникала с использованием любой из функции).
    Некоторое время всё замечательно работает. но через количество смен информации в диалоговом окне (порядка 1000 смен) окно начинает перерисовывать не только свою область, но и область вне своего диалогового окна, а потом и вовсе мерцать начинает. Пробывал на нескольких машинах, и на некоторых машинах ещё и шрифт становится невообразимо большой.
    Проверял расположение всех координат элементов диалога - всё нормально.
    Раньше всё отлично работало. Но в какой-то момент вот приключилось такое дело...
    Может кто сталкивался с такой проблемой? Может ли это зависить от сервис паков винды? что-нибудь с msvcrt.dll?
    Буду очень благодарен за любую помощь..
    Спасибо..
    Сообщение отредактировано: Petukhov -
      Возможно проблема в том, что своевременно не удаляются выбираемые в контекст объекты - шрифты, кисти, перья...
        Цитата Petukhov @
        поля в окне не только меняют свой текст, размер шрифта

        Как это осуществляется? Есть подозрение, что dolphin прав.
          Осуществляется так:
          -сначала позицианирую элементы на форме и выставляю им размер.
          -затем с помощью SetFont выставляю элементам каждому свой шрифт
          -следом SetDlgItemText в каждый нужный элемент
          -UpdateWindow()
            Лучше пивести код отрисовки...
            Так трудно сказать в чем проблема
              Я бы все параметры через TRACE выводил бы в окно дебага, 100% в коде ошибка, при расчете позиций и размеров шрифтов.
              То что где-то там у тебя что-то мерцает это результат перемещения MoveWindow.
              То что ты пишешь, противоречит:
              Цитата

              Проверял расположение всех координат элементов диалога - всё нормально.

              Цитата

              Пробывал на нескольких машинах, и на некоторых машинах ещё и шрифт становится невообразимо большой.

              И как ты вообще его проверял ?

              Цитата

              Раньше всё отлично работало. Но в какой-то момент вот приключилось такое дело...

              А эта у всех так :)

              Цитата

              Может кто сталкивался с такой проблемой? Может ли это зависить от сервис паков винды? что-нибудь с msvcrt.dll?

              Вначале следует убедится, что ошибка не твоя, и только потом искать ее в других.
              Сообщение отредактировано: Groman -
                Цитата Groman @
                Я бы все параметры через TRACE выводил бы в окно дебага, 100% в коде ошибка, при расчете позиций и размеров шрифтов.
                То что где-то там у тебя что-то мерцает это результат перемещения MoveWindow.
                То что ты пишешь, противоречит:

                Да ничего не противоречит, наоборот, скорее доказывает утечки GDI ресурсов, которые в итоге приводят к такого рода глюкам при перерисовке.
                  2 Groman
                  Мерцания экрана не в момент позицианирования элементов, а именно после простоя программы... т.е. после того, как произошла перерисовка раз так 1000-1500 и поступление информации прекратилось, т.е. экран находится в состоянии покоя, то он, экран, начинает мерцать..
                  Координаты элементов и размер шрифта выводил в трейс - всё ок... но на некоторых машинах шрифт (я попробывал порядка 50 различных машин) получался через некоторое время на экране большой, размер которого не соответствовал размеу, выводимого в трейс... Ещё, шрифт большой получался только на машинах с утановленной на них 2000 виндой... на остальных хр... Мерцание и "заляпование" экрана вне моего диалогового окна происходит на всех машинах...
                  Полгода все работало отлично и проблем не возникало... и в какой-то момент я скомпелировал новую версию и пошли вот такие ошибки.. попытался откатить - ничего не помогло...
                  2 Uncle_Bob
                  если это утечка GDI, то как лучше её отловить? и где она может быть?

                  Завтра попаду на работу и выложу текст кода.. И, возможно, вы мне подскажите где и в чём я не прав...

                  Все большое спасибо за советы...
                    Uncle_Bob
                    Цитата

                    Да ничего не противоречит, наоборот, скорее доказывает утечки GDI ресурсов, которые в итоге приводят к такого рода глюкам при перерисовке.

                    Ну не знаю, я уже давно и много работаю с элементами с owner draw и их позиционированием, и у меня тоже все возможные параметры цветов и шрифтов меняются, такого никогда не было.
                      Всем большое спасибо!
                      Разобрался с ошибкой - она действительно порылась в создании шрифта.
                      Дело в том, что создание шрифта у меня на каком-то этапе попало в цикл, и, как оказалось, через определённое количество созданий происходит пробема с перерисовкой. Вышел из положения освобождением объекта шрифта после его использования.
                      ExpandedWrap disabled
                        CFont font;
                        font.CreateFont(..)
                        ..
                        font.DeleteObject();


                      font.DeleteObject();

                      Ещё раз всем спасибо за советы и обсуждение!

                      Добавлено
                      Спасибо! Вопрос решён!
                      Сообщение отредактировано: Petukhov -
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0504 ]   [ 16 queries used ]   [ Generated: 2.05.24, 15:13 GMT ]