Я пишу простую программу для чтения пикселя в определенном месте и получения его отдельных значений 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)>>16))
Error: expression must have integral or unscoped enum type
Я попытался найти эту ошибку в цветовом контексте, но не смог найти подходящего решения.
Я могу прочитать значения 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 (в качестве примера, и я предполагаю, что и другие версии) выдает предупреждение "C4002: too many actual parameters for macro 'Get?Value'"
для каждой из 3 строк Get? Value в исходном коде до фатальной ошибки компилятора. Рекомендуется компилировать предупреждения с высокими значениями и смотреть их на наличие красных флажков.
Других решений пока нет …