MDI父窗体设置背景图后子窗体边框被绘制覆盖,求解决方案
MDI父窗体背景图设置子窗体拖动边框覆盖问题解决方案
问题原因
当前实现通过Paint事件手动绘制背景的逻辑,与MDI子窗体拖动过程中的重绘逻辑存在时序冲突,导致背景绘制优先级高于子窗体边框绘制,最终出现边框被覆盖的异常效果。
可行解决方案
修正逻辑如下:移除手动绑定的Paint事件绘制逻辑,直接对MdiClient实例的BackgroundImage属性赋值,系统原生属性会自动处理绘制层级优先级,避免背景覆盖子窗体元素。
修正后的代码如下:
private void SetMdiBackgroundImage() { // 获取MdiClient控件实例 MdiClient client = this.Controls.OfType<MdiClient>().First(); // 直接赋值背景图,使用系统原生绘制逻辑处理层级 client.BackgroundImage = this.BackgroundImage; // 同步背景图布局模式 client.BackgroundImageLayout = this.BackgroundImageLayout; // 开启resize时自动重绘 typeof(Control).GetProperty( "ResizeRedraw", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ).SetValue(client, true, null); // 开启双缓冲避免闪烁 typeof(Control).GetProperty( "DoubleBuffered", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance ).SetValue(client, true, null); }
额外优化建议
- 如果需要自定义背景绘制逻辑,可将绘制代码放在
MdiClient的BackgroundImage属性对应的位图中预绘制,不要直接在Paint事件中实时绘制。 - 若存在背景图高分辨率适配需求,可在父窗体的Resize事件中提前对背景图做缩放处理后再赋值给
client.BackgroundImage。
内容的提问来源于stack exchange,提问作者Mohamed Ali
相关产品推荐
相关产品推荐

