【问题标题】:GetPixel() only returns FFFFFFGetPixel() 只返回 FFFFFF
【发布时间】:2014-01-13 17:17:53
【问题描述】:

现在我有一个完全是空白黄色的窗口。出于某种原因,当我调用 GetPixel() 时,我只得到 0xFFFFFFFF (CLR_INVALID)。 这是我的最小化代码:

HWND _hwndPP =  FindWindow(NULL, "Test Window");
COLORREF hdcScreen = GetDC(_hwndPP);
printf("%X", GetPixel(hdcScreen, 10, 10));
ReleaseDC(_hwndPP, hdcScreen);

编辑: 将 COLORREF 更改为 HDC,它并没有改变任何东西。 是的,我运行的是 64 位系统。这是否意味着我不能使用此功能?如果是这样,我将如何检查特定像素的颜色?

【问题讨论】:

  • hdcScreen 必须是 HDC 类型。另外,您检查过返回值(FindWindow 和 GetDC)吗?
  • 真的返回 0x00FFFFFF(纯白)还是 0xFFFFFFFF (CLR_INVALID)
  • GetDC 返回 HDC,而不是 COLORREF。改为将变量声明为HDC,并将正确的HDC 类型变量传递给GetPixel。如有疑问,请查看 MSDN 上的文档。
  • 添加了更多信息。

标签: c


【解决方案1】:

我假设您使用的是 64 位 Windows。

GetDC() 返回一个HDC,它作为一个指针,是一个 64 位的值。然后,您将其转换为COLORREF,将 DC 截断为 32 位。然后,当您向 Win32 询问像素的颜色时,它不能,因为您的 HDC 缺少一些位。 GetPixel() 然后返回 CLR_INVALID0xFFFFFFFF,您将其解释为纯白色,因为您期望的是有效颜色。

在相关说明中,我还猜测您的非最小化代码包含与COLORREF 之间的强制转换。根据经验,您应该很少(如果不是从不)必须强制转换 Win32 代码。如果你必须强制转换,你可能使用了错误的函数集或错误的参数类型。

【讨论】:

  • 很少投? (HBRUSH)(COLOR_WINDOW+1) 恐怖呢?诚然,大多数演员表都隐藏在 nice(?) 宏 (MAKEINTRESOURCE...) 后面,但其中有很多演员表,您必须在某处手动编写一些演员表...
  • @rodrigo:这是一个经验法则。如果您使用已记录的技巧或使用提供的宏进行转换,那么显然一切都很好。如果你强制关闭编译器,那么事情就会开始崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
  • 2014-04-25
  • 2021-10-01
  • 1970-01-01
  • 2019-07-13
相关资源
最近更新 更多