您的位置:首页 > 其它

png图片做窗口

2015-09-14 18:54 253 查看
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IGDIPlus, ExtCtrls, Menus, StdCtrls, PngImage, Unit2;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer;
      var Resize: Boolean);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Timer1Timer(Sender: TObject);
  private
    function UpdateDisplayInit(XTransparent: Integer = 100):Boolean;
  public
    FPng: TPNGObject;
    LImage: IGPImage;           //使用这个类来创建和操作GDI+图像
    LLogo: IGPImage;
    LGraphics: IGPGraphics;     //封装一个 GDI+ 绘图图面
    LHdcScreen,LHdcMemory: HDC;
    LhBitMap: Windows.HBITMAP;
    LBlend: BLENDFUNCTION;      //这种结构的混合控制通过指定源和目标位图的混合功能
    LRct: TRect;
    LPtWinPos,LPtSrc: TPoint;

    LSizeWindow: SIZE;
    LSrcPos: TPoint;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.UpdateDisplayInit(XTransparent: Integer):Boolean;
begin
  //---------------------开始:初始化操作--------------------------------------
  LHdcScreen := GetDC(Self.Handle);
  LHdcMemory := CreateCompatibleDC(LHdcScreen);
  LhBitMap := CreateCompatibleBitmap(LHdcScreen, Width, Height);
  SelectObject(LHdcMemory, LhBitMap);

  if (XTransparent < 0) or (XTransparent > 100) then
    XTransparent := 100;

  LBlend.BlendOp := AC_SRC_OVER;     //把源图片覆盖到目标之上
  LBlend.BlendFlags := 0;
  LBlend.AlphaFormat := AC_SRC_ALPHA;//每个像素有各自的alpha通道
  LBlend.SourceConstantAlpha :=Trunc(XTransparent * 2.55);  //源图片的透明度
  
  GetWindowRect(Self.Handle, LRct);
  LPtWinPos := Point(LRct.Left, LRct.Top);

  LGraphics := TGPGraphics.Create(LHdcMemory);
//  LImage := TGPImage.Create('3.png');             //背景图片

  LSrcPos.X := (Integer(LImage.GetWidth) - Width) div 2;
  //LSrcPos.Y := (Integer(LImage.GetHeight) - Height) div 2;
  LGraphics.DrawImage(LImage, MakeRect(0, 0, Width, Height), LSrcPos.X, 0, Width, Height, UnitPixel);

  LGraphics.DrawImage(LLogo, 0, 0, LLogo.GetWidth, LLogo.GetHeight);

  LSizeWindow.cx := Width;
  LSizeWindow.cy := Height;
  LPtSrc := Point(0,0);
  //---------------------开始:更新一个分层的窗口的位置,大小,形状,内容和半透明度---
  Result := UpdateLayeredWindow(Self.Handle,   //分层窗口的句柄
                                LHdcScreen,     //屏幕的DC句柄
                                @LPtWinPos,     //分层窗口新的屏幕坐标
                                @LSizeWindow,   //分层窗口新的大小
                                LHdcMemory,   //用来定义分层窗口的表面DC句柄
                                @LPtSrc,        //分层窗口在设备上下文的位置
                                0,             //合成分层窗口时使用指定颜色键值
                                @LBlend,        //在分层窗口进行组合时的透明度值
                                ULW_ALPHA);    //使用pblend为混合功能

end;

