热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NSIS进阶教程(三)

自定义MessageBox,自定义页跳转,自定义CheckBox样式前言上一节中我们处理了Button的自定义以及Button的事件消息、协议框的创建等

自定义MessageBox,自定义页跳转,自定义CheckBox样式

前言

上一节中我们处理了Button的自定义以及Button的事件消息、协议框的创建等等,这节中我们要更加完美的要求我们的提示框也要漂亮,CheckBox也要自定义样式。有人说MessageBox在NSIS默认情况下是带边框的API窗口,是一个比较丑雏形,但是NSIS的nsDialogs插件也没有提供一个可以创建弹出窗的命令行呀,CheckBox系统自带的只能是那个默认的皮肤,如果想把CheckBox的背景改成蓝色,或者把CheckBox的勾改成爱心,把叉改成骷髅头如何去做呢?这些问题在任何一个面向对象的编程语言中都可以很容易实现,在NSIS这样局限的环境中也可以变通实现,接下来我们处理一下这些问题。

本篇主要讲讲以下几点:

  • 如何抛弃系统的MessageBox

  • 如何实现自定义页面的跳转

  • 如何用自己的贴图实现CheckBox功能

所用到的插件【新增】:

  1. FindProcDLL(查找当前进程插件)

  2. KillProcDLL (关闭指定进程插件)

讲义

首先贴出一个今天教程的完整的例子【已测试】【附带图片】 猛击这里

题外话,本节的重点是如何把系统的MessageBox替换掉自定义的窗口,一开始这个命题挺难的,原本因为nsDialogs可以创建一个弹窗,然后给它披上一层皮就可以了,在查了很多资料后,我了解到根本不行,nsDialogs插件不能完成这么简单的工作,而是通过另一个插件nsWindows来完成。另一个自定义CheckBox功能还是有点讨巧的,其实在窗体编程中,Button跟CheckBox本质上是一样的东西,CheckBox就是Button披上一层皮加上一些单击事件改变皮肤而存在的,于是就有了CheckBox的自定义的可能性。

还是要讲一点不足,此处CheckBox不包含旁边的说明文字,也就是说,当你促发CheckBox旁边的文字某些事件的时候CheckBox本事不会有任何反应,这样就不能构成一个CheckBox的整体,不过对于要求不是非常高的人来说,这点完全可以忽略。

如何抛弃系统的MessageBox

通常在使用警告框的时候,我们会调用MessageBox的NSIS命令,然而此窗口无比丑陋,简直是对我们正在做的窗体的亵渎。于是我们自己创建警告框,此警告框也要跟我们已有的窗口风格一致,包含几大问题,“无边框”、“美观贴图”、“移动”、“逻辑判断功能”,做到以上几点就可以了。上代码:

Function onCancelIsWindow $WarningForm Create_End!define Style ${WS_VISIBLE}|${WS_OVERLAPPEDWINDOW}${NSW_CreateWindowEx} $WarningForm $hwndparent ${ExStyle} ${Style} "" 1018${NSW_SetWindowSize} $WarningForm 349 184EnableWindow $hwndparent 0System::Call `user32::SetWindowLong(i$WarningForm,i${GWL_STYLE},0x9480084C)i.R0`${NSW_CreateButton} 148 122 88 25 ''Pop $R0StrCpy $1 $R0Call SkinBtn_Quit${NSW_OnClick} $R0 OnClickQuitOK${NSW_CreateButton} 248 122 88 25 ''Pop $R0StrCpy $1 $R0Call SkinBtn_Cancel${NSW_OnClick} $R0 OnClickQuitCancel${NSW_CreateBitmap} 0 0 100% 100% ""Pop $BGImage${NSW_SetImage} $BGImage $PLUGINSDIR\quit.bmp $ImageHandleGetFunctionAddress $0 onWarningGUICallbackWndProc::onCallback $BGImage $0 ;处理无边框窗体移动${NSW_CenterWindow} $WarningForm $hwndparent${NSW_Show}Create_End:ShowWindow $WarningForm ${SW_SHOW}
FunctionEnd

这个onCancel方法是在我们在主窗体上点击“取消”或者“关闭”的时候促发的方法,这时会弹出一个命令窗口出来。

创建跟设置样式:WS_VISIBLE 是显示的意思,不加会隐藏掉,WS_OVERLAPPEDWINDOW 是创建一个层叠窗体的属性也需要加上。NSW_CreateWindowEx 是创建窗体的主命令。

创建完窗体后,用NSW_SetWindowSize 更改一下窗体的大小。

EnableWindow $hwndparent 0这段代码一定要加上,这是创建一个警告框模式窗体的必要条件,就是让主窗体不能操作。

接下来就是消除边框,用nsWindows命令创建按钮的一套,跟nsDialogs的创建是一致的,包括无边框移动的一套,在第一节中已经讲过,这里就不啰嗦了。

最后把这个窗体展示出来就可以了。把这个onCancel这个方法赋给“取消”按钮的单击事件,这样一个无边框模式窗体警告框就好了。

当我们点击“退出”的时候,就要关掉当前程序,所以要添加一个关闭的方法:

