【发布时间】:2014-01-25 18:27:54
【问题描述】:
这是我已经有一段时间的问题了。我试图有一个可拖动的矩形来向用户显示他们在我的屏幕截图程序中选择的区域。我想要这个的原因是让用户能够选择他们想要截取屏幕截图的一部分。我尝试了以下方法但收效甚微:
void drawRect(){
HDC screenDC = ::GetDC(0);
::Rectangle(screenDC, 200, 200, 300, 300);
::ReleaseDC(0, screenDC);
}
现在,为了给予这个方法应有的荣誉,它确实以我期望的方式在屏幕上绘制了一个矩形,但是一旦拖动停止,矩形就会持续存在。我已经研究了摆脱这种情况的方法,例如更新继续显示矩形的窗口,但是我没有设法将其删除。对于这个问题,因为您必须在每次监视器刷新时重新绘制矩形并且矩形仍然存在,所以我在整个屏幕上绘制了很多矩形,然后我必须将鼠标悬停或单击任何窗口,这些窗口被绘制以删除它们.
【问题讨论】:
-
您使用的是哪个版本的 Windows?
GetDC (NULL)从 Windows Vista 开始具有不同的行为,该屏幕 DC 的尺寸是所有显示器的总和......在 XP 中,它仅限于在第一台显示器上运行的桌面尺寸。因此,如果用户尝试对跨越多个监视器的区域进行屏幕截图,则行为会因您的版本而异(特别是,他们是否启用了桌面合成)。无论如何,GDI 并不是在现代 Windows 上追求的好代码路径。 -
如果这是一个不好的方法,你会建议我怎么做?
-
Windows 本身是一种非常好的(并且非常便携)的方法,可以创建一个可以轻松跨越多个显示器的不透明矩形。如果您创建一个无边框的窗口,并在正确的位置设置大小和位置,则可以避免使用 GDI。并不是说 GDI 是解决这个问题 per-se 的坏方法,但它肯定已被弃用,并且使用 GDI 绘制一个矩形和跨越多个监视器的“屏幕的设备上下文”可能需要一点点一点额外的工作。
标签: c++ windows winapi graphics