Есть приложение "КПП", которое устанавливается на проходной предпрятия. мне нужно сделать так, что если сотрудник вставляет пропуск недействительный или что то типа того (нет доступа) — то фон диалогового окна модуля на некоторое время становится красным а потом плавно обратно в серый переходит. Если сложно сделать плавный переход, то объясните плиз хотя бы как фон по просто вызовом своей функции изменить. Я смог сделать только вот так:
Разместил их обработчике события WM_ERASEBKGND. Но для того чтобы изменился фон необходима прерисовка диалога (любое действие над ним). Пробовал вызывать RedrawWindow() — работает, но при смене цвета окно моргает. При всем при применении первого способа закрашивания фон эдитов становится белым, и уже потом обратно в серый нее возвращается. Во втором случае фон под эдитами просто остается серым. Подскажите, как быть?
Здравствуйте, 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 и не будут контролы закрашиваться.
Насчет плавного перехода — делай то же, что и делаешь, только по таймеру и меняй при этом цвет.
Здравствуйте, 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
Здравствуйте, 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);
}
в итоге пока диалог серым не станет контролов почти не видно и все дико моргает =(.