赢得32 C++,绘制一个可拖动矩形到屏幕

赢得32 C++,绘制一个可拖动矩形到屏幕,c++,windows,winapi,graphics,C++,Windows,Winapi,Graphics,这是一个问题,我已经有一段时间了。我试图用一个可拖动的矩形向用户显示他们在我的屏幕截图程序中选择的区域。我之所以希望这样做,是因为用户能够选择他们想要截图的屏幕部分。我尝试了以下方法,但收效甚微: void drawRect(){ HDC screenDC = ::GetDC(0); ::Rectangle(screenDC, 200, 200, 300, 300); ::ReleaseDC(0, screenDC); } 现在,为了给这个方法适当的信任,它确实以我所期望的方式在屏幕上绘制了一

这是一个问题,我已经有一段时间了。我试图用一个可拖动的矩形向用户显示他们在我的屏幕截图程序中选择的区域。我之所以希望这样做,是因为用户能够选择他们想要截图的屏幕部分。我尝试了以下方法,但收效甚微:

void drawRect(){
HDC screenDC = ::GetDC(0);
::Rectangle(screenDC, 200, 200, 300, 300);
::ReleaseDC(0, screenDC);
}

现在,为了给这个方法适当的信任,它确实以我所期望的方式在屏幕上绘制了一个矩形,但是一旦拖动停止,矩形就会继续存在。我已经研究了消除这种情况的方法,比如更新窗口,在窗口中继续显示矩形,但是我没有设法删除它。此外,由于您必须在每次显示器刷新时重新绘制矩形,并且矩形仍然存在,因此我在屏幕上绘制了大量矩形,然后我必须将鼠标移到或单击绘制的任何窗口以删除它们。

改用DrawFocusRect。再次绘制相同的矩形将其从屏幕上删除。

您使用的是哪个版本的Windows?GetDC NULL从Windows Vista开始有不同的行为,该屏幕DC的尺寸是所有监视器的总和。。。在XP中,它仅限于第一台显示器上运行的桌面的尺寸。因此,如果用户尝试拍摄跨越多个监视器的区域的屏幕截图,则行为将根据您的版本而有所不同,尤其是,无论是否启用了桌面合成。无论如何,GDI在现代Windows上都不是一个很好的代码路径。如果这是一个不好的方法,你会建议我怎么做?Windows本身是一个非常好的、非常便携的创建不透明矩形的方法,可以轻松地跨多个监视器。如果您创建了一个无边界窗口,并将其大小和位置设置在正确的位置,则可以避免使用GDI。这并不是说GDI本身就是解决这个问题的一个糟糕的方法,但它确实被弃用了,使用GDI和屏幕的设备上下文绘制一个跨越多个监视器的矩形可能需要一些额外的工作。