5

WinForm应用程序中,订阅OnPaint()事件时,PaintEventArgs提供ClipRectangle定义要绘制的区域的属性。

当窗体垂直或水平调整大小时,它会给出要绘制的最小矩形。

在此处输入图像描述

但是当窗口在两个方向上调整大小时,需要绘制几个区域(一个在右侧,一个在底部)并且OnPaint事件将它们合并。它会产生一个与大小相同的矩形Form(因此一切都被重绘)。我想要的是单独的区域(图片上的两个矩形)

在此处输入图像描述

我知道会GDI+自动剪辑不需要绘制的内容(东西在两个矩形之外,而不仅仅是ClipRectangle),但我想最大限度地减少调用(由于调用很多,GDI+我在绘制事件时已经遇到了性能问题,这个不是过早的优化)OnPaintGDI+

4

1 回答 1

3

Windows 中的绘画由 WM_PAINT 消息处理程序启动。它必须调用 BeginPaint() 以获取有关需要绘制的内容的信息。它返回一个 PAINTSTRUCT 类型的结构,它看起来像这样:

typedef struct tagPAINTSTRUCT {
  HDC  hdc;
  BOOL fErase;
  RECT rcPaint;              // <=== here
  BOOL fRestore;
  BOOL fIncUpdate;
  BYTE rgbReserved[32];
} PAINTSTRUCT, *PPAINTSTRUCT;

rcPaint 成员是您从 Graphics.ClipRectangle 获得的成员。Graphics.Clip 和 Graphics.ClipBounds 属性不相关,它们仅在您通过分配 Clip 属性有意剪辑自己时才起作用。

显然,Windows 本身并不能让您找出您所要求的内容。rcPaint 是一个 RECT,一个简单的矩形。Windows 只跟踪脏矩形,而不是区域。由 InvalidateRect() 添加的新矩形与现有矩形合并,您确实很容易得到整个客户区。

解决此问题的唯一合理方法是注意 ResizeBegin 和 ResizeEnd 事件。当您获得 ResizeBegin 时,您就知道用户正在拖动窗口边缘或角落。可用于优化绘画的知识,跳过使模态调整大小循环效果不佳的昂贵位。

于 2013-01-17T16:13:38.003 回答