Цвет диалога по наступлению события
От: Mescalin  
Дата: 15.06.06 08:16
Оценка:
Есть приложение "КПП", которое устанавливается на проходной предпрятия. мне нужно сделать так, что если сотрудник вставляет пропуск недействительный или что то типа того (нет доступа) — то фон диалогового окна модуля на некоторое время становится красным а потом плавно обратно в серый переходит. Если сложно сделать плавный переход, то объясните плиз хотя бы как фон по просто вызовом своей функции изменить. Я смог сделать только вот так:

CDC *c=GetDC();
CRect r;
GetClientRect(&r);
CBrush br(RGB(255, 0, 0));
c->FillRect(&r, &br);
UpdateWindow();

Однако этот код закрашивает весь диалог вместе с контролами. Я уверен что есть более красивое решение моего вопроса.

15.06.06 13:29: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: Цвет диалога по наступлению события
От: Mescalin  
Дата: 15.06.06 09:49
Оценка:
Нашел еще 2 способа перекрасить окно:

1)
CRect r;
GetClientRect(&r);
pDC->FillRect(&r, &myColor);
return CDialog::OnEraseBkgnd(pDC);

2)
CBrush backBrush(RGB(255, 0, 0));
// Записываем старую кисть
CBrush* pOldBrush = pDC->SelectObject(&backBrush);
CRect rect;
GetClientRect(&rect);
pDC->GetClipBox(&rect); // Стираем нужную область
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(),PATCOPY);

Разместил их обработчике события WM_ERASEBKGND. Но для того чтобы изменился фон необходима прерисовка диалога (любое действие над ним). Пробовал вызывать RedrawWindow() — работает, но при смене цвета окно моргает. При всем при применении первого способа закрашивания фон эдитов становится белым, и уже потом обратно в серый нее возвращается. Во втором случае фон под эдитами просто остается серым. Подскажите, как быть?
Re: Цвет диалога по наступлению события
От: Pavel Dvorkin Россия  
Дата: 15.06.06 11:02
Оценка:
Здравствуйте, Mescalin, Вы писали:

M>Есть приложение "КПП", которое устанавливается на проходной предпрятия. мне нужно сделать так, что если сотрудник вставляет пропуск недействительный или что то типа того (нет доступа) — то фон диалогового окна модуля на некоторое время становится красным а потом плавно обратно в серый переходит. Если сложно сделать плавный переход, то объясните плиз хотя бы как фон по просто вызовом своей функции изменить. Я смог сделать только вот так:


M>CDC *c=GetDC();

M>CRect r;
M>GetClientRect(&r);
M>CBrush br(RGB(255, 0, 0));
c->>FillRect(&r, &br);
M>UpdateWindow();

M>Однако этот код закрашивает весь диалог вместе с контролами. Я уверен что есть более красивое решение моего вопроса.


Поставь диалогу стиль Clip Children в его Property и не будут контролы закрашиваться.

Насчет плавного перехода — делай то же, что и делаешь, только по таймеру и меняй при этом цвет.
With best regards
Pavel Dvorkin
Re[2]: Цвет диалога по наступлению события
От: ekamaloff Великобритания  
Дата: 15.06.06 11:11
Оценка:
Здравствуйте, Mescalin, Вы писали:

M>Разместил их обработчике события WM_ERASEBKGND. Но для того чтобы изменился фон необходима прерисовка диалога (любое действие над ним). Пробовал вызывать RedrawWindow() — работает, но при смене цвета окно моргает. При всем при применении первого способа закрашивания фон эдитов становится белым, и уже потом обратно в серый нее возвращается. Во втором случае фон под эдитами просто остается серым. Подскажите, как быть?


Чтоб не моргало: InvalidateRect(hwndDlg, NULL, FALSE); и UpdateWindow опционально (если изменения должны быть отображены немедленно, а после этого еще производятся какие-нибудь долгие вычисления)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re: Цвет диалога по наступлению события
От: Doc Россия http://andrey.moveax.ru
Дата: 15.06.06 11:24
Оценка:
Здравствуйте, Mescalin, Вы писали:

M>Однако этот код закрашивает весь диалог вместе с контролами. Я уверен что есть более красивое решение моего вопроса.


... а главное правильное.
Результат вашего кода логичен, т.к. в вы закрашиваете все окно.
Что бы получить нужный результат см. обработку сообщения WM_ERASEBKGND.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Цвет диалога по наступлению события
От: Аноним  
Дата: 16.06.06 07:34
Оценка:
E>Чтоб не моргало: InvalidateRect(hwndDlg, NULL, FALSE); и UpdateWindow опционально (если изменения должны быть отображены немедленно, а после этого еще производятся какие-нибудь долгие вычисления)


применил похожую функцию InvalidateRect(rect,erase), однако моя задача все равно не выполнена =(. Мне бы хотелось чтобы фон стал на секунду красным а потом вернулся плавно в то значение каким был. Применяю для этого что то типа:

while (r!=212 || g!=208 || b!=200)
{
if (r>212) r--;
if (g<208) g++;
if (b<200) b++;
myColor.CreateSolidBrush(RGB(r,g,b));
pDC->FillRect(&rect, &myColor);
InvalidateRect(NULL,0);
}

в итоге пока диалог серым не станет контролов почти не видно и все дико моргает =(.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.