为什么我不能使用onClick事件处理程序在lazarus中将形状绘制到表单上?

在里面

我的事件处理程序如下:

procedure TfrmCanvasMethods.btnShapesClick(Sender: TObject);
begin
    Canvas.Rectangle(40, 40, 400, 200);
    Canvas.Rectangle(80, 80, 360, 160);
    Canvas.Ellipse(150, 50, 290, 190);
    Canvas.Ellipse(100, 100, 340, 140);
end;                      

我正在使用Mac OS X

阿里奥奇

您必须阅读有关图形窗口系统的基础知识。无论是Windows,MacOS还是UNIX X窗口。

几乎普遍来说,不是由应用程序来决定何时,什么以及在何处绘制。是由操作系统决定的,并询问应用程序何时进行操作。应用程序可以做的所有事情-是使窗口的某些部分无效-就是通知OS窗口的某些部分不再有效,然后等到OS希望重新粉刷那部分(也许永远不会, (如果无效的窗口已最小化或被另一个窗口覆盖),然后-并且只有这样-进行绘制。

那你怎么办呢?

方法1:精通资源并接近实际的OS工作流程。

你把TPaintbox你的整体form

您可以将矩形和圆形保留为表单变量内的不可见记录或类。当这些数字更改时(例如:您添加了另一个矩形,或者增加了一些圆直径),您将调用MyForm.MyPaintBox.Invalidate以通知操作系统该痛苦框的图像不再有效。当操作系统认为及时刷新图像时,它将调用MyForm.MyPaintBox.OnPaintevent,在这种情况下,您将像那样进行调用MyPaintBox.Canvas.Rectangle(40, 40, 400, 200);注意-您将重新绘制绘画盒的画布,而不是表单的画布!

procedure TfrmCanvasMethods.btnShapesClick(Sender: TObject);
begin
  MyPaintBox.Invalidate();  
end;

procedure TfrmCanvasMethods.MyPaintBoxPaint(Sender: TObject);
var Canvas: TCanvas;
begin
  Canvas := MyPaintbox.Canvas;

    Canvas.Rectangle(40, 40, 400, 200);
    Canvas.Rectangle(80, 80, 360, 160);
    Canvas.Ellipse(150, 50, 290, 190);
    Canvas.Ellipse(100, 100, 340, 140);
end;

方法2:懒惰和资源膨胀

你把TImage你的整体form

该图像将具有包含您想要的任何图片的隐式位图。更重要的是,它将跟踪您绘制的图片并自动调用Invalidate,并自动处理OS的重画请求。

procedure TfrmCanvasMethods.btnShapesClick(Sender: TObject);
var Canvas: TCanvas;
begin
  MyImage.Picture.Bitmap.SetSize( MyImage.ClientWidth, MyImage.ClientHeight );

  Canvas := MyImage.Picture.Bitmap.Canvas;

    Canvas.Rectangle(40, 40, 400, 200);
    Canvas.Rectangle(80, 80, 360, 160);
    Canvas.Ellipse(150, 50, 290, 190);
    Canvas.Ellipse(100, 100, 340, 140);
end;

但是代价是,您可能会分配多达几兆的内存,而仅仅是为了在操作系统需要刷新表格图片的相对罕见的情况下保留图片。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我不能使用反射来获取LinkButton事件的事件处理程序?

来自分类Dev

为什么我不能使用反射来获取LinkButton事件的事件处理程序?

来自分类Dev

为什么我不能使用onclick事件执行此简单的JavaScript函数?

来自分类Dev

为什么我不能使用EventHandler处理EventHandler <XXX>?

来自分类Dev

为什么我不能使用pyCurl发布到Django?

来自分类Dev

为什么我不能使用pyCurl发布到Django?

来自分类Dev

为什么我不能使用下载的引导程序

来自分类Dev

为什么更改事件处理程序不能与我的代码一起使用?

来自分类Dev

为什么我不能使用asyncTask

来自分类Dev

为什么我不能使用Python“请求”库填写此表单?

来自分类Dev

为什么我不能使用C#WebBrowser控件触发选择更改事件?

来自分类Dev

为什么我不能使用Cronofy.com删除本地事件?

来自分类Dev

为什么将'onClick'设置为事件处理程序不能识别为语法错误?

来自分类Dev

为什么不能使用内核服务从 NMI 处理程序内部发出任务信号?

来自分类Dev

为什么我不能使用PhantomJS 2.1.1渲染我的ReactJS应用程序?

来自分类Dev

为什么鼠标不能使用此表单 (html)

来自分类Dev

为什么我的程序不能使用float变量,但是可以使用int变量?

来自分类Dev

为什么我不能使用从Objective-C对象到Swift属性的KVC?

来自分类Dev

为什么在Clojure中将map映射为`into`映射(`(into {} ,,,)`),而不能使用`vectors`,而不能使用`list`?

来自分类Dev

为什么我的Sinatra应用程序不能使用SSL?

来自分类Dev

为什么我不能使用其完整路径来调用该程序?

来自分类Dev

为什么我不能使用Selenium Chrome驱动程序

来自分类Dev

为什么我不能使用默认文件(如记事本)运行应用程序?

来自分类Dev

C#UWP为什么我不能添加第二个事件处理程序?

来自分类Dev

为什么我不能将其作为变量传递给事件处理程序?

来自分类Dev

为什么我不能使用jQuery设置div背景?

来自分类Dev

为什么我不能使用IO构造函数

来自分类Dev

lua:为什么我不能使用包裹名称?

来自分类Dev

为什么我不能使用awscli连接到AWS?

Related 相关文章

  1. 1

    为什么我不能使用反射来获取LinkButton事件的事件处理程序?

  2. 2

    为什么我不能使用反射来获取LinkButton事件的事件处理程序?

  3. 3

    为什么我不能使用onclick事件执行此简单的JavaScript函数?

  4. 4

    为什么我不能使用EventHandler处理EventHandler <XXX>?

  5. 5

    为什么我不能使用pyCurl发布到Django?

  6. 6

    为什么我不能使用pyCurl发布到Django?

  7. 7

    为什么我不能使用下载的引导程序

  8. 8

    为什么更改事件处理程序不能与我的代码一起使用?

  9. 9

    为什么我不能使用asyncTask

  10. 10

    为什么我不能使用Python“请求”库填写此表单?

  11. 11

    为什么我不能使用C#WebBrowser控件触发选择更改事件?

  12. 12

    为什么我不能使用Cronofy.com删除本地事件?

  13. 13

    为什么将'onClick'设置为事件处理程序不能识别为语法错误?

  14. 14

    为什么不能使用内核服务从 NMI 处理程序内部发出任务信号?

  15. 15

    为什么我不能使用PhantomJS 2.1.1渲染我的ReactJS应用程序?

  16. 16

    为什么鼠标不能使用此表单 (html)

  17. 17

    为什么我的程序不能使用float变量,但是可以使用int变量?

  18. 18

    为什么我不能使用从Objective-C对象到Swift属性的KVC?

  19. 19

    为什么在Clojure中将map映射为`into`映射(`(into {} ,,,)`),而不能使用`vectors`,而不能使用`list`?

  20. 20

    为什么我的Sinatra应用程序不能使用SSL?

  21. 21

    为什么我不能使用其完整路径来调用该程序?

  22. 22

    为什么我不能使用Selenium Chrome驱动程序

  23. 23

    为什么我不能使用默认文件(如记事本)运行应用程序?

  24. 24

    C#UWP为什么我不能添加第二个事件处理程序?

  25. 25

    为什么我不能将其作为变量传递给事件处理程序?

  26. 26

    为什么我不能使用jQuery设置div背景?

  27. 27

    为什么我不能使用IO构造函数

  28. 28

    lua:为什么我不能使用包裹名称?

  29. 29

    为什么我不能使用awscli连接到AWS?

热门标签

归档