两个Image,一个TBitmap,代码如下:
bitmap:=TBitmap.Create;
bitmap.LoadFromResourceId(hInstance,1);
StretchBlt(Image1.Canvas.Handle,0,0,bitmap.Width,bitmap.Height,
           bitmap.Canvas.Handle,0,0,bitmap.Width,bitmap.Height,SRCCOPY);
//读第二个,再画
bitmap.LoadFromResourceId(hInstance,2);
StretchBlt(Image2.Canvas.Handle,0,0,bitmap.Width,bitmap.Height,
           bitmap.Canvas.Handle,0,0,bitmap.Width,bitmap.Height,SRCCOPY);
//问题,此处画的结果居然是第一个图片,为何
将读改为LoadFromFile,结果正常
将画改为Image2.Picture.Assign(bitmap),也正常,
何故???

解决方案 »

  1.   

    bitmap.LoadFromResourceId(hInstance,1)中第二个参数应该是资源文件中定义的ID号,而不是自然序号
      

  2.   

    bitmap.LoadFromResourceId(hInstance,1);
    主要是这个函数不太熟悉的缘故,第2个参数是你在资源文件中定义的资源ID
      

  3.   

    如果将画改为Image2.Picture.Assign(bitmap),是正常的,说明读资源文件没问题啊。
      

  4.   

    既使改用LoadFromResourceName,结果也一样。
      

  5.   

    直接用下面语句试一试看(Image.Stretch设置为True):Image1.Picture.Bitmap.LoadFromResourceID(hInstance,1); Image2.Picture.Bitmap.LoadFromResourceID(hInstance,2);
      

  6.   

    没有做测试,建议认真检查一下。在LoadFromResourceID当中,第一行代码就是FreeContext,也就是将原来的DC删除掉。
      

  7.   

    procedure TBitmap.LoadFromResourceID(Instance: THandle; ResID: Integer);
    var
      Stream: TCustomMemoryStream;
    begin
      Stream := TResourceStream.CreateFromID(Instance, ResID, RT_BITMAP);
      try
        ReadDIB(Stream, Stream.Size);
      finally
        Stream.Free;
      end;
    end;Delphi7的源码,没看到调用FreeContext啊。
      

  8.   

    所以说,这就是一个问题,我这里是Delphi2007,跟你的结果就有差异。
      

  9.   

    procedure TBitmap.LoadFromResourceID(Instance: THandle; ResID: Integer);
    var
      Stream: TCustomMemoryStream;
    begin
      FreeContext;
      Stream := TResourceStream.CreateFromID(Instance, ResID, RT_BITMAP);
      try
        ReadDIB(Stream, Stream.Size);
      finally
        Stream.Free;
      end;
    end;procedure TBitmap.LoadFromResourceName(Instance: THandle; const ResName: string);
    var
      Stream: TCustomMemoryStream;
    begin
      FreeContext;
      Stream := TResourceStream.Create(Instance, ResName, RT_BITMAP);
      try
        ReadDIB(Stream, Stream.Size);
      finally
        Stream.Free;
      end;
    end;
      

  10.   

    理论上来讲,应该可以先调用TBitmap.FreeImage方法,然后再Load
      

  11.   

    有时候我会也遇到类似问题,我使用下面代码来清除原来的图像,你可以试试:
    bitmap.Width:= 1;
    bitmap.Height:= 1;
      

  12.   


      bitmap:=TBitmap.Create; 
      bitmap.LoadFromResourceId(hInstance,1); 
      StretchBlt(Image1.Canvas.Handle,0,0,bitmap.Width,bitmap.Height, 
                 bitmap.Canvas.Handle,0,0,bitmap.Width,bitmap.Height,SRCCOPY);   bitmap.Width := 1; 
      bitmap.Height:= 1;  //读第二个,再画 
      bitmap.LoadFromResourceId(hInstance,2); 
      StretchBlt(Image2.Canvas.Handle,0,0,bitmap.Width,bitmap.Height, 
                 bitmap.Canvas.Handle,0,0,bitmap.Width,bitmap.Height,SRCCOPY);