设置像素函数 [C++]

SetPixel function [C++]

本文关键字:C++ 函数 像素 设置      更新时间:2023-10-16

为什么当我调用 SetPixel 函数在 iTunes 中设置像素时,它确实向我显示了该特定应用程序中的像素(就像它应该的那样),而在为 Windows Media Player 调用相同的函数时,它根本不显示。此外,此功能似乎也不适用于全屏窗口。为什么会有这么大的多样性?任何解释将不胜感激。提前谢谢。

如前所述,很容易得不到您期望的结果,因为它不是您的窗口,您最终无法控制它的作用!

你可以做的两件事(一件显然比另一件事好)是:

  • 使用GetDC (NULL)获取屏幕设备上下文的句柄。使用ClientToScreen计算像素在屏幕上的位置。使用该句柄调用SetPixel。不过,这将很快被清除。

  • 使用适当的颜色键创建您自己的顶级、弹出窗口、透明(对消息)分层窗口。使用 ClientToScreen 计算屏幕的位置,并可能ScreenToClient以确保它正确进入窗口(理论上应该与屏幕具有相同的客户端尺寸)。将像素绘制到窗口上,您将控制它何时离开。

如果使用第二个,则扩展窗口样式应为:

WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED

您的正常窗口样式应为:

WS_POPUP | WS_VISIBLE

可以使用带有值 SM_CXSCREENSM_CYSCREENGetSystemMetrics 找到尺寸。

要设置颜色键,请使用SetLayeredWindowAttributes

SetLayeredWindowAttributes (hwnd, RGB (red, green, blue), 0, LWA_COLORKEY);

其中redgreenblue构成窗口的背景颜色,并且不应显示为实际颜色。这样你的背景就不会被绘制出来,给用户一个不明显的差异,但是当绘制任何东西时,它就会出现。

应在控件的WM_PAINT处理程序中绘制控件。由于它不是您的控制,因此您无法直接访问消息循环。这意味着,如果控件无效,您的像素将消失。

经常播放视频或更新其内容的应用程序将使控件每帧无效。这会强制控件非常快速地更新。

我认为透明的覆盖窗口是这里唯一的方法。除非您可以挂接到消息循环并在控件处理完WM_PAINT处理程序后对它做出反应......