首页 > 解决方案 > Win32 c ++将RGB颜色迭代到WM_PAINT中的窗口

问题描述

我有一个具有以下界面的 VS2019 c++ 应用程序: 界面.png

它对“单次”测量(通过“测量样本”按钮)非常有效。测量完成,所有收集的数据显示在界面上 a) 以图形形式,b) 数字形式和 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, &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, &rectSRGB, FillRGB);
        DeleteObject(FillRGB);
    }
    else {
        HBRUSH FillRGB = CreateSolidBrush(RGB(sRGB.Red, sRGB.Green, sRGB.Blue));
        FillRect(hdc, &rectSRGB, FillRGB);
        DeleteObject(FillRGB);
    }

IOW,只要未引发“inProgress”标志,WM_PAINT 事件就会“正常”处理消息。只有当消息来自“MEASURE_SCREEN”函数时,矩形才会填充指定的 RGB 颜色(在全局范围内指定)。

好吧,这行不通?该函数遍历颜色 OK 并每次调用“Invalidate”,它会达到我的“InProgress”逻辑,但“新”颜色永远不会显示在屏幕上,直到控制退出该函数。

我一直在寻找如何做到这一点已经有一段时间了,我想我可能会寻求你的友好和耐心的帮助。

标签: c++winapicolorsrgbwm-paint

解决方案


推荐阅读