我想通过使用WinAPI SetPixel()函数来更改任何像素的颜色。我写了这样的东西:
#include <iostream>
#include <Windows.h>
int main() {
HDC hdc = GetDC(NULL);
if(hdc == NULL) {
std::cout << "FAIL: GetDC";
return 1;
}
else
std::cout << "hdc = " << hdc << std::endl;
int x = 200, y = 400;
COLORREF result = SetPixel(
hdc,
x,
y,
RGB(255, 0, 0)
);
if(result == -1) {
std::cout << "FAIL: SetPixel";
return 1;
}
else
std::cout << "Set color pixel: " << result << std::endl;
std::cin.get();
return 0;
}
但是,我看不到任何红色像素。我认为问题在于设备的句柄,但MSDN表示,对于整个屏幕,GetDC()函数的参数应为NULL。
答案 0 :(得分:3)
您的像素被某些其他应用程序覆盖为另一个颜色值。基本上,200,400
处的像素所占据的窗口都会决定该像素的颜色。
如果您使用这样的无限循环:
while (true) {
COLORREF result = SetPixel(
hdc,
x,
y,
RGB(255, 0, 0)
);
if (result == -1) {
std::cout << "FAIL: SetPixel";
return 1;
}
else
std::cout << "Set color pixel: " << result << std::endl;
}
您可能能够看到像素,具体取决于何时代码更新像素和何时该像素下的应用程序对其进行更新。
我尝试了无限循环的代码,并将MS Paint定位到适当的坐标,并且能够看到像素。
无论哪种方式,您正在做的事情都是高度不可靠的,因为您永远无法知道其他应用程序正在使用设备上下文做什么。最好创建和使用应用程序拥有的窗口。
这是屏幕截图:
一旦我关闭应用程序,将其暂停在调试器中或以任何其他方式结束循环,Paint就会再次将像素设置为白色。