SetPixel函数[C ++]

时间:2012-06-03 19:44:15

标签: c++ pixel

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

如果使用秒,您的扩展窗口样式应为:

WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED

,您的正常窗口样式应为:

WS_POPUP | WS_VISIBLE

可以使用值SM_CXSCREENSM_CYSCREEN的{​​{3}}找到维度。

要设置颜色键,请使用GetSystemMetrics

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

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

答案 1 :(得分:1)

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

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

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