Function onClickCloseFindProcDLL::FindProc "test.exe"Sleep 500Pop $R0${If} $R0 != 0KillProcDLL::KillProc "test.exe"${EndIf}
FunctionEnd

通过FindProcDLL插件的FindProc方法找到安装进程,并且通过KillProcDLL插件的KillProc杀之。

当我们点击“取消”的时候,这时候需要关闭当前警告框,并且让主窗体能够处于Active状态

Function OnClickQuitCancel${NSW_DestroyWindow} $WarningFormEnableWindow $hwndparent 1BringToFront
FunctionEnd

NSW_DestroyWindow命令销毁掉警告框,使主窗体能活动,并且Bring到前端。

如何实现自定义页面的跳转

一开始我们就定义了两个自定义页面:

Page custom WelcomePage
Page custom InstallationPage

WelcomePage跳转到InstallationPage,这个就是下一步按钮的事件。

创建一个RelGotoPage方法:

Function RelGotoPageIntCmp $R9 0 0 Move MoveStrCmp $R9 "X" 0 MoveStrCpy $R9 "120"Move:SendMessage $HWNDPARENT "0x408" "$R9" ""
FunctionEnd

详细解释在这里 http://nsis.sourceforge.net/Go_to_a_NSIS_page

If a number > 0: Goes foward that number of pages. Code of that page will be executed, not returning to this point. If it is bigger than the number of pages that are after that page, it simulates a “Cancel” click.

If a number <0: Goes back that number of pages. Code of that page will be executed, not returning to this point. If it is bigger than the number of pages that are before that page, it simulates a “Cancel” click.

If X: Simulates a “Cancel” click. Code will go to callback functions, not returning to this point.

If 0: Continues on the same page. Code will still be running after the call.

下一步的单击事件中加入以下代码&#xff0c;跳转就好了&#xff0c;而且以后的调转RelGotoPage都适用

Function onClickNextStrCpy $R9 1Call RelGotoPageAbort
FunctionEnd

如何用自己的贴图实现CheckBox功能

CheckBox也有系统自带的那种健全的&#xff0c;但是效果没有Button贴皮肤后好&#xff0c;所以弃用之&#xff0c;在第二个页面中创建几个Button跟标签&#xff1a;

${NSD_CreateButton} 26 150 15 15 ""Pop $Ck_ShortCutStrCpy $1 $Ck_ShortCutCall SkinBtn_CheckedGetFunctionAddress $3 OnClick_CheckShortCutSkinBtn::onClick $1 $3StrCpy $Bool_ShortCut 1${NSD_CreateLabel} 45 151 100 15 "添加桌面快捷方式"Pop $Lbl_ShortCutSetCtlColors $Lbl_ShortCut "" transparent ;背景设成透明

创建CheckBox的时候要考虑周全&#xff0c;首先要定义该CheckBox的变量&#xff0c;该CheckBox的皮肤&#xff0c;记录该CheckBox状态的变量$Bool_ShortCut&#xff0c;该CheckBox旁边的提示文字变量$Lbl_ShortCut

Button的贴图跟变换方式在第二节中已经介绍&#xff0c;这里就不啰嗦。

这里的OnClick_CheckShortCut方法不仅仅是一个变换的实现&#xff0c;也通过$Bool_ShortCut记录了当前CheckBox的状态

Function OnClick_CheckShortCut${IF} $Bool_ShortCut &#61;&#61; 1IntOp $Bool_ShortCut $Bool_ShortCut - 1StrCpy $1 $Ck_ShortCutCall SkinBtn_UnChecked${ELSE}IntOp $Bool_ShortCut $Bool_ShortCut &#43; 1StrCpy $1 $Ck_ShortCutCall SkinBtn_Checked${EndIf}
FunctionEnd

最后我们在完成安装的时候&#xff0c;可以通过$Bool_ShortCut该变量来了解用户的选择

结束语

其实不难&#xff0c;逻辑清晰&#xff0c;知道自己朝哪个方向去寻找答案&#xff0c;一切就会云开雾散。希望大家能学到一些。

***************************************************************************

有任何疑问请留言。

That’s all

下回继续探讨

 May 26th, 2013  NSIS

From&#xff1a;http://hamletsoft.com/blog/2013/05/26/learn-nsis-step-by-step-custommsgbox/



推荐阅读
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • jQuery实现简单的动画效果及用法详解
    本文详细介绍了使用jQuery实现简单动画效果的方法,包括显示/隐藏、向上收缩/向下展开、淡入/淡出、自定义动画等。同时提供了具体的用法示例,并解释了参数的含义和使用技巧。通过本文的学习,读者可以掌握如何使用jQuery实现各种动画效果,为网页增添生动和互动性。 ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
  • 第一步:PyQt4Designer设计程序界面该部分设计类同VisvalStudio内的设计,改下各部件的objectName!设计 ... [详细]
  • React提供三种方式创建Refs:字符串Refs(将被废弃)回调函数RefsReact.createRef(从React16.3开始)第一种方式不推荐使用,原因在此,并且可能会在之后的版本移除。classMyComponentextendsReact.Component{constructor(props){sup ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
author-avatar
觅树知音
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有