在delphi7或delphi2007中,已装有pngimage控件,TImage已支持png格式图片,现在就是想用png图片做窗体形状,如何实现,高分求教了!

解决方案 »

  1.   

    窗体透明,只显示png图片算不算?
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var region:THandle;
        function CreateBitmapRgn(Bitmap: TBitmap; TransparentColor: TColor): HRgn;
          var
            BitmapMask: TBitmap;
            RectList: TList;
            RgnData: PRgnData;
            I, Size: Integer;
            Rects: PRect;
            procedure FindRegionRectangles;
              var
                Mask: Byte;
                B: PByteArray;
                X, Y, Left, Right: Integer;
                ScanlineBytes, I: Integer;
                PR: PRect;
            begin
              B := BitmapMask.Scanline[0];
              ScanlineBytes := Integer(BitmapMask.Scanline[1]) - Integer(B);
              for Y := 0 to BitmapMask.Height-1 do
              begin
                Left := 0;
                Right := -1;
                I := 0;
                Mask := $80;
                for X := 0 to BitmapMask.Width-1 do
                begin
                  if (Mask and B[I]) <> 0 then
                  begin
                    if Right >= Left then
                    begin
                      New(PR);
                      PR^.Left := Left;
                      PR^.Top := Y;
                      PR^.Right := Right+1;
                      PR^.Bottom := Y+1;
                      RectList.Add(PR);
                    end;
                    Left := Right+2;
                  end;
                  Inc(Right);
                  Mask := Mask shr 1;
                  if Mask = 0 then
                  begin
                    Inc(I);
                    Mask := $80;
                  end;
                end;
                if Right >= Left then
                begin
                  New(PR);
                  PR^.Left := Left;
                  PR^.Top := Y;
                  PR^.Right := Right+1;
                  PR^.Bottom := Y+1;
                  RectList.Add(PR);
                end;
                Inc(Integer(B), ScanlineBytes);
              end;
            end;
        begin
            RectList := TList.Create;
            BitmapMask := TBitmap.Create;
            try
              BitmapMask.Assign(Bitmap);
              BitmapMask.Mask(TransparentColor);
              BitmapMask.PixelFormat := pf1bit;
              FindRegionRectangles;
              Size := SizeOf(TRgnData) + (RectList.Count * SizeOf(TRect));
              GetMem(RgnData, Size);
              try
                with RgnData^.rdh do
                begin
                  dwSize := SizeOf(TRgnDataHeader);
                  iType := RDH_RECTANGLES;
                  nCount := RectList.Count;
                  nRgnSize := SizeOf(TRect);
                  rcBound := Rect(0, 0, Bitmap.Width-1, Bitmap.Height-1);
                end;
                Rects := PRect(@RgnData^.Buffer);
                for I := 0 to RectList.Count-1 do
                begin
                  Rects^ := PRect(RectList.Items[I])^;
                  Dispose(PRect(RectList.Items[I]));
                  Inc(Rects);
                end;
                Result := ExtCreateRegion(nil, Size, RgnData^)
              finally
                FreeMem(RgnData, Size);
              end;
            finally
              BitmapMask.Free;
              RectList.Free;
            end;
        end;
    begin
        region:=CreateBitmapRgn(Image1.Picture.Bitmap,clBlack);
        SetWindowRgn(窗口句柄,region,True);
    end;
      

  3.   

    如果你的窗体上已经放了一个image来显示png图。那么再加入下面代码即可:procedure TForm1.FormCreate(Sender: TObject);
    begin
      Color:=15;
      TransparentColorValue:=Color;
      TransparentColor:=true;
    end;如果不需要标题栏,只需要设置
    self.BorderStyle:=bsNone;
    即可。
      

  4.   


    兄弟啊,你不会自己改改啊,写代码不是只有ctrl+C ctrl+V
      

  5.   

    方法一方法二 Suipack—suiskinForm