Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2016, 11:32   #11
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А что мешает получать DC при обработке таймера?
Тогда придется каждый раз вызывать
Код:

      if Assigned(fFont) then
      SelectObject(fDC, fFont.Handle);
      SetBkMode(fDC,TRANSPARENT);
      SetTextColor(fDC, fColorFont);
      SetBkColor(fDC,fColorBackground);
и т.п.
А если делать это при движении мыши, то вообще слишком часто получится.
BLACK_RAIN вне форума Ответить с цитированием
Старый 20.11.2016, 13:16   #12
Hailov
Пользователь
 
Регистрация: 08.10.2016
Сообщений: 18
По умолчанию

Есть же WM_PAINT.
В нем классически получаем hDC через BeginPaint.
Можно eще WM_ERASEBKGND обработать. Да масса вариантов... Или есть нюанс именно со статиком?

Цитата:
WS_CLIPCHILDREN / WS_CLIPSIBLINGS - это не работает, если у статика есть стиль SS_BITMAP
А временно отключить стиль SetWindowLong ?

Последний раз редактировалось Hailov; 20.11.2016 в 13:21.
Hailov вне форума Ответить с цитированием
Старый 20.11.2016, 13:23   #13
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Hailov Посмотреть сообщение
Есть же WM_PAINT.
В нем классически получаем hDC через BeginPaint.
Можно eще WM_ERASEBKGND обработать. Да масса вариантов... Или есть нюанс именно со статиком?
мне нужно рисовать по таймеру или (иногда) при движении мышью.
BLACK_RAIN вне форума Ответить с цитированием
Старый 20.11.2016, 13:28   #14
Hailov
Пользователь
 
Регистрация: 08.10.2016
Сообщений: 18
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
мне нужно рисовать по таймеру или (иногда) при движении мышью.
Отлично. В таймере вызвать InvalidateRect, и пойдет прорисовка WM_PAINT
Hailov вне форума Ответить с цитированием
Старый 20.11.2016, 13:54   #15
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Hailov Посмотреть сообщение
InvalidateRect
Из ее описания ничего не понял. Она просто вызывает событие WM_PAINT, но функции рисования будут действовать только в пределах Rect?
BLACK_RAIN вне форума Ответить с цитированием
Старый 20.11.2016, 14:13   #16
Hailov
Пользователь
 
Регистрация: 08.10.2016
Сообщений: 18
По умолчанию

Вобщем да. Точнее она добавляет новый регион прорисовки (После WM_PAINT все регионы обнуляются). Можно указать вторым параметром NULL и прорисуется вся клиентская зона.
Так намного удобнее: все рисование в классичекой WM_PAINT.
У вас еще была проблема с повторными установками атрибутов контекста. Ее можно решить созданием окна с со стилем CS_OWNDC.

Последний раз редактировалось Hailov; 20.11.2016 в 14:20.
Hailov вне форума Ответить с цитированием
Старый 20.11.2016, 14:29   #17
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
мне нужно рисовать по таймеру или (иногда) при движении мышью.
Таймер нужен только если на экране "движущиеся картинки"... События мыши тоже не особо частые.

А, впрочем, дело хозяйское, храните DC да и меняйте, когда resize будет...
Вы, похоже, всегда целиком все окно рисуете...
waleri вне форума Ответить с цитированием
Старый 20.11.2016, 16:48   #18
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Hailov Посмотреть сообщение
CS_OWNDC
Это значит, что уникальный DC получат либо все дочерние окна, либо ни одно?

Цитата:
Сообщение от waleri Посмотреть сообщение
Вы, похоже, всегда целиком все окно рисуете...
Вы имеете ввиду разбить отрисовку на несколько стадий и вызывать каждую в нужный момент?
BLACK_RAIN вне форума Ответить с цитированием
Старый 20.11.2016, 17:13   #19
Hailov
Пользователь
 
Регистрация: 08.10.2016
Сообщений: 18
По умолчанию

Цитата:
Это значит, что уникальный DC получат либо все дочерние окна, либо ни одно?
Нет. Классически, вы должны зарегистрировать свой класс окна с этим стилем и тогда все экземпляры окон данного класса будут иметь свой неизменяемый контекст.
Еще, как вариант, при сложной логике рисования, где критична скорость выполнения и где можно пренебречь излишнем использованием памяти, можно всю отрисовку выполнять на битмэпе в памяти, а в нужный момент: InvalidateRect вызывает WM_PAINT и в нем BitBlt куска битмэпа на контекст окна.

PS/ Вы вроде как дельфи юзаете. Не исключено, что формы порождаемые им уже имеют стиль CS_OWNDC. Гляньте SPY+

Последний раз редактировалось Hailov; 20.11.2016 в 17:21.
Hailov вне форума Ответить с цитированием
Старый 20.11.2016, 17:19   #20
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

ладно, разберусь
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пропали контролы с формы Дамир Общие вопросы .NET 6 11.01.2017 23:16
пользовательские контролы ts-alan ASP.NET 3 30.03.2015 16:18
Контролы для Silverlight (4,5) LeniumSoft WPF, UWP, WinRT, XAML 1 07.07.2012 20:32
Контролы SilverLight Elkenos WPF, UWP, WinRT, XAML 1 12.02.2011 10:23
Контролы на baloonhint Toxa Компоненты Delphi 0 06.11.2007 17:33