为什么Invalidate收到的ClipRectangle和发送的不一样

最近在研究c#局部刷新重绘的功能,来提高用户体验,但是在OnPaint事件中接收到的e.ClipRectangle和我在其它方法中调用mainForm.Invalidate(cutOutRect, false);时传递的大小不一致,经过一番排查才发现,是Windows底层做了处理!!!!

我们来看图1:


上面是调用mainForm.Invalidate(cutOutRect, false);前输出的信息;

下面是OnPaint事件中接收到的e.ClipRectangle;

传递的大小是负数,收到的都变正数了。


再来看图2:


上面是调用mainForm.Invalidate(cutRectRect, false);前输出的信息;

下面是OnPaint事件中接收到的e.ClipRectangle;

传递的大小超出了窗体,被自动裁剪了。


C# 中,`TableLayoutPanel` 类继承自 `Control` 类,`Invalidate` 方法是 `Control` 类的一个要方法,`TableLayoutPanel` 也继承了该方法。`Invalidate` 方法用于使控件的特定区域无效并向控件发送制消息,这意味着该区域将在下一次制循环中被。 `Invalidate` 方法有多个载形式: - `Invalidate()`:使整个控件无效,即整个 `TableLayoutPanel` 会在下一次制循环中被。 ```csharp TableLayoutPanel tableLayoutPanel = new TableLayoutPanel(); // 使整个 TableLayoutPanel 无效 tableLayoutPanel.Invalidate(); ``` - `Invalidate(Rectangle rect)`:使控件的指定矩形区域无效,只有该矩形区域会在下一次制循环中被。 ```csharp Rectangle invalidRect = new Rectangle(10, 10, 50, 50); // 使指定矩形区域无效 tableLayoutPanel.Invalidate(invalidRect); ``` - `Invalidate(Region region)`:使控件的指定区域无效,该区域由 `Region` 对象定义。 ```csharp Region invalidRegion = new Region(new Rectangle(20, 20, 60, 60)); // 使指定区域无效 tableLayoutPanel.Invalidate(invalidRegion); ``` - `Invalidate(bool invalidateChildren)`:使控件无效,并指定是否使子控件也无效。 ```csharp // 使 TableLayoutPanel 无效,并使子控件也无效 tableLayoutPanel.Invalidate(true); ``` - `Invalidate(Rectangle rect, bool invalidateChildren)`:使控件的指定矩形区域无效,并指定是否使子控件也无效。 ```csharp Rectangle rect = new Rectangle(30, 30, 70, 70); // 使指定矩形区域无效,并使子控件也无效 tableLayoutPanel.Invalidate(rect, true); ``` - `Invalidate(Region region, bool invalidateChildren)`:使控件的指定区域无效,并指定是否使子控件也无效。 ```csharp Region region = new Region(new Rectangle(40, 40, 80, 80)); // 使指定区域无效,并使子控件也无效 tableLayoutPanel.Invalidate(region, true); ``` 调用 `Invalidate` 方法后,控件并会立即,而是会向消息队列发送一个制消息,在消息循环处理该消息时,控件才会进行操作。如果需要立即,可以在调用 `Invalidate` 方法后调用 `Update` 方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值