Canvas.StretchDraw在窗体改变大小后,画出的图片不正常--并没有拉申;而用Alt+Tab切换一次后(或者在任务栏中点击两次),窗体中画出的才是正确拉申后的图片。怎样才可以在FormResize中也模拟出这种拉申效果呢?大致代码如下:
procedure TMainForm.FormPaint(Sender: TObject);
var
  rect: TRect;
begin
  rect := GetClientRect;
  rect.Right := rect.Right - tvTJFL.Width ;
  rect.Bottom := rect.Bottom - pnlTop.Height - StatusBar.Height  ;
  if Assigned(bmp) then
    Canvas.StretchDraw(rect, bmp) ;//bmp是一个类变量,有定义也有赋值
end;procedure TMainForm.FormResize(Sender: TObject);
begin
  Invalidate
end;

解决方案 »

  1.   

    Form1.AutoSize :=False ;
    Form1.AutoCroll:=False ;
      

  2.   

    打错了
    AutoScroll :=False
      

  3.   

    你有调用Invalidate应该是可以的。
      

  4.   

    可能我没有把我的问题描述清楚。
    主窗体是一个MDI窗体,上面pnlTop是工具栏,左边还有一个导航条,客户区就是用Canvas画的一个背景图(当然打开的子窗体也是在该区域显示)。比如我现在要做一个隐藏左边导航条的功能,因为这时候改变了客户区的大小,这时候我希望背景图能被拉申,在新的客户区显示出来。目前我调用FormPaint()或者是Invalidate()方法都没有达到需要效果。代码如下:
    procedure TMainForm.HideNavigatorClick(Sender: TObject);
    begin
      TMenuItem(Sender).Checked := not TMenuItem(Sender).Checked;
      if TMenuItem(Sender).Checked then
      begin
        oldWidth := pnlLeft.Width;
        pnlLeft.Width := 0;
      end
      else
        pnlLeft.Width := oldWidth;
      Invalidate;
    end;
      

  5.   

    另外,请教njbudong(最爱戴妃) ,AutoSize和AutoScroll跟这有关系吗?
      

  6.   

    To njbudong(最爱戴妃):
      试过了,不行,AutoSize设置为True的话,窗体大小就不能发生改变了。而AutoScroll也好像没什么作用。我看帮助中对这两个属性的描述,好像与我的问题关系不大
      

  7.   

    用 Image 控件,Strech := True;AlignClient,虽然占资源,不过绝对不会有问题。
      

  8.   

    To inshua(孟昭):
      谢谢,你的方法不错,可是系统要求是MDI窗口,如果用Image控件的话,子窗体就看不到了,所以只能在form的canvas上画背景图了:-(