Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Закраска немодального диалогового окна  (Прочитано 10725 раз)
0 Пользователей и 1 Гость смотрят эту тему.
borsh
Интересующийся

ru
Offline Offline

« : 13-12-2013 07:51 » 

Подскажите, пожалуйста,

В основном окне выведено несколько маленьких немодальных окон. Нужно, чтобы по какому-то событию (например - клик на данном маленьком окне), только это окно меняло цвет. Вроде простое дело, но никак не получается.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 13-12-2013 12:51 » 

borsh, ну раз простое, то покажи код, который у тебя не делает то, что ты ожидаешь.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
borsh
Интересующийся

ru
Offline Offline

« Ответ #2 : 16-12-2013 07:12 » 

У меня получается закрасить немодальное окно при начальном запуске программы - При создании изображения немодального окна виндоус генерит сообщение ON_WM_CTLCOLOR, по приходу которого программа запускает подпрогорамму OnCtlColor (приведена ниже)
HBRUSH CTest::OnCtlColor(CDC* pDC, Cwnd* pWnd, UINT nCtlColor)
{
return my_color;
}

Здесь CTest - немодальный диалог класса Cdialog, а my_color - его переменная типа СBrush
class CTest: public Cdialog
{
public:
CTest();
~CTest();
virtual BOOL OnInitDialog();
afx_msg HBRUSH OnCtlColor(CDC* pDC, Cwnd* pWnd, UINT nCtlColor)
CBrush my_color;
}

Цвет кисти определяется в OnInitDialog
BOOL Ctest::OnInitDialog()
{
my_color.CreateSolidBrush(RGB(0,255,155);
return TRUE;
}
Так вот все это работает при начальном запуске программы, когда идет прорисовка всех окон. Вопрос как это заставить работать после  запуска программы, например по нажатию кнопки или по изменению какого-то параметра. Как допустим, по нажатию кнопки сгенерить сообщение  ON_WM_CTLCOLOR 
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 16-12-2013 08:55 » 

borsh, вообще говоря, событие WM_CTLCOLOR генерировать не нужно. А нужно обновить содержимое окна через Update() или пометить окно требующим перерисовки через Invalidate(). Однако выбор события странноват - это больше относится к рамке окна, чем к содержимому. За содержимое отвечает WM_PAINT, и ещё там что-то связанное с фоном есть.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 16-12-2013 09:24 » 

WM_ERASEBKGND, но в принципе можно использовать что-то одно.

Дело в том, ЧТО находится на этом диалоге.  Если ваще ничего, то достаточно будет WM_PAINT/WM_ERASEBKGND. Или же если все элементы диалога отрисовываются самостоятельно, те не являются окнами (производными CWnd).
Если же используются элементы управления (control), то WM_CTLCOLOR вызывается для каждого из них - отсюда и CTLCOLOR.

А вобще, задание сформулированно очень расплывчато. Что именно должно менять цвет? По какому событию? Что представляют собой "маленькие немодальне окна"?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
borsh
Интересующийся

ru
Offline Offline

« Ответ #5 : 16-12-2013 10:38 » 

Ну если более конкретно - то есть много прессов в цеху для вулканизации резины, для каждого пресса надо контролировать 3 температуры, при превышении порога любой температуры надо окрашивать значок пресса в красный цвет.

В качестве значка пресса я выбрал немодальный диалог (просто прямоугольник). На нем расположил три Edit окошка, куда я вывожу температуру. С этим все хорошо. Но нужно при превышении любой температуры окрашивать этот диалог (значок пресса) в красный цвет. Я могу это сделать для всех прессов сразу при запуске программы, когда для каждого пресса (немодального диалога) при его создании и прорисовке генерируется ON_WM_PAINT. Об этом я написал написал в предыдущем письме. Но как сгенерить сообщение WM_CTLCOLOR только для одного пресса (немодального диалога),по отклику на которое будет изменен фон этого немодального диалога на красный или любой другой серо-буро-малиновый?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 16-12-2013 11:07 » 

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

Для отрисовки фона окна используется WM_ERASEBKGND, которое делает очистку окна и заливку цветом фона. Либо же используется WM_PAINT, которое рисует что угодно. WM_PAINT - более универсально.

Далее, вызов WM_PAINT делается операционной системой, когда окно "испорчено". Порча окна происходит при разворачивании, при изменении размеров, при загораживании другими окнами и таскании других окон поверх, либо вручную. Вручную "испортить" окно можно, вызвав у окна Invalidate. После этого операционная система, обнаружив это состояние, сама сгенерирует WM_PAINT.

Таким образом, нужны: а) процедура, которая настраивает brush для рисования фона и вызывает Invalidate; б) обработчик WM_PAINT, который рисует фон заранее настроенным brush.

Эту процедуру можно вызывать откуда угодно: хоть из инициализатора, хоть из обработчиков событий клавиатуры, мыши, таймера, хоть из внешних частей программы. Обработчик WM_PAINT всегда вызывается автоматически, и вручную посылать сообщения никуда не надо.
« Последнее редактирование: 16-12-2013 11:10 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
borsh
Интересующийся

ru
Offline Offline

« Ответ #7 : 16-12-2013 11:29 » 

Спасибо огромное, выручили. Будет работать цех вулканизации резины!
Я в последнем письме опечатался, указав один раз ON_WM_PAINT вместо WM_CTLCOLOR. На самом деле я работаю только пока с WM_CTLCOLOR. Но ваша подсказка что все эти сообщения на перерисовку диалога, такие как WM_PAINT так и WM_CTLCOLOR генерятся при запуске Invalidate() была просто супер. WM_ERASEBKGND тоже попробую.

Если кому надо работающие исходники - пришлю, пишите.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 16-12-2013 19:22 » 

Цитата: borsh
кому надо работающие исходники
Мне не надо.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 17-12-2013 08:48 » 

Дим, нууу не руби с плеча. Вот надоест тебе программированием заниматься, откроешь на старости лет цех по вулканизации резины и ага. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 17-12-2013 13:19 » 

Джон, для родного цеха не жалко - я уж как-нибудь сам тряхну стариной. Желательно без "немодальных окошек".
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 17-12-2013 14:48 » new

По старинке, в OnPaint, с разделённой от UI структурой данных...
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines