Winforms GDI+;图形对象不反射以调整窗口大小

Winforms GDI+;图形对象不反射以调整窗口大小,winforms,resize,gdi+,hwnd,Winforms,Resize,Gdi+,Hwnd,我有以下问题。我正在使用本机GDI+(绘图算法在本机DLL中,由P/Invoke调用)在Windows窗体的面板表面上绘图。一切都很好,但只是直到一个改变了面板的大小。如果缩小,则会正确渲染。但是,如果它被放大,只有面板区域中与其原始尺寸相对应的部分被GDI+重新绘制 为什么会这样?当面板调整大小时,我真的必须每次都创建新的图形对象吗?假设您在面板的绘制事件中进行绘制。。。如果不是这样,请告诉我 尝试调用。调整面板大小时使其无效。Hans Passant在评论中回答: 您找到了图形对象不再与窗口

我有以下问题。我正在使用本机GDI+(绘图算法在本机DLL中,由P/Invoke调用)在Windows窗体的面板表面上绘图。一切都很好,但只是直到一个改变了面板的大小。如果缩小,则会正确渲染。但是,如果它被放大,只有面板区域中与其原始尺寸相对应的部分被GDI+重新绘制


为什么会这样?当面板调整大小时,我真的必须每次都创建新的图形对象吗?

假设您在面板的绘制事件中进行绘制。。。如果不是这样,请告诉我


尝试调用。调整面板大小时使其无效。

Hans Passant在评论中回答:


您找到了图形对象不再与窗口状态匹配的原因。您假设创建它很昂贵。它不是,它只需要几十微秒。只需要花费很高的成本,不必要地使用内存。总之,当窗口状态更改时,您需要重新创建它。

代码可能正在使用Graphics::FromHWND()。存储该对象并在以后重用它是一个常见的错误。仅当Windows要求您绘制时,才使用事件参数中交给您的图形对象。它总是有一个合适的剪辑区域。为什么会这样?我必须在绘图时创建许多GDI+对象,所以我存储它们并在以后重用它们——以及图形对象本身。AFAIR,我在MSDN文档的某个地方读到过,这样做是为了防止不必要的(从性能上来说是昂贵的)内存操作。您已经找到了原因,图形对象不再匹配窗口的状态。您假设创建它很昂贵。它不是,它只需要几十微秒。只需要花费很高的成本,不必要地使用内存。总之,当窗口状态改变时,您需要重新创建它。遗憾的是,您的回答是以注释的形式而不是常规的回答,因为我现在不能接受它(当然是在stackoverflow方面):)我正在使用重写的OnPaint方法绘制。添加Invalidate不会改变任何东西,重画的区域仍然剪裁为窗口的原始大小。需要明确的是:控件本身正在被重新绘制。问题是,重绘区域被剪裁为控件的原始大小。