博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GDI+用PNG图片做半透明异型窗口
阅读量:5239 次
发布时间:2019-06-14

本文共 3968 字,大约阅读时间需要 13 分钟。

  1. {*******************************************************}
  2. {                                                       }
  3. {       GDI+用PNG图片做半透明异型窗口                   }
  4. {                                                       }
  5. {       版权所有 (C) 2008 QQ:3150379                    }
  6. {                                                       }
  7. {*******************************************************}
  8. unit Unit1;
  9. interface
  10. uses
  11.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  12.   Dialogs,
  13.   GDIPAPI, GDIPOBJ, Menus, StdCtrls;
  14. type
  15.   TForm1 = class(TForm)
  16.     PopupMenu1: TPopupMenu;
  17.     mniClose: TMenuItem;
  18.     mniChangeSkin: TMenuItem;
  19.     About1: TMenuItem;
  20.     Stayontop1: TMenuItem;
  21.     procedure FormCreate(Sender: TObject);
  22.     procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
  23.       Shift: TShiftState; X, Y: Integer);
  24.     procedure About1Click(Sender: TObject);
  25.     procedure Stayontop1Click(Sender: TObject);
  26.     procedure mniChangeSkinClick(Sender: TObject);
  27.     procedure mniCloseClick(Sender: TObject);
  28.   private
  29.     m_Blend: BLENDFUNCTION;
  30.     procedure SetTransparent(lpSkinFile: WideString; nTran: integer);
  31.           {   Private   declarations   }
  32.   public
  33.           {   Public   declarations   }
  34.   end;
  35. var
  36.   Form1: TForm1;
  37. implementation
  38. {$R   *.dfm}
  39. procedure TForm1.FormCreate(Sender: TObject);
  40. begin
  41.   BorderStyle := bsNone;
  42.   m_Blend.BlendOp := AC_SRC_OVER; //   the   only   BlendOp   defined   in   Windows   2000
  43.   m_Blend.BlendFlags := 0//   Must   be   zero
  44.   m_Blend.AlphaFormat := AC_SRC_ALPHA; //This   flag   is   set   when   the   bitmap   has   an   Alpha   channel
  45.   m_Blend.SourceConstantAlpha := 255;
  46.   if (FileExists(ExtractFilePath(ParamStr(0)) + 'Security - Alert.png')) then
  47.     SetTransparent(WideString(ExtractFilePath(ParamStr(0)) + 'Security - Alert.png'), 100);
  48.   //   Stay   on   top
  49.   SetWindowPos(Handle, HWND_TOPMOST, 0000, SWP_NOMOVE or SWP_NOSIZE);
  50. end;
  51. procedure TForm1.SetTransparent(lpSkinFile: WideString; nTran: integer);
  52. var
  53.   GPImage: TGPImage;
  54.   GPGraph: TGPGraphics;
  55.   m_Image: TGPImage;
  56.   m_hdcMemory: HDC;
  57.   hdcScreen: HDC;
  58.   hBMP: HBITMAP;
  59.   sizeWindow: SIZE;
  60.   rct: TRECT;
  61.   ptSrc: TPOINT;
  62. begin
  63.   //   Use   GDI+   load   image
  64.   GPImage := TGPImage.Create();
  65.   m_Image := GPImage.FromFile(lpSkinFile);
  66.   //   Create   Compatible   Bitmap
  67.   hdcScreen := GetDC(0);
  68.   m_hdcMemory := CreateCompatibleDC(hdcScreen);
  69.   hBMP := CreateCompatibleBitmap(hdcScreen, m_Image.GetWidth(), m_Image.GetHeight());
  70.   SelectObject(m_hdcMemory, hBMP);
  71.   //   Alpha   Value
  72.   if (nTran < 0or (nTran > 100then
  73.     nTran := 100;
  74.   m_Blend.SourceConstantAlpha := round(nTran * 2.55); //   1~255
  75.   GetWindowRect(Handle, rct);
  76.   GPGraph := TGPGraphics.Create(m_hdcMemory);
  77.   GPGraph.DrawImage(m_Image, 00, m_Image.GetWidth(), m_Image.GetHeight());
  78.   sizeWindow.cx := m_Image.GetWidth();
  79.   sizeWindow.cy := m_Image.GetHeight();
  80.   ptSrc.x := 0;
  81.   ptSrc.y := 0;
  82.   //   Set   Window   style
  83.   SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
  84.   //   perform   the   alpha   blend
  85.   UpdateLayeredWindow(Handle, hdcScreen, nil,@sizeWindow, m_hdcMemory, @ptSrc, 0, @m_Blend, ULW_ALPHA);
  86.   //Release   resources
  87.   GPGraph.ReleaseHDC(m_hdcMemory);
  88.   ReleaseDC(0, hdcScreen);
  89.   hdcScreen := 0;
  90.   DeleteObject(hBMP);
  91.   DeleteDC(m_hdcMemory);
  92.   m_hdcMemory := 0;
  93.   m_Image.Free;
  94.   GPGraph.Free;
  95. end;
  96. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  97.   Shift: TShiftState; X, Y: Integer);
  98. begin
  99.   if (Button = mbLeft) then
  100.   begin
  101.     ReleaseCapture();
  102.     Perform(WM_SYSCOMMAND, SC_MOVE or HTCAPTION, 0);
  103.   end;
  104. end;
  105. procedure TForm1.About1Click(Sender: TObject);
  106. begin
  107.   MessageDlg('效果还不行吧!'#13+'QQ:3150379', mtInformation, [mbOK], 0);
  108. end;
  109. procedure TForm1.Stayontop1Click(Sender: TObject);
  110. var
  111.   mi: TMenuItem;
  112.   WindowPos: HWND;
  113. begin
  114.   mi := Sender as TMenuItem;
  115.   mi.Checked := not mi.Checked;
  116.   if mi.Checked then
  117.     WindowPos := HWND_TOPMOST
  118.   else
  119.     WindowPos := HWND_NOTOPMOST;
  120.   SetWindowPos(Handle, WindowPos,0000, SWP_NOMOVE or SWP_NOSIZE);
  121. end;
  122. procedure TForm1.mniChangeSkinClick(Sender: TObject);
  123. var
  124.   dlgOpen: TOpenDialog;
  125. begin
  126.   dlgOpen := TOpenDialog.Create(Self);
  127.   dlgOpen.Filter := 'PNG   file(*.png)|*.png';
  128.   if (dlgOpen.Execute()) then
  129.   begin
  130.     SetTransparent(WideString(dlgOpen.FileName), 100);
  131.     Invalidate();
  132.   end;
  133.   dlgOpen.Free;
  134. end;
  135. procedure TForm1.mniCloseClick(Sender: TObject);
  136. begin
  137.   Close;
  138. end;
  139. end.

转载于:https://www.cnblogs.com/MaxWoods/p/3295892.html

你可能感兴趣的文章
Java IO流学习总结
查看>>
day22 01 初识面向对象----简单的人狗大战小游戏
查看>>
mybatis源代码分析:深入了解mybatis延迟加载机制
查看>>
Flask三剑客
查看>>
Hibernate-缓存
查看>>
【BZOJ4516】生成魔咒(后缀自动机)
查看>>
提高PHP性能的10条建议
查看>>
svn“Previous operation has not finished; run 'cleanup' if it was interrupted“报错的解决方法...
查看>>
熟用TableView
查看>>
Java大数——a^b + b^a
查看>>
poj 3164 最小树形图(朱刘算法)
查看>>
百度贴吧图片抓取工具
查看>>
服务器内存泄露 , 重启后恢复问题解决方案
查看>>
ajax post 传参
查看>>
2.1命令行和JSON的配置「深入浅出ASP.NET Core系列」
查看>>
android一些细节问题
查看>>
KDESVN中commit时出现containing working copy admin area is missing错误提示
查看>>
利用AOP写2PC框架(二)
查看>>
【动态规划】skiing
查看>>
java定时器的使用(Timer)
查看>>