如上!在线急等.

解决方案 »

  1.   

    一定有很多人看到过一些奇形怪状的窗体,例如一些屏幕精灵。其实实现起来非常容易,做到三点就好啦。下面我使用Delphi做了一个VCL控件(TBmpShape),你只需要指定一幅图片就可以将窗体变成你的图片的形状。1。准备一幅位图图片,一定要BMP格式的2。将VCL控件放在你的窗体(FORM)上,注意不能是其他的容器,设置PICTURE属性,指定制作好的图片。3。设置图片的背景颜色,必须是你的图片的背景颜色准确值4。在本窗体的FormCreate事件中写一行代码BmpShape1.Apply;做到上面四点就可以了,编译运行你的窗体,是不是不一样啊。下面是具体的代码,不是太长吧。unit BmpShape;
    {
    2002/08/22  by ultrared
    根据BMP文件创建窗口
    注意:
    1. BMP文件最左上的一个点颜色作为背景色
    2. BmpShape控件只能用在TForm容器上
    3. BMP文件可以是256色或者24位色
    4。大块背景色必须和背景色绝对相等才能获得正常效果
    }
    interfaceuses
     Forms,Windows, Messages, SysUtils, Classes, Controls, ExtCtrls,Graphics;type
     TBmpShape = class(TImage)
     private
      { Private declarations }
      BackColor:TColor;//背景颜色
      FColorDither:boolean;//是否允许背景颜色有一定的抖动
      function GetRegion:HRGN;//前景图片的区域
      procedure setColorDither(cd:Boolean);
     protected
      { Protected declarations }
     public
      { Public declarations }
      constructor Create(AOwner:TComponent);override;
      procedure Apply;//使用效果
     published
      { Published declarations }
      property Dither:Boolean read FColorDither write setColorDither;
     end;procedure Register;implementationprocedure Register;
    begin
     RegisterComponents('Samples', [TBmpShape]);
    end;procedure TBmpShape.setColorDither(cd:Boolean);
    begin
     if cd<>FColorDither then
      FColorDither:=cd;
    end;constructor TBmpShape.Create(AOwner:TComponent);
    begin
     inherited Create(AOwner);
     BackColor:=RGB(0,0,0);
     FColorDither:=FALSE;
    end;//核心子程序,获得BMP图片的前景区域
    function TBmpShape.GetRegion:HRGN;
    var
     i,j:integer;
     rgn1,rgn2:HRGN;
     StartY:integer;
     r,g,b,r1,g1,b1:BYTE;
     cc:TColor;
    begin
     if Picture.Bitmap<>nil then
     begin
      BackColor:=Picture.Bitmap.Canvas.Pixels[0,0];
      rgn1:=CreateRectRgn(0,0,0,0);
      for i:=0 to Picture.Bitmap.Width-1 do
      begin
       StartY:=-1;
       for j:=0 to Picture.Bitmap.Height-1 do
       begin
        cc:=Picture.Bitmap.Canvas.Pixels[i,j];
        if FColorDither then
        begin
         //允许和背景有一定的色差
         r:=(cc and $FF0000) shr 16;
         g:=(cc and $FF00) shr 8;
         b:=cc and $FF;
         r1:=(BackColor and $FF0000) shr 16;
         g1:=(BackColor and $FF00) shr 8;
         b1:=BackColor and $FF;
         if (abs(r-r1)<10) and (abs(g-g1)<10) and (abs(b-b1)<10) then
         begin
          if (StartY>=0) and (j>=StartY) then
          begin
           rgn2:=CreateRectRgn(i,StartY,i+1,j);
           CombineRgn(rgn1,rgn1,rgn2,RGN_OR);
           StartY:=-1;
          end;
         end
         else
         begin
          if Starty<0 then
           StartY:=j
          else if j=(Picture.Bitmap.Height-1) then //最下面一个点
          begin
           rgn2:=CreateRectRgn(i,StartY,i+1,j);
           CombineRgn(rgn1,rgn1,rgn2,RGN_OR);
          end;
         end;
        end
        else //不允许色差
        begin
         if cc=BackColor then
         begin
          if (StartY>=0) and (j>=StartY) then
          begin
           rgn2:=CreateRectRgn(i,StartY,i+1,j);
           CombineRgn(rgn1,rgn1,rgn2,RGN_OR);
           StartY:=-1;
          end;
         end
         else
         begin
          if Starty<0 then
           StartY:=j
          else if j=(Picture.Bitmap.Height-1) then //最下面一个点
          begin
           rgn2:=CreateRectRgn(i,StartY,i+1,j);
           CombineRgn(rgn1,rgn1,rgn2,RGN_OR);
          end;
         end;
        end;
       end;
      end;
      result:=rgn1;
     end
     else
      result:=0;
    end;procedure TBmpShape.Apply;
    begin
     if Parent is TForm then
     begin
      Left:=0;
      Top:=0;
      Width:=Picture.Bitmap.Width;
      Height:=Picture.Bitmap.Height;
      with (Parent as Tform) do
      begin
       BorderStyle:=bsNone;
       Width:=Self.Width;
       Height:=Self.Height;
      end;
      SetWindowRgn(Parent.Handle,GetRegion,FALSE);
     end;
    end;end.
      

  2.   

    是一个处理图片(把几张图片合成一张图片)的控件把白色缺省成透明色,所以处理白色时有BUG,要修改难不难啊?
      

  3.   

    不难,把白色的rgb中的任何一个-1就ok了
      

  4.   


    Image1.Picture.Bitmap.TransparentColor := clWhite;
      

  5.   

    碰到过,请用 549too(接分专用马甲) 的方法