我想用图片的形状作为Form的形状,
第一次的时候我用 系统的image 控件  再引用一个 下载的 pngimage 控件,就可以在系统的image里面添加PNG图片,PNG图片要处理成透明区域已经用PS做好,加进image控件之后,为了可以拖动这个形状窗品并让FORM运行的时候只显示image控件里面的透明PNG 图片,我在  Form创建的时候加入
self.BorderStyle:=bsNone;   
self.Brush.Style:=bsClear;
然后再在image控件的 MouseDown 事件中加入      
ReleaseCapture;     
SendMessageHandle,WM_SYSCOMMAND,SC_MOVE+HTCaption,0);
Form 确实只显示了图片的开关,并可以手动,但是手动的时候,Form原本透明的区域会将在这个程序下面的图像加在了那些已经透明的区域【例如,在桌面运行的话,桌面壁纸会在Form的透明区域显示,拖动的时候都跟着Form,就像是用截图工具戴的一样】,   后来我就不用self.Brush.Style:=bsClear;  来去除窗体背景,而是用设置颜色的方法来让Form透明,但是问题又来了,用颜色设置Form透明之后,运行程序,程序在拖动的时候,不再在透明的区域带有其它的东西,但是这样会产生
很明显的颜色残留,在图片的边缘出现难看的锯齿.这是使用Image控件的,没有办法达到较好的效果;第二次是使用  Raize  里面的  RzFormShape   
这个可以加png、bmp等图片,它本身也有属性可以设置拖动窗口的,比较方便
开始我加了 png透明图片,运行后,Form的背景还是显示出来了,但是边框风格就有效果,是无边框的!【如果设置Form的颜色为透明的话,跟Image一样,有锯齿】
我又试了BMP图片,将想透明的区域处理成黑色,现在就可以显示形状,而不会出现Form的背景色,但是这种会产生锯齿,不想要。第三次是使用 1ts Class 里面的 fcImageForm  
  这个如果加bmp图片的话,效果就跟上面加BMP图片的效果一样,本来想加一下png图片试一下的,但是它加不了png图片。  
请问一下应该要怎么做才能让透明图片的形状作为Form的形状,然后显示比较正常的呢,请各位多给点意见或是解决办法,谢谢了

解决方案 »

  1.   


    procedure TForm1.FormCreate(Sender: TObject);
    var
    threadrgn,tmprgn:HRGN;
    x,y,t,h:Integer;
    begin
     bitmapb:=TBitmap.Create;
     bitmapb.LoadFromFile('图片路径');
     threadrgn:=CreateRectRgn(0,0,bitmapb.Width,bitmapb.Height);
     t:=bitmapb.Height;
    h:=bitmapb.Width;
    Self.Height:=t;
    Self.Width:=h;
    for y:=0 to t do
    for x:=0 to h do
    if bitmapb.Canvas.Pixels[x,y]=RGB(0,0,255) then
    begin
    tmprgn:=CreateRectRgn(x,y,x+1,y+1);
    CombineRgn(threadrgn,threadrgn,tmprgn,RGN_XOR);
    DeleteObject(tmprgn);
    end;
    SetWindowRgn(Handle,threadrgn,False);
    end;procedure TForm1.FormPaint(Sender: TObject);
    begin
      Canvas.Draw(0,0,bitmapb);
    end;