我在一个ScrollBox里放置了一个Image,用Image.canvas.draw的方法绘制了很多小图片。Image的Align设为alNone,Image的大小根据ScrollBox大小的改变而做适当改变。
奇怪的是当拉大ScrollBox时,虽然Image.Width也跟着改变,但拉大部份并未显示出来,不知为什么?源码如下(m_bmp_Src为TBitma类型,ImgContainer即上文说的Image控件):procedure TMainForm.ShowSourceImage;
var
  xSrc: Integer;
  xDest, yDest: Integer;
  tmp_bmp: TBitmap;
begin
  if not Assigned( m_bmp_Src ) then Exit;  xSrc  := 0;
  xDest := 0;
  yDest := 0;  tmp_bmp := TBitmap.Create;
  with tmp_bmp  do
  begin
    Width := m_iTileWidth;
    Height := m_iTileHeight;
    Transparent := true;
    TransparentColor := clFuchsia;   //透明色(255,0,255)
  end;  with ImgContainer do
  begin
    Left := 0;
    Top  := 0;
    Width := ScrollBox.ClientWidth;
    Height := m_iTileHeight; //暂定为一个title的高度,更新后设为实际高度
    Canvas.FillRect( ClientRect ); //刷新
  end;  while xSrc < m_bmp_Src.Width do
  begin
      tmp_bmp.canvas.Copyrect( Rect( 0, 0, m_iTileWidth, m_iTileHeight ),
                               m_bmp_Src.Canvas,
                               Rect( xSrc, 0, xSrc + m_iTileWidth, m_iTileHeight ) );
      ImgContainer.canvas.draw( xDest, yDest, tmp_bmp );
      Inc( xSrc, m_iTileWidth );
      Inc( xDest, m_iTileWidth + 1 );      if xDest + m_iTileWidth > ImgContainer.ClientWidth then
      begin
        xDest := 0;
        Inc( yDest, m_iTileHeight + 1 );
      end;
  end;  tmp_bmp.free;
end;

解决方案 »

  1.   

    在设计阶段把imag的width设的足够大就行
      

  2.   

    ///奇怪的是当拉大ScrollBox时,虽然Image.Width也跟着改变,但拉大部份并未显示出来,不知为什么?什么时候拉大?如果是运行的时候拉大,虽然Image的width会改变,但是里面图片的宽度并没有改度。你试试加上Image.Picture.Graphic.Width := ScrollBox.ClientWidth;
    Image.Picture.Graphic.Height := ScrollBox.ClientHeight;
      

  3.   

    那是由于拟采用Canvas.Draw方法画出来的图形图像只是逻辑画到了客户区间(ClientRect),而不是像真实的图像加载那样无力存在。因此,在移动ScrollBox的两个滚动条的时候,需要相应的处理Repaint或Refresh步骤,这样便可以避免那种情况了。
      

  4.   

    我以前用的办法也是把image的尺寸设计得足够大,方法简单,且证明能行.
    不过其他人建议的办法我想信也可以,或许更合理.