【问题标题】:GetBValue Error: Expression must have integral or unscoped enum typeGetBValue 错误:表达式必须具有整数或无范围枚举类型
【发布时间】:2015-11-24 15:59:08
【问题描述】:

我正在编写一个简单的程序来读取特定位置的像素并获取其单独的 R、G 和 B 值以进行进一步处理。 我可以读取 R 和 G 值,但读取 B 值时出现错误。

这是我的完整代码供参考:

#include <iostream>
#include<Windows.h>

using namespace std;

int main(){

    int d;
    HDC dc = GetDC(NULL);
    
        COLORREF rcolor = GetRValue(dc, 1, 1);
        COLORREF gcolor = GetGValue(dc, 1, 1);
        COLORREF bcolor = GetBValue(dc, 1, 1);

        ReleaseDC(NULL, dc);
        

        cout << rcolor << endl;
        cout << gcolor << endl;


    cin >> d;
}

我在这一行遇到错误: COLORREF bcolor = GetBValue(dc, 1, 1);

这是错误:

#define GetBValue(rgb) (LOBYTE((rgb)&gt;&gt;16))

Error: expression must have integral or unscoped enum type

我尝试在颜色上下文中搜索此错误,但找不到任何合适的解决方案。

【问题讨论】:

    标签: c++ visual-c++ enums getpixel


    【解决方案1】:

    我能够读取 R 值和 G 值,但读取 G 值时出现错误。

    我假设最后一个应该是 B 值。但无论如何,您没有正确读取 任何 值。 R 和 G 恰好编译没有错误,但会从 HDC 句柄值返回随机位。

    你想要的大概就是这个。

    HDC dc = GetDC(NULL);
    COLORREF rgb = GetPixel(dc, 1, 1);
    
    BYTE rcolor = GetRValue(rgb);
    BYTE gcolor = GetGValue(rgb);
    BYTE bcolor = GetBValue(rgb);
    
    ReleaseDC(NULL, dc);
    

    附: VC++ 2010(作为示例,我也假设其他版本)在致命的编译器错误之前为原始代码中的 3 个 Get?Value 行中的每一行提供警告 "C4002: too many actual parameters for macro 'Get?Value'"。最好在编译时设置高警告,并观察它们是否有危险信号。

    【讨论】:

    • 这就是为什么 C 风格的转换是邪恶的,尤其是与宏结合使用时。内联函数将同样高效且类型更安全。
    • @MarkRansom 对。也就是说,我只是编辑了回复并删除了引用的宏以减少潜在的混淆。有兴趣的朋友可以去看看 P.S.在这篇文章的原始版本中。
    • @RemyLebeau 感谢您纠正我的错字。最糟糕的是,COLORREF rgb2 = RGB(rcolor, gcolor, bcolor); 会在没有警告的情况下编译,组件(错误地)声明为 COLORREF 而不是(正确地)声明为 BYTE。我猜宏 typedef 结合起来的弊端 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多