【问题标题】:SetPixel function [C++]SetPixel 函数 [C++]
【发布时间】:2012-06-04 05:07:44
【问题描述】:

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

【问题讨论】:

  • 传递给函数的参数值是什么?
  • 可能是因为 DirectX 之类的东西
  • 什么版本的 Windows?
  • 有很多方法可以使用错误的窗口或设备上下文。整个练习都是徒劳的,因为当窗口重绘时像素会很快被擦除。

标签: c++ pixel


【解决方案1】:

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

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

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

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

如果使用第二个,你的扩展窗口样式应该是:

WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED

你的正常窗口样式应该是:

WS_POPUP | WS_VISIBLE

可以使用GetSystemMetrics 和值SM_CXSCREENSM_CYSCREEN 找到尺寸。

要设置颜色键,请使用SetLayeredWindowAttributes

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

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

【讨论】:

  • 感谢您的宝贵时间和回答!
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的解释 Wouter,不过我应该先了解一些有关 C++ 的基本知识,然后再学习诸如钩子之类的东西,这在我看来是相当困难的。
猜你喜欢
  • 1970-01-01
  • 2014-10-04
  • 2016-10-13
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
相关资源
最近更新 更多