Win32 c Повторяет цвета RGB для windows в WM_PAINT

#c #winapi #colors #rgb #wm-paint

Вопрос:

У меня есть приложение VS2019 на c , которое имеет следующий интерфейс : интерфейс.png

Это удивительно работает для «одиночных» измерений (с помощью кнопки «Образец измерения»). Измерение выполнено, и все собранные данные отображаются на интерфейсе а) в графической форме, б)в числовой форме и в) в «цветной» форме, как вы можете видеть по большому желтому квадрату справа (моделирование).

Следующим шагом в моей разработке является отображение серии цветов 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, которые я широко использовал и до сих пор использую, существовала аналогичная инструкция типа «Управление обновлением», которую я успешно использовал.