(*
function TForm1.UpdateDisplay(XTransparent: Integer):Boolean;
var
  LHdcScreen,LHdcMemory: HDC;
  LhBitMap: Windows.HBITMAP;
  LBlend: BLENDFUNCTION;      //这种结构的混合控制通过指定源和目标位图的混合功能
  LRct: TRect;
  LPtWinPos,LPtSrc: TPoint;

  LSizeWindow: SIZE;
  LSrcPos: TPoint;
begin
  //---------------------开始:初始化操作--------------------------------------
  LHdcScreen := GetDC(Self.Handle);
  LHdcMemory := CreateCompatibleDC(LHdcScreen);
  LhBitMap := CreateCompatibleBitmap(LHdcScreen, Width, Height);
  SelectObject(LHdcMemory, LhBitMap);

  if (XTransparent < 0) or (XTransparent > 100) then
    XTransparent := 100;

  LBlend.BlendOp := AC_SRC_OVER;     //把源图片覆盖到目标之上
  LBlend.BlendFlags := 0;
  LBlend.AlphaFormat := AC_SRC_ALPHA;//每个像素有各自的alpha通道
  LBlend.SourceConstantAlpha :=Trunc(XTransparent * 2.55);  //源图片的透明度
  
  GetWindowRect(Self.Handle, LRct);
  LPtWinPos := Point(LRct.Left, LRct.Top);

  LGraphics := TGPGraphics.Create(LHdcMemory);
//  LImage := TGPImage.Create('3.png');             //背景图片

  LSrcPos.X := (Integer(LImage.GetWidth) - Width) div 2;
  //LSrcPos.Y := (Integer(LImage.GetHeight) - Height) div 2;
  LGraphics.DrawImage(LImage, MakeRect(0, 0, Width, Height), LSrcPos.X, 0, Width, Height, UnitPixel);

  LGraphics.DrawImage(LLogo, 0, 0, LLogo.GetWidth, LLogo.GetHeight);

  LSizeWindow.cx := Width;
  LSizeWindow.cy := Height;
  LPtSrc := Point(0,0);
  //---------------------开始:更新一个分层的窗口的位置,大小,形状,内容和半透明度---
  Result := UpdateLayeredWindow(Self.Handle,   //分层窗口的句柄
                                LHdcScreen,     //屏幕的DC句柄
                                @LPtWinPos,     //分层窗口新的屏幕坐标
                                @LSizeWindow,   //分层窗口新的大小
                                LHdcMemory,   //用来定义分层窗口的表面DC句柄
                                @LPtSrc,        //分层窗口在设备上下文的位置
                                0,             //合成分层窗口时使用指定颜色键值
                                @LBlend,        //在分层窗口进行组合时的透明度值
                                ULW_ALPHA);    //使用pblend为混合功能
                                
  //---------------------开始:释放和删除--------------------------------------
  ReleaseDC(Self.Handle,LHdcScreen);
  DeleteObject(LhBitMap);
  DeleteDC(LHdcMemory);
end;
*)

procedure TForm1.Button1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
  if NewWidth > 2000 then
    NewWidth := 2000;
  if NewWidth < 1024 then
    NewWidth := 1024;
  if NewHeight > 1100 then
    NewHeight := 1100;
  if NewHeight < 734 then
    NewHeight := 734;

 Resize := True; 
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  LImage := TGPImage.Create('3.png');             //背景图片
  IInterface(LImage)._AddRef;
  LLogo := TGPImage.Create('Logo.png');
  IInterface(LLogo)._AddRef;

  DoubleBuffered := True;
  
  FPng := TPNGObject.Create;
  FPng.LoadFromFile('3.png');

  SetWindowLong(Self.Handle,
                GWL_EXSTYLE,
                GetWindowLong(Self.Handle,GWL_EXSTYLE)
                or WS_EX_LAYERED
                );

  UpdateDisplayInit();

  //Form2.Show;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
  IInterface(LImage)._Release;
  IInterface(LLogo)._Release;
  FreeAndNil(FPng);

    //---------------------开始:释放和删除--------------------------------------
  ReleaseDC(Self.Handle,LHdcScreen);
  DeleteObject(LhBitMap);
  DeleteDC(LHdcMemory);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Canvas.TextOut(0, 0, 'Key = ' + Char(Key));
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  //UpdateDisplay();
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  LRect: TGPRect;
begin
  //UpdateDisplay;

  LRect := MakeRect(100, 100, LLogo.Width, LLogo.Height);
  
  LGraphics.DrawImage(LImage, LRect, LSrcPos.X + LRect.X, 0 + LRect.Y, LRect.Width, LRect.Height, UnitPixel);
  LGraphics.DrawImage(LLogo, LRect);

  GetWindowRect(Self.Handle, LRct);
  LPtWinPos := Point(LRct.Left, LRct.Top);
    //---------------------开始:更新一个分层的窗口的位置,大小,形状,内容和半透明度---
  UpdateLayeredWindow(Self.Handle,   //分层窗口的句柄
                                LHdcScreen,     //屏幕的DC句柄
                                @LPtWinPos,     //分层窗口新的屏幕坐标
                                @LSizeWindow,   //分层窗口新的大小
                                LHdcMemory,   //用来定义分层窗口的表面DC句柄
                                @LPtSrc,        //分层窗口在设备上下文的位置
                                0,             //合成分层窗口时使用指定颜色键值
                                @LBlend,        //在分层窗口进行组合时的透明度值
                                ULW_ALPHA);    //使用pblend为混合功能

end;

end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: