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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2016, 10:25   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
Сообщение FillRect и дочерние контролы

Здравствуйте.
Давно интересует такой вопрос.
Имеем статик со стилем SS_BITMAP и кнопки на нам.
Если залить его FillRect(dcStatic, r, brush);, то заливаются все дочерние контролы статика. Как сделать, чтобы они не заливались?
Поиск приводит только к GetDCex(static, 0, DCX_CLIPCHILDREN or DCX_CACHE); и WM_SETREDRAW, но это не помогает.
Создавать регион тоже не вариант, так как количество и позиция контролов может меняться.
BLACK_RAIN вне форума Ответить с цитированием
Старый 18.11.2016, 10:26   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

WS_CLIPCHILDREN
А вы уверены, что они дочерние?
Попробуйте так же WS_CLIPSIBLINGS.
waleri вне форума Ответить с цитированием
Старый 18.11.2016, 10:30   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
WS_CLIPCHILDREN
А вы уверены, что они дочерние?
Попробуйте так же WS_CLIPSIBLINGS.
Это, конечно же, тоже пробовал. Не помогает.
Могу код показать.
Код:
  fPanel := CreateWindowEx(WS_EX_CLIENTEDGE,'static','',
                      WS_CHILD    or WS_VISIBLE or SS_NOTIFY or SS_BITMAP,
                     0,0, 666,666, fRoot, 0,HInstance,nil);
  dcPanel := GetDC(fPanel);
  //или так
  dcPanel := GetDCex(fPanel, 0, DCX_CLIPCHILDREN or DCX_CACHE);
  btn := CreateWindowEx(WS_EX_CLIENTEDGE,'button','', WS_CHILD or WS_VISIBLE ,
                     0,0, 50,20, fPanel, 0,HInstance,nil);
					 
  GetClientRect(fPanel,r);
  FillRect(dcPanel,r,brushPanel);
WS_CLIPCHILDREN / WS_CLIPSIBLINGS - это не работает, если у статика есть стиль SS_BITMAP. А если его нет, тогда после FillRect система сама перересует статик в сообщении WM_CTLCOLORSTATIC (но без заливки дочерних).
А мне надо самому перерисовывать.

Последний раз редактировалось BLACK_RAIN; 18.11.2016 в 11:24.
BLACK_RAIN вне форума Ответить с цитированием
Старый 18.11.2016, 11:28   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Так может стоит перенести GetDC *после* создания дочернего окна?
Глядишь и WS_CLIPCHILDREN заработает...
waleri вне форума Ответить с цитированием
Старый 18.11.2016, 12:51   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Так может стоит перенести GetDC *после* создания дочернего окна?
Глядишь и WS_CLIPCHILDREN заработает...
ага, опять протупил.
но тогда получается, что каждый раз при ресайзе надо освобождать DC и получать его заново?
BLACK_RAIN вне форума Ответить с цитированием
Старый 18.11.2016, 20:06   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

А вообще зачем хранить DC?
Лучше получать его каждый раз когда надо рисовать.
waleri вне форума Ответить с цитированием
Старый 18.11.2016, 20:47   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А вообще зачем хранить DC?
Лучше получать его каждый раз когда надо рисовать.
А можно пример когда без получения в каждой функции не обойтись?
Кроме экономии хэндлов не вижу тому причин. Да и Delphi к примеру их хранит и не получает каждый раз.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 18.11.2016, 21:14   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
А можно пример когда без получения в каждой функции не обойтись?
Не понял вопроса. Если есть много функций, где нужен DC то наверно лучше его передавать как параметр функции и вызывать их когда нужно рисовать.
waleri вне форума Ответить с цитированием
Старый 20.11.2016, 11:02   #9
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А вообще зачем хранить DC?
Например, когда TextOut() по таймеру.
BLACK_RAIN вне форума Ответить с цитированием
Старый 20.11.2016, 11:23   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

А что мешает получать DC при обработке таймера?
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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