2012-02-18 47 views
1

我试图在屏幕上绘制(整个屏幕上,每个其他窗口的顶部)。
我通过NULL来的GetDC获得HDC到屏幕上,然后用,为了创造一个图形对象,并使用的DrawRectangle到在屏幕上绘制矩形。
一切正常..除...矩形的内部不会更新。在屏幕上绘制与GDI +(或GDI)类似使用GDI +来检查

一样,如果我绘制了一个命令提示符,然后移动命令提示符下,矩形的内部保持黑色。 我期望看到矩形下面有什么。

下面是正在做的绘图代码..

Pen BluePen(Color(255, 0, 255, 0), 2); 
Graphics graphics(screenDC); 
graphics.DrawRectangle(&BluePen, myRect); 

很简单,所以是不是我有做的就是矩形的内部时,屏幕不更新?或者让它真正透明。

=================编辑=================

好吧,我已经放弃了在此之前,并认为这是不可能的,直到......我意识到Windows SDK附带的Inspect工具完美地实现了这一点。

我想重建类似于亮点长方形的东西,如果我选择一个窗口(如Firefox),然后将检查成为关注的焦点,我可以一切都完美地更新自由走动了。 甚至没有任何闪烁。

所以......没有人知道如何检查管理做到这一点?

还回答在GDI而不是GDI +是细...

+0

矩形使用当前笔和当前画笔。 – BitBank 2012-02-18 16:27:05

+2

您只能在窗口上画画。您需要一个分层窗口(WS_EX_LAYERED),透明键与窗口背景相同,请参阅UpdateLayeredWindow()。 – 2012-02-18 16:51:04

+0

@HansPassant谢谢,这正是我所需要的。 – Josh 2012-02-24 18:11:32

回答

3

在窗口屏幕上(和窗口...)表面(S)是...挥发性的,像沙箱。窗户的“重叠”和未覆盖的表面的重新绘制是适当的事件管理造成的错觉。

一切都画一直保留,直到别的东西上绘制它。 “揭开”表面使得表示该表面的窗口能够接收WM_PAINT消息。这是由窗口程序来对这个信息作出反应,重新绘制一切应该在它之下。

现在,除非您以某种方式拦截发送到桌面窗口的WM_PAINT消息,否则您几乎没有机会知道桌面需要重绘,因此您的绘制代码将不会被调用,也不会重绘。或者更好的情况发生在桌面窗口更新代码之后,它不知道你的画图。