#c #winapi #colors #rgb #wm-paint
Вопрос:
У меня есть приложение VS2019 на c , которое имеет следующий интерфейс :
Это удивительно работает для «одиночных» измерений (с помощью кнопки «Образец измерения»). Измерение выполнено, и все собранные данные отображаются на интерфейсе а) в графической форме, б)в числовой форме и в) в «цветной» форме, как вы можете видеть по большому желтому квадрату справа (моделирование).
Следующим шагом в моей разработке является отображение серии цветов RGB на экране, проведение измерений и сохранение их в файл. Для этого я просто прикрепляю измерительное устройство к экрану и последовательно выбираю все нужные мне цвета RGB, каждый раз проводя измерения.
Поэтому я добавил кнопку «Экран измерения». Который использует этот код :
inProgress = true;
RECT RectRGB = { 561, 83, 968, 439 };
int Red[] = {255, 128, 64, 0};
for (int i = 0; i < 3; i ) {
Red1 = Red[i];
Green1 = 0;
Blue1 = 0;
InvalidateRect(hWnd, amp;RectRGB, true);
}
inProgress = false;
Я «ожидал», что код будет работать так: каждый вызов Invalidate будет отправлять сообщение в событие WM_PAINT и обрабатываться таким образом :
RECT rectSRGB = { 561, 83, 968, 439 }; // x1, y1, x2, y2
if (inProgress) {
HBRUSH FillRGB = CreateSolidBrush(RGB(Red1, Green1, Blue1));
FillRect(hdc, amp;rectSRGB, FillRGB);
DeleteObject(FillRGB);
}
else {
HBRUSH FillRGB = CreateSolidBrush(RGB(sRGB.Red, sRGB.Green, sRGB.Blue));
FillRect(hdc, amp;rectSRGB, FillRGB);
DeleteObject(FillRGB);
}
IOW, пока флаг «InProgress» не поднят, событие WM_PAINT обрабатывает сообщение «нормально». Только когда сообщение приходит от функции «MEASURE_SCREEN», прямоугольник заполняется указанным цветом RGB (заданным в глобальной области).
Ну что, это не работает? Функция перебирает цвета ОК и каждый раз вызывает «Аннулировать», это соответствует моей логике «InProgress», но «новый» цвет никогда не отображается на экране, пока управление не выйдет из функции.
Я уже довольно долго искал, как это сделать, и решил, что могу попросить вас о любезной и терпеливой помощи.
Комментарии:
1.
InvalidateRect()
в конечном итоге приводит к публикации сообщения WM_PAINT. Обратите внимание, я говорю «отправлено». Это означает, что WM_PAINT помещается в очередь сообщений и удаляется из очереди при вызовеGetMessage()
илиPeekMessage()
в цикле сообщений.InvalidateRect()
просто говорит, что часть окна нужно перерисовать, и Windows в конечном итоге отправит WM_PAINT в очередь сообщений. Если вы хотите сразу же перерисовать окноInvalidateRect()
после этого, позвонитеUpdateWindow()
илиRedrawWindow()
. Но я не уверен, что это хорошо делать в цикле. Не уверен, что именно пытается быть реализованным.2. @JosephWillcoxson : Спасибо за разъяснение и предложение обновить окно (). Я попробую это сделать. На самом деле, то, что я пытаюсь сделать, очень просто: отправить на монитор несколько различных цветов RGB и заставить мой измерительный прибор проанализировать каждый из них, сохранив результаты в файл для последующей обработки. Количество цветов может быть 10, или 20, или 800, понимаете? Каждый цикл измерений занимает около трех секунд.
3. @JosephWillcoxson: Вау! Я просто добавил вызов UpdateWindow(hWnd) после вызова InvalidateRect (), и режим обновления, отладки, как только отладчик ударил по этой инструкции, был мгновенным! Буду с радостью следовать «этому направлению мыслей»! На других языках, таких как VisualBasic, которые я широко использовал и до сих пор использую, существовала аналогичная инструкция типа «Управление обновлением», которую я успешно использовал.