NSIS:实现程序窗口逐渐透明的渐入渐出效果

简介: 原文 NSIS:实现程序窗口逐渐透明的渐入渐出效果 需要修改版的插件(支持timer功能): MUI:InstallOptions.dll MUI2:nsDialogs.dll 以及system插件,(受api限制)只能运行于2k或者更高的平台之上。

原文 NSIS:实现程序窗口逐渐透明的渐入渐出效果

需要修改版的插件(支持timer功能):

MUI:InstallOptions.dll
MUI2:nsDialogs.dll
以及system插件,(受api限制)只能运行于2k或者更高的平台之上。
 
轻狂说明:
请在相应目录下建立transparent.ini文件。

001 /*
002 <a href="http://www.flighty.cn" target="_blank">www.flighty.cn</a>
003 */
004 !AddPluginDir .\
005 ;--------------------------------
006 !define MUI2  ;定义UI版本(MUI,MUI2)
007 !define iTransparentPercent 90   ;定义透明度
008 Var DIALOG
009 var iTransparent
010 var bTransparent
011 Name "Transparent Example"
012 SetCompressor /SOLID lzma
013 InstallDir $ExeDir
014 OutFile transparent_nsis.exe
015 !ifdef MUI2
016 !include MUI2.nsh
017 Var TIMERID
018 !else
019 !include MUI.nsh
020 ;定义INI文件
021 !define INI $PLUGINSDIR\transparent.ini
022 !endif
023 !include LogicLib.nsh
024 !ifndef GWL_EXSTYLE
025 !define GWL_EXSTYLE -20
026 !endif
027 !ifndef WS_EX_LAYERED
028 !define WS_EX_LAYERED 0x80000
029 !endif
030 !ifndef LWA_ALPHA
031 !define LWA_ALPHA 2
032 !endif
033 !define MUI_CUSTOMFUNCTION_ABORT UserAbort
034 !ifdef MUI2
035 Page custom nsDialogsPage
036 !else
037 page custom InstallOptionsPage
038 !endif
039 !define MUI_PAGE_CUSTOMFUNCTION_SHOW welcome_PageShow
040 ; 欢迎页面
041 !insertmacro MUI_PAGE_WELCOME
042 !insertmacro MUI_PAGE_DIRECTORY
043  !insertmacro MUI_PAGE_INSTFILES
044  !insertmacro MUI_PAGE_FINISH
045 ;--------------------------------
046  !insertmacro MUI_LANGUAGE "SimpChinese"
047 Section -Nil
048 SectionEnd
049 Function welcome_PageShow
050 !ifdef MUI2
051   Pop $0
052    nsDialogs::KillTimer /NOUNLOAD $TIMERID
053 !endif
054   GetDlgItem $0 $hwndparent 3
055   ShowWindow $0 0
056   ${if} $bTransparent == 0
057     ${For} $R0 0 $iTransparent
058       system::call 'user32::SetLayeredWindowAttributes(i $HWNDPARENT, i 0, i R0, i ${LWA_ALPHA}) .iR1'
059       sleep 1
060     ${Next}
061   ${endif}
062   StrCpy $bTransparent 1
063 FunctionEnd
064 Function Exit
065   ${ForEach} $R0 $iTransparent 0 - 1
066     system::call 'user32::SetLayeredWindowAttributes(i $HWNDPARENT, i 0, i R0, i ${LWA_ALPHA}) .iR1'
067     sleep 1
068   ${Next}
069 FunctionEnd
070 Function UserAbort
071   Messagebox MB_YESNO|MB_ICONQUESTION "Are Sure you want to cancel?" IDYES +2
072   Abort
073   call Exit
074 FunctionEnd
075 Function .onInstSuccess
076   Messagebox MB_OK|MB_ICONINFORMATION "Install Success!"
077   call Exit
078 FunctionEnd
079 Function SetWindowAttrib
080   ${if} $bTransparent == 0
081     system::call 'user32::GetWindowLong(i $HWNDPARENT, i ${GWL_EXSTYLE}) .iR0'
082     ;messagebox mb_ok $R0
083     IntOp $R0 $R0 + ${WS_EX_LAYERED}
084     system::call 'user32::SetWindowLong(i $HWNDPARENT, i ${GWL_EXSTYLE}, i R0) .iR1'
085     system::call 'user32::SetLayeredWindowAttributes(i $HWNDPARENT, i 0, i 0, i ${LWA_ALPHA}) .iR2'
086   Pop $R2
087   Pop $R1
088   Pop $R0
089   ${endif}
090 FunctionEnd
091 !ifndef MUI2
092 Function InstallOptionsPage
093   Call SetWindowAttrib
094   InstallOptions::initDialog /NOUNLOAD ${INI}
095     Pop $DIALOG
096 ;如果你想做的更逼真一些,请把它仿成欢迎页面(你的初始页面)一样的
097   InstallOptions::Show
098 FunctionEnd
099 !endif
100 !ifdef MUI2
101 Function OnTimer
102   Pop $0 ;Free Timer id
103   GetDlgItem $1 $HWNDPARENT 1
104   SendMessage $1 ${BM_CLICK} 0  1
105 FunctionEnd
106 Function nsDialogsPage
107   Call SetWindowAttrib
108   nsDialogs::Create /NOUNLOAD 1018
109   Pop $DIALOG
110 ;如果你想做的更逼真一些,请把它仿成欢迎页面(你的初始页面)一样的
111   GetFunctionAddress $0 OnTimer
112   nsDialogs::CreateTimer /NOUNLOAD $0 10
113   Pop $TIMERID
114   nsDialogs::Show
115 FunctionEnd
116 !endif
117 Function .OnInit
118   InitPluginsDir
119 !ifndef MUI2
120   File /oname=${INI} "transparent.ini"
121 !endif
122   IntOp $iTransparent ${iTransparentPercent} * 255
123   IntOp $iTransparent $iTransparent / 100
124   StrCpy $bTransparent 0
125 FunctionEnd
目录
相关文章
|
计算机视觉 Windows
Qt实用技巧:实现窗口透明的五种方法
Qt实用技巧:实现窗口透明的五种方法
Qt实用技巧:实现窗口透明的五种方法
|
1月前
|
C#
MDI窗口嵌入,我爱惨你了
小五在WinForm项目中遇到多线程问题。起初误以为MDI子窗体与主窗体异步,但实际上它们共享同一线程。在尝试解决耗时操作影响关键方法执行时,小五先错误地使用MDI子窗体,后通过`Task.Factory.StartNew`创建新线程。然而,更新界面时遇到跨线程操作错误。最终,小五学会使用`Invoke`处理UI线程同步,但发现`Invoke`使线程回到主线程,导致问题复发。总结:MDI子窗体与主窗体同线程,需谨慎处理UI线程同步。
|
计算机视觉
Qt实用技巧:使用非透明窗体鼠标穿透到桌面的设置方法
Qt实用技巧:使用非透明窗体鼠标穿透到桌面的设置方法
QT应用编程: QSlider设置滚动块定位到鼠标点击的地方
QT应用编程: QSlider设置滚动块定位到鼠标点击的地方
495 0
QT应用编程: QSlider设置滚动块定位到鼠标点击的地方
QT应用编程: 半透明遮罩窗口实现
QT应用编程: 半透明遮罩窗口实现
464 0
QT应用编程: 半透明遮罩窗口实现
|
iOS开发
iOS开发遇到的屏幕上下闪出黑边的解决方法
iOS开发遇到的屏幕上下闪出黑边的解决方法
197 0
iOS开发遇到的屏幕上下闪出黑边的解决方法
QT软件开发: 窗口打开固定在屏幕中间或者右下角
QT软件开发: 窗口打开固定在屏幕中间或者右下角
337 0
|
图形学
【UGUI】 (一)------- 放大镜
在许多游戏或应用中,我们常常看到放大镜的身影,而在Unity里面,制作一个简易的放大镜是非常简单的。                    一. 创建一个3DObject 创建一个Cube或者 Cylinder,这里为了更像放大镜一些,笔者创建了一个Cylinder。
1906 0