因为需要在窗体上画图,而且只在初始后画一次的图形用哪个事件可以满足这个要求?
试过了
OnActivate
OnShow
OnCreate
都不可以
而OnPaint是可以的,但是每次窗体被重画的话,这个都需要调用吧,那就不能满足只在初始后重画的要求了
如果做个计数在onpaint里面inc一下,判断是否<=1,这样可以是可以,但是也太麻烦了吧有哪个事件可以只见满足这个要求的?

解决方案 »

  1.   

    可以在OnPaint里通过全局变量或者const来模拟static变量
    如果是第一次调用OnPaint就执行你的代码
      

  2.   

    lw549
    我之前写到的的就是你说的办法,是太麻烦了吧而且有一个比较厉害的问题,就是如果在这个时候画的话,若同时要画窗体上的其他的Image之类的。好像因为还没完全加载完,这时候画,画出的颜色不是指定的颜色而是默认的空白色尝试过Image换其他颜色(.Pen.Color)来指定着去画,但是只能画出白色
      

  3.   

    画窗体上的其他的Image之类的为何不能放在OnShow事件中呢?
      

  4.   

    smiler007
    From在OnShow时,Image根本还没Show,这时候东西画不到Image上(画了,但窗体完全Show出来之后,Image上没有画的效果)
      

  5.   

    >>而且有一个比较厉害的问题,就是如果在这个时候画的话,若同时要画窗体上的其他的Image之类的。好像因为还没完全加载完,这时候画,画出的颜色不是指定的颜色而是默认的空白色在OnShow中呢?>>有哪个事件可以只见满足这个要求的?
    至于有没有这样一个事件我不知道.
      

  6.   

    把你的问题完整地说出来吧.如果涉及到WM_PAINT,我想是很简单的.
    明天晚上如果这个问题还没解决,请短消息联系我,回家休息了:)
      

  7.   

    OnShow简单的说,就是根本不能用来画图的
    这个时候Form都在OnShow,上面的控件都还没有Show,所以这个时候画不上去
    画了,但窗体完全Show出来之后,Image上没有画的效果我前面都提到这个好多次了
      

  8.   

    另外说一下OnActivate,OnCreate,OnPaint,OnShow四个事件的顺序是
    OnCreate
    OnShow
    OnActivate
    OnPaint
    很奇怪的,TForm没有OnEnter?OnActivate及其之前的东西,因为在OnPaint之前,根本不能用来用于作画
    但是OnPaint又有这样的问题,所以啊...
      

  9.   

    为什么oncreate会不行呢,他就是初始化啊
      

  10.   

    jalu_515
    OnCreate的时候,窗体根本都还没画出来,怎么在没有画出来的东西上作画?
      

  11.   

    在你的project文件里写program Project1;uses
      Forms, Dialogs,
      Unit1 in 'Unit1.pas' {Form1};{$R *.res}begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Form1.Show;
      {
        在这里写你‘画画’的代码
      }
      Application.Run;
    end.
      

  12.   

    wozhuchuanwei
    单单刷新是没用的
    refresh
    repaint
    都试过的CareYouOnly
    看上去可行,试试看
      

  13.   

    >>CareYouOnly
    同样的问题,只能够画出白色的背景色问题已经解决,用CareYouOnly和我一开始说过在Repaint中做计数器的方法,
    都可以实现画出东西,但是画出的东西只是白色背景色
    需要画之前,Repaint或者Refresh一次窗体,之后再画,就是正确的颜色但是都有相当大的缺陷,计数器的方法的话,需要一个静态或者全局变量
    在project内做的话,因为project uses的库实在太少,稍作复杂的画,许多库要全部重新加入来,感觉做也是相当的不漂亮还有更好的办法么?
      

  14.   

    大致是最好的方法已经找到,如下
    也感谢wozhuchuanwei的一些些提示在
    OnCreate
    OnShow
    OnActivate
    OnPaint
    顺序的这样4个当中使用OnShow之后产生的OnActivate事件,用OnCreate和OnShow是不行的!!在其中加入画画的代码,不过,之前一定要加上
    procedure TfrmMain.FormActivate(Sender: TObject);
    begin
      Form1.Repaint;//或者Form1.Refresh
      //画画的代码
    end;这样projects文件就不需要修改了,而且多余的代码也就一行而已
      

  15.   

    To rufus(冰魂) :
    怎么不行呢,我用下面的代码尝试了一下,可以看到效果啊program Project1;uses
      Forms, Graphics,
      Unit1 in 'Unit1.pas' {Form1};{$R *.res}begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Form1.Show;
      with Form1 do
      begin
        Img.Canvas.Pen.Color:=clRed;
        Img.Canvas.Brush.Style:=bsClear;
        Img.Canvas.Rectangle(0,0,Img.Width,Img.Height);//看见一个红色的长方形啊
      end;
      Application.Run;
    end.
      

  16.   

    Img.Canvas.Brush.Style:=bsClear;
    这句的作用是什么?我没用这句直接画的
      

  17.   

    设置填充的样式啊,当Canvas.Brush.Style=bsClear时,Delphi就不作任何的填充,否则Delphi就会用Canvas.Brush.Color进行对所画的图像进行填充。Canvas.Bursh.Style还有很多样式,详细可以参看Delphi的帮助。