Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 3687|回复: 7

PNG异形透明窗体

[复制链接]

该用户从未签到

发表于 2012-4-1 01:11:19 | 显示全部楼层 |阅读模式


这是PNG异形透明窗体的范例,根据其他语言修改而来。
talince QQ:408153576


unit Unit1;
{$mode objfpc}{$H+}
interface
uses
  Windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
  StdCtrls, GDIPAPI;
type
  { TForm1 }
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure MakeTrans ;
  private
    { private declarations }
  public
    { public declarations }
  end;
var
  Form1: TForm1;

MoveI: Boolean=False;   //无窗体移动
x1,y1,x2,y2: Integer;   //无窗体移动

  m_Blend: BLENDFUNCTION;
    m_hdcMemory: HDC;
  hdcScreen: HDC;
  hObject: HDC;
  hBMP: HBITMAP;
  sizeWindow: SIZE;
// rct: TRECT;
  ptSrc: TPOINT;
   _Graphics: GpGraphics;
implementation
{$R *.lfm}
{ TForm1 }
function UpdateLayeredWindow(Handle: THandle; hdcDest: HDC; pptDst: PPoint; _psize: PSize;
                             hdcSrc: HDC; pptSrc: PPoint; crKey: COLORREF; pblend: PBLENDFUNCTION; dwFlags: DWORD): Boolean; stdcall;
external 'user32.dll';
procedure TForm1.FormCreate(Sender: TObject);
var
    GpInput: TGdiplusStartupInput ;
    GpOutput: PGdiplusStartupOutput;
    token: ULONG;
begin
     GpInput.DebugEventCallback := nil;
  GpInput.SuppressBackgroundThread := False;
  GpInput.SuppressExternalCodecs   := False;
  GpInput.GdiplusVersion := 1;
   GdiplusStartup(token, @GpInput,GpOutput);
  MakeTrans;
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   //无窗体移动
   if (Button = mbLeft) then
  begin
    MoveI:= True;
  x1 := X ;
  y1 := Y;
  end
   else
   begin
    Close;
   end;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if MoveI then
     begin
   x2 := X - x1 + Self.Left;
   y2 := Y - y1 + Self.Top;
      Self.SetBounds(x2,y2,Self.Width ,Self.Height);
     end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MoveI:= False;
end;

procedure TForm1.MakeTrans; //画图
var
  img: GpImage;
  imgS: GpImage;
  lngHeight: cardinal;
   lngWidth: cardinal;
     lngHeightS: cardinal;
   lngWidthS: cardinal;
  //  tempBI: BITMAPINFO;
   curWinLong: LONG;
begin
     m_Blend.BlendOp := AC_SRC_OVER; //   the   only   BlendOp   defined   in   Windows   2000
  m_Blend.BlendFlags := 0; //   Must   be   zero
  m_Blend.AlphaFormat := AC_SRC_ALPHA; //This   flag   is   set   when   the   bitmap   has   an   Alpha   channel
  m_Blend.SourceConstantAlpha := 255;
    GdipLoadImageFromFile('.\skin\flower\flower.png',img);
    GdipLoadImageFromFile('.\skin\flower\flower_s.png ',imgS);
   GdipGetImageHeight(img, lngHeight);
   GdipGetImageWidth(img, lngWidth);
     GdipGetImageHeight(imgS, lngHeightS);
   GdipGetImageWidth(imgS, lngWidthS);
     hdcScreen := GetDC(0);
  m_hdcMemory := CreateCompatibleDC(hdcScreen);
  sizeWindow.cx := lngWidth;
  sizeWindow.cy := lngHeight;
  //  GetWindowRect(Handle, rct);
     hBMP := CreateCompatibleBitmap(hdcScreen, lngWidth, lngHeight);
    SelectObject(m_hdcMemory, hBMP);
   GdipCreateFromHDC(m_hdcMemory, _Graphics) ;
   GdipDrawImageRect(_graphics, img, 0, 0, lngWidth, lngHeight);
   GdipDeleteGraphics(_graphics);
   GdipCreateFromHDC(m_hdcMemory, _Graphics) ;
   GdipRotateWorldTransform(_Graphics,50,MatrixOrderAppend); //设置旋转角度
  GdipTranslateWorldTransform(_Graphics,-lngWidthS/2, -lngHeightS/2,MatrixOrderPrepend);
  GdipTranslateWorldTransform(_Graphics,lngWidth/ 2, lngHeight/ 2, MatrixOrderAppend);
  GdipDrawImageRect(_graphics, imgS, 0, 0, lngWidthS, lngHeightS);
  GdipDeleteGraphics(_graphics);

     curWinLong := GetWindowLong(Handle, GWL_EXSTYLE);
     SetWindowLong(Handle, GWL_EXSTYLE, curWinLong Or WS_EX_LAYERED);
   GdipDisposeImage(img);
   GdipDisposeImage(imgs);
   GdipDeleteGraphics(_graphics);
  ptSrc.x := 0;
  ptSrc.y := 0;

  UpdateLayeredWindow(Handle, hdcScreen, nil,@sizeWindow, m_hdcMemory, @ptSrc, 0, @m_Blend, ULW_ALPHA);
  //Release   resources
    SelectObject(m_hdcMemory,hObject);
  DeleteObject(hBMP);
  DeleteObject(hObject);
end;
end.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册(注册审核可向QQ群索取)

x
回复

使用道具 举报

该用户从未签到

发表于 2012-4-9 21:09:33 | 显示全部楼层
下来看看!!!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2012-4-10 19:50:20 | 显示全部楼层
??,我现在很想了解一下这个软件到底如何
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2012-4-12 18:35:40 | 显示全部楼层
谢谢,感谢分享
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2012-4-17 00:29:47 | 显示全部楼层
看看。到底是什么效果
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2012-5-27 00:23:42 | 显示全部楼层
是怎么异形的
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2012-5-29 21:51:35 | 显示全部楼层
嗯,GDI+啊,呵呵!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2012-6-22 20:03:35 | 显示全部楼层
有没有效果图???
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-5-2 20:10 , Processed in 0.036442 second(s), 10 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表