要求
可以随着主窗体放大而自动拉伸或平铺
当然也要能够随着主窗体缩小而缩小

解决方案 »

  1.   

    procedure TForm.OnPaint(Sender: TObject);
      procedure Tile(c:TCanvas;b:TBitMap);
      var
        x,y,h,w,i,j:integer;
      begin
        with b do begin
          h:=b.height;
          w:=b.width;
          end;
        y:=0;
        with c.Cliprect do begin
          i:=bottom-top-1; //height
          j:=right-left-1; //width
          end;
        while y<i do begin
          x:=0;
          while x<j do begin
            c.draw(x,y,b);
            inc(x,w);
            end;
          inc(y,h);
          end;
      end;
    begin
      if Sender is TForm then
        Tile(TForm(Sender).Canvas,fTileWith);
    end;
    刚好,手头有点代码,你看看吧。
      

  2.   

    哎呀,能不能给一个完整的实例?我是菜鸟啊,调试了半天也没弄出来
    fTileWith怎么赋值呢?
    还有procedure Tile(c:TCanvas;b:TBitMap);声明时出错
      

  3.   

    procedure TForm1.FormPaint(Sender: TObject);
    var
      g:TBitmap;
    begin
      g:=TBitmap.Create;
      g.LoadFromFile('e:\1.bmp');
      Form1.Canvas.Draw(0,0,g);
    end;
    我用这个是可以编译的,问题是不知道该怎么拉伸平铺等
      

  4.   

    另外
    procedure TForm1.FormPaint(Sender: TObject);
    var
      x, y: Integer;
      g:TBitmap;
    begin
      g:=TBitmap.Create;
      g.LoadFromFile('e:\1.bmp');
      y := 0;
        while y < Height do
        begin
          x := 0;
          while x < Width do
          begin
            Canvas.Draw(x, y, g);
            x := x + g.Width;
          end;
          y := y + g.Height;
        end;
    end;这种方法只能平铺,而且拉大缩小窗体时闪烁得太厉害了
    怎么才能避免闪烁
    并且可以进行居中、拉伸方法
      

  5.   

    刚找到一个最简单的办法,拿出来共享,不过要给分的哦在主窗体上放一Panel,在Panel里放一Image,设Image的Align属性为alClient,在主窗体上加入如下代码:procedure TForm1.FormCreate(Sender: TObject);
    begin
      Windows.SetParent(Panel1.Handle,ClientHandle);
    end;procedure TForm1.FormResize(Sender: TObject);
    begin
      Panel1.Top:=0;
      Panel1.Left:=0;
      Panel1.Width :=Self.ClientWidth-4;
      Panel1.Height :=Self.ClientHeight-4;
    end;
      

  6.   

    确定你已在在你的主窗体对象中加入了下面的变量: 
          FClientInstance : TFarProc; 
          FPrevClientProc : TFarProc; 
    { MDI的背景代码 } 
    procedure TMainForm.ClientWndProc(var Message: TMessage); 
    var 
      Dc : hDC; 
      Row : Integer; 
      Col : Integer; 
    begin 
      with Message do 
        case Msg of 
          WM_ERASEBKGND: 
          begin 
            Dc := TWMEraseBkGnd(Message).Dc; 
            // 在DC上平铺图象 
            for Row := 0 to ClientHeight div Image1.Picture.Height do 
              for Col := 0 to ClientWidth div Image1.Picture.Width do 
                BitBlt(Dc, 
                   Col * Image1.Picture.Width, 
                   Row * Image1.Picture.Height, 
                   Image1.Picture.Width, 
                   Image1.Picture.Height, 
                   Image1.Picture.Bitmap.Canvas.Handle, 
                   0, 
                   0, 
                   SRCCOPY); 
              Result := 1; 
          end; 
          else // 传递其他消息
            Result := CallWindowProc(FPrevClientProc, 
                                     ClientHandle, 
                                     Msg, 
                                     wParam, 
                                     lParam); 
      end; 
    end; - 在你的主窗体的OnShow事件中加入以下代码:   // MDI背景平铺代码,与WndProc链接 
        FClientInstance := MakeObjectInstance(ClientWndProc); 
        FPrevClientProc := Pointer(GetWindowLong(ClientHandle,GWL_WNDPROC)); 
        SetWindowLong(ClientHandle,GWL_WNDPROC,LongInt(FClientInstance)); - 现在你有一个背景了!
      

  7.   

    我用的是一个专门设置背景图片的控件,可以满足你的要求,
     wiaTile1: TwiaTile
      

  8.   

    MDI的呀,在窗体的Oncreate事件中写上form1.canvas.brush.image:=你的BMP图片;//平铺
    如果不是MDi再用以上画窗体的方法,就是比较费事!