我的应用程序是屏幕截图制作工具。用户需要选择屏幕区域进行截图。我使用带有 PureBasic 的 Win32 API,但没关系,一切都与 C++ 相似。当用户运行应用程序时,全屏显示半透明无边框表单以将鼠标悬停在所有其他窗口上。在鼠标按下事件选择开始时,我将 XORed 区域应用于表单以在其中切割一个具有当前选择大小的孔。
我在每个mousemove事件上创建并应用一个新区域:
rgn1 = CreateRectRgn_(0,0,DWidth,DHeight) ; full size of desktop
rgn2 = CreateRectRgn_(sx, sy, ex, ey) ; current selection points
CombineRgn_(rgn1, rgn1, rgn2, #RGN_XOR)
SetWindowRgn_(WindowID(0), rgn1, #True); apply region
它在我的装有 Windows XP 的计算机上运行良好,但在其他装有 Vista 的计算机上运行良好。我认为在每次鼠标移动时创建新的区域对象是错误的。也许我需要创建一次然后调整大小?任何人都可以解释如何正确地做到这一点吗?C ++上的示例还可以。