调整PaintBox尺寸后同过程无法绘制图形的问题求助
解决PaintBox调整尺寸后无法立即绘制图形的问题
这个坑我之前在Delphi里踩过好几次!核心问题在于PaintBox在修改尺寸时会自动触发重绘(也就是OnPaint事件),默认的重绘逻辑会清空画布——你在调整尺寸后立刻调用的Canvas.Draw,会被系统后续的自动重绘给覆盖掉,所以看起来好像没生效。
两种可行的解决方案:
方案一:临时禁用重绘,避免画布被清空
通过发送WM_SETREDRAW消息,先让PaintBox暂停自动重绘,调整完尺寸并绘制图形后再恢复重绘。这样就能避免你的绘制操作被覆盖:
uses Windows; // 需要引入Windows单元来使用SendMessage // 调整尺寸并绘制的代码块 SendMessage(PaintBox1.Handle, WM_SETREDRAW, 0, 0); // 禁用重绘 try PaintBox1.Width := PaintBox1.Width - 20; PaintBox1.Height := PaintBox1.Height - 20; BMP.Width := PaintBox1.Width; BMP.Height := PaintBox1.Height; PaintBox1.Canvas.Draw(0, 0, BMP, 255); finally SendMessage(PaintBox1.Handle, WM_SETREDRAW, 1, 0); // 恢复重绘 PaintBox1.Invalidate; // 强制刷新,确保图形显示 end;
方案二:将绘制逻辑移到OnPaint事件(更规范的长期方案)
PaintBox的设计初衷就是通过OnPaint事件维护显示内容——不管是尺寸变更、窗口被遮挡后恢复,还是其他需要重绘的场景,OnPaint都会自动触发。把你的绘制逻辑放到这里,就能彻底避免“绘制被覆盖”的问题:
首先,给PaintBox绑定OnPaint事件,写入以下代码:
procedure TYourForm.PaintBox1Paint(Sender: TObject); begin // 确保BMP尺寸和PaintBox同步 if (BMP.Width <> PaintBox1.Width) or (BMP.Height <> PaintBox1.Height) then begin BMP.Width := PaintBox1.Width; BMP.Height := PaintBox1.Height; // 可选:初始化BMP背景(比如填充白色,避免黑底) BMP.Canvas.Brush.Color := clWhite; BMP.Canvas.FillRect(Rect(0, 0, BMP.Width, BMP.Height)); end; // 绘制BMP到PaintBox画布 PaintBox1.Canvas.Draw(0, 0, BMP, 255); end;
然后,调整尺寸的代码就可以简化成这样,不需要手动调用Canvas.Draw:
PaintBox1.Width := PaintBox1.Width - 20; PaintBox1.Height := PaintBox1.Height - 20;
为什么你之前的尝试无效?
你单独写绘制过程在调整尺寸后执行,还是会被系统后续触发的OnPaint事件(默认清空画布)覆盖;而通过按钮触发绘制时,没有触发PaintBox的自动重绘,所以图形能正常显示。
内容的提问来源于stack exchange,提问作者Neil Giliomee
相关产品推荐
相关产品推荐

