我可以使用哪些事件来通知控件它的一部分已离开屏幕的可视区域?

Posted

技术标签:

【中文标题】我可以使用哪些事件来通知控件它的一部分已离开屏幕的可视区域?【英文标题】:What events can I use in order to notify a control that part of it has left the viewable area of the screen? 【发布时间】:2009-05-12 15:15:00 【问题描述】:

我有一个正在绘制的用户控件,当控件移动到屏幕边缘或移动到 Vista 任务栏与其重叠时,屏幕边缘/任务栏边缘被绘制到控件,在控件的可绘制区域上留下难看的线条。

检测这一点并在控件上调用 Invalidate 的最佳方法是什么? “Moved”和“LocationChanged”事件显然是处理控件在其父容器内的移动,而不是屏幕位置的变化。 我相信当控件被 Windows XP 中的另一个窗口重叠时也会发生同样的事情,但我还没有测试过。在这种情况下,同样的问题也适用。

我目前正在直接绘制控件的 Graphics 对象,我认为这是问题的根源。为了回避这个问题,绘制到控件的 BackGroundImage 会更好吗?

注意:这是对先前措辞非常糟糕的问题的重大改写。我觉得开始一个新问题是应该做的事情,而不是试图修复我写的废话。

编辑:事实证明,任务栏没有引起问题,只是屏幕底部边缘。我还以为任务栏也有问题,但看来我错了

【问题讨论】:

我将复制您第一个问题的评论:您的绘画效果如何,为什么任务栏会出现问题?通常你的控件不应该关心是否有其他窗口在它上面。 当控件移动到屏幕边缘,或者移动到Vista任务栏与其重叠时,屏幕边缘/任务栏边缘被绘制到控件上,在可绘制区域留下难看的线条的控制。我正在使用 OnPaint 方法进行绘画。当其他窗体越过我的控件时,至少在 Vista 中没有明显的问题,但是当控件到达屏幕边缘或任务栏时,屏幕边缘正在我的控件上绘制。我会努力获取一些屏幕截图。 【参考方案1】:

是的,您可以绘制控件的背景以提供无错觉问题的绘图。

您是要在图形对象的剪切区域剪切矩形)上绘制还是使用它的整个表面?我认为每当另一个窗口或对象隐藏另一个对象时,窗口都会向它发送重绘消息并传递需要重绘的区域(剪辑矩形)。

【讨论】:

【参考方案2】:

在对发生的错误进行屏幕截图时,很明显问题在于我正在绘制由 Paint 事件的 ClipRectangle 描述的区域,而不是由控件本身的 ClipRectangle 描述的区域。

Paint 事件的 ClipRectangle 描述了由单个 Movement 事件显示的区域,它不描述 Control 的边界区域。 我只是碰巧将控件移动得足够快,以至于很明显整个控件都被拉入了显示的空间。我修改了代码以绘制到与控件大小相对应的区域,一切正常。

另一个 PEBKAC 问题。哦,好吧,至少找到了错误。

【讨论】:

重读开拓者的回答我意识到它实际上是正确的。我将“剪辑矩形”误读为“客户矩形”。

以上是关于我可以使用哪些事件来通知控件它的一部分已离开屏幕的可视区域?的主要内容,如果未能解决你的问题,请参考以下文章

通知中的媒体播放器控件

处理 WPF 用户控件的事件

子类化 NSLider:需要一个解决方法来解决丢失鼠标事件(Cocoa OSX)

移动端实现下拉刷新

我可以在我的 android-app 中使用哪些控件?

JS - 防止鼠标离开屏幕