ui插件官网BOP怎么关

手机滑动(轮播图)插件 - 推酷
手机滑动(轮播图)插件
@plugName: .touchSlide.js
&& &$(id).touchSlide({
&& &&& &//列表框的标签
&&&&&&& ul: &ul&,
&&&&&&& //列表标签
&&&&&&& li: &li&,
&&&&&&& //图片序列号按钮BOX
&&&&&&& numBox: &.num&,
&&&&&&& //数字按钮焦点样式
&&&&&&& cur: &cur&,
&&&&&&& //是否需要循环轮播
&&&&&&& isLoop: true,
&&&&&&& //是否自动播放
&&&&&&& isAuto: true,
&&&&&&& //是否启用图片延迟加载,提高网站初次载入的速度
&&&&&&& lazyLoad: false,
&&&&&&& //启用图片延迟加载时,真正图片存贮的属性名称
&&&&&&& imgSrc: &data-src&,
&&&&&&& //效果时间
&&&&&&& speed: 500,
&&&&&&& //效果间隔时间
&&&&&&& autoTime: 5000
; (function($) {
&&& /*属性写在构造函数中*/
&&& function TouchSlide(el, opts) {
&&&&&&& var self =
&&&&&&& self.wrap =
&&&&&&& self.index = 0;
&&&&&&& self.ul = self.wrap.find(opts.ul);
&&&&&&& self.li = self.ul.find(opts.li);
&&&&&&& self.len = self.li.
&&&&&&& self.liWidth = self.li.outerWidth(true);
&&&&&&& self.numBox = self.wrap.find(opts.numBox);
&&&&&&& self.isLoop = opts.isL
&&&&&&& self.isAuto = opts.isA
&&&&&&& self.lazyLoad = opts.lazyL
&&&&&&& self.imgSrc = opts.imgS
&&&&&&& self.cur = opts.
&&&&&&& self.speed = opts.
&&&&&&& self.autoTime = opts.autoT
&&&&&&& self.timer =
&&&&&&& //执行
&&&&&&& self.init();
&&& /*方法写在原型中*/
&&& TouchSlide.prototype = {
&&&&&&& /*初始化*/
&&&&&&& init: function() {
&&&&&&&&&&& var self =
&&&&&&&&&&& self.config();
&&&&&&&&&&& self.autoPlay();
&&&&&&&&&&& self.bind();
&&&&&&& },
&&&&&&& /*配置*/
&&&&&&& config: function() {
&&&&&&&&&&& var self =
&&&&&&&&&&& for (var m = 0; m & self. m++) {
&&&&&&&&&&&&&&& self.numBox.append(&&b&& + (m + 1) + &&/b&&);
&&&&&&&&&&& }
&&&&&&&&&&& self.numBoxB = self.numBox.children();
&&&&&&&&&&& self.numBoxB.eq(0).addClass(self.cur);
&&&&&&&&&&& /*添加覆盖loading层*/
&&&&&&&&&&& if (self.lazyLoad) {
&&&&&&&&&&&&&&& for (var n = 0; n & self. n++) {
&&&&&&&&&&&&&&&&&&& self.li.eq(n).append(&&div class='loading-cover'&&/div&&);
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& if (self.isLoop) {
&&&&&&&&&&&&&&& self.ul.width(self.liWidth * (self.len + 2));
&&&&&&&&&&&&&&& //lazyLoad的时候第一张图片加载完成后再clone
&&&&&&&&&&&&&&& if (self.lazyLoad) {
&&&&&&&&&&&&&&&&&&& self.loadImg(0,
&&&&&&&&&&&&&&&&&&& function() {
&&&&&&&&&&&&&&&&&&&&&&& self.li.eq(0).clone().appendTo(self.ul);
&& &&& &&& &&& &&& &&& &//lazyLoad的时候最后一张图片加载完成后再clone
&&&&&&&&&&&&&&&&&&&&&&& self.loadImg(self.len - 1,
&&&&&&&&&&&&&&&&&&&&&&& function() {
&&&&&&&&&&&&&&&&&&&&&&&&&&& self.li.eq(self.len - 1).clone().appendTo(self.ul);
&&&&&&&&&&&&&&&&&&&&&&&&&&& self.ul.children().eq(self.len + 1).({
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &position&: &relative&,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &left&: -self.liWidth * (self.len + 2)
&&&&&&&&&&&&&&&&&&&&&&&&&&& });
&&&&&&&&&&&&&&&&&&&&&&& });
&&&&&&&&&&&&&&&&&&& });
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& //否则
&&&&&&&&&&&&&&& else {
&&&&&&&&&&&&&&&&&&& self.li.eq(0).clone().appendTo(self.ul);
&&&&&&&&&&&&&&&&&&& self.li.eq(self.len - 1).clone().appendTo(self.ul);
&&&&&&&&&&&&&&&&&&& self.ul.children().eq(self.len + 1).css({
&&&&&&&&&&&&&&&&&&&&&&& &position&: &relative&,
&&&&&&&&&&&&&&&&&&&&&&& &left&: -self.liWidth * (self.len + 2)
&&&&&&&&&&&&&&&&&&& });
&&&&&&&&&&&&&&& }
&&&&&&&&&&& } else {
&&&&&&&&&&&&&&& self.lazyLoad && self.loadImg(0);
&&&&&&&&&&&&&&& self.ul.width(self.liWidth * self.len);
&&&&&&&&&&& }
&&&&&&& },
&&&&&&& /**/
&&&&&&& move: function() {
&&&&&&&&&&& var self =
&&&&&&&&&&& if (arguments[0] == 0) {
&&&&&&&&&&&&&&& //不循环的时候
&&&&&&&&&&&&&&& if (!self.isLoop) {
&&&&&&&&&&&&&&&&&&& if (self.index & self.len - 1) {
&&&&&&&&&&&&&&&&&&&&&&& self.index++;
&&&&&&&&&&&&&&&&&&& } else {
&&&&&&&&&&&&&&&&&&&&&&& clearInterval(self.timer);
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& //循环的时候
&&&&&&&&&&&&&&& else {
&&&&&&&&&&&&&&&&&&& self.index++;
&&&&&&&&&&&&&&& }
&&&&&&&&&&& } else if (arguments[0] == 1) {
&&&&&&&&&&&&&&& if (!self.isLoop && self.index & 0) {
&&&&&&&&&&&&&&&&&&& self.index--;
&&&&&&&&&&&&&&& } else if (self.isLoop) {
&&&&&&&&&&&&&&&&&&& self.index--;
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& self.ul.stop(true, true).animate({
&&&&&&&&&&&&&&& &left&: -self.liWidth * self.index + &px&
&&&&&&&&&&& },
&&&&&&&&&&& self.speed,
&&&&&&&&&&& function() {
&&&&&&&&&&&&&&& self.lazyLoad && self.loadImg(self.index);
&&&&&&&&&&&&&&& if (self.index & self.len - 1) {
&&&&&&&&&&&&&&&&&&& self.ul.css(&left&, 0);
&&&&&&&&&&&&&&&&&&& self.index = 0;
&&&&&&&&&&&&&&& } else if (self.index & 0) {
&&&&&&&&&&&&&&&&&&& self.ul.css(&left&, -self.liWidth * (self.len - 1));
&&&&&&&&&&&&&&&&&&& self.index = self.len - 1;
&&&&&&&&&&&&&&& }
&&&&&&&&&&& });
&&&&&&&&&&& self.numBoxB.removeClass(self.cur).eq(self.index).addClass(self.cur);
&&&&&&&&&&& if (self.isLoop && self.index == self.len) {
&&&&&&&&&&&&&&& self.numBoxB.removeClass(self.cur).eq(0).addClass(self.cur);
&&&&&&&&&&& }
&&&&&&& },
&&&&&&& /*加载图片函数*/
&&&&&&& loadImg: function(index, callback) {
&&&&&&&&&&& var self =
&&&&&&&&&&& if (self.lazyLoad) {
&&&&&&&&&&&&&&& var o = self.li.eq(index).find(&img&);
&&&&&&&&&&&&&&& //图片都加载完成后不再执行下面的方法
&&&&&&&&&&&&&&& if (o.attr(self.imgSrc)) {
&&&&&&&&&&&&&&&&&&& var img = new Image();
&&&&&&&&&&&&&&&&&&& img.src = o.attr(self.imgSrc);
&&&&&&&&&&&&&&&&&&& img.onload = function() {
&&&&&&&&&&&&&&&&&&&&&&& o.attr(&src&, img.src);
&&&&&&&&&&&&&&&&&&&&&&& o.removeAttr(self.imgSrc);
&&&&&&&&&&&&&&&&&&&&&&& self.li.eq(index).find(&.loading-cover&).remove();
&&&&&&&&&&&&&&&&&&&&&&& callback && typeof callback == &function& && callback();
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&& },
&&&&&&& /*自动*/
&&&&&&& autoPlay: function() {
&&&&&&&&&&& var self =
&&&&&&&&&&& if (self.isAuto) {
&&&&&&&&&&&&&&& self.timer = setInterval(function() {
&&&&&&&&&&&&&&&&&&& self.move(0);
&&&&&&&&&&&&&&& },
&&&&&&&&&&&&&&& self.autoTime);
&&&&&&&&&&& }
&&&&&&& },
&&&&&&& /**/
&&&&&&& bind: function() {
&&&&&&&&&&& var self =
&&&&&&&&&&& var startX, startY, ulOffset, spirit =
&&&&&&&&&&& function touchStart(event) {
&&&&&&&&&&&&&&& clearInterval(self.timer);
&&&&&&&&&&&&&&& spirit =
&&&&&&&&&&&&&&& if (!event.touches.length)
&&&&&&&&&&&&&&& var touch = event.touches[0];
&&&&&&&&&&&&&&& startX = touch.pageX;
&&&&&&&&&&&&&&& startY = touch.pageY;
&&&&&&&&&&&&&&& ulOffset = parseInt(self.ul.css(&left&));
&&&&&&&&&&& }
&&&&&&&&&&& function touchMove(event) {
&&&&&&&&&&&&&&& if (!event.touches.length)
&&&&&&&&&&&&&&& var touch = event.touches[0],
&&&&&&&&&&&&&&&& &&& &x = touch.pageX - startX,
&&&&&&&&&&&&&& &&& &y = touch.pageY - startY;
&&&&&&&&&&&&&&& //阻止网页默认动作(即网页滑动)
&&&&&&&&&&&&&&& event.preventDefault();
&&&&&&&&&&&&&&& //这里是为了手指一定是横向滑动的,原理是计算X位置的偏移要比Y的偏移大
&&&&&&&&&&&&&&& if (Math.abs(x) & Math.abs(y)) {
&&&&&&&&&&&&&&&&&&& //向左滑动
&&&&&&&&&&&&&&&&&&& if (x & 0) {
&&&&&&&&&&&&&&&&&&&&&&& spirit = 0;
&&&&&&&&&&&&&&&&&&&&&&& self.ul.css(&left&, ulOffset - Math.abs(x) + &px&);
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& //向右滑动
&&&&&&&&&&&&&&&&&&& else {
&&&&&&&&&&&&&&&&&&&&&&& spirit = 1;
&&&&&&&&&&&&&&&&&&&&&&& self.ul.css(&left&, ulOffset + Math.abs(x) + &px&);
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& function touchEnd(event) {
&&&&&&&&&&&&&&& spirit == 0 && self.move(0);
&&&&&&&&&&&&&&& spirit == 1 && self.move(1);
&&&&&&&&&&&&&&& self.autoPlay();
&&&&&&&&&&& }
&&&&&&&&&&& //是高级浏览器,不必做addEventListener的兼容
&&&&&&&&&&& self.wrap[0].addEventListener(&&, touchStart, false);
&&&&&&&&&&& self.wrap[0].addEventListener(&&, touchMove, false);
&&&&&&&&&&& self.wrap[0].addEventListener(&&, touchEnd, false);
&&& //插件
&&& $.fn.touchSlide = function(options) {
&&&&&&& var opts = $.extend({},$.fn.touchSlide.defaults, options);
&&&&&&& this.each(function() {
&&&&&&&&&&& //new构造函数对象
&&&&&&&&&&& new TouchSlide($(this), opts);
&&&&&&& });
&&& /*定义默认值*/
&&& $.fn.touchSlide.defaults = {
&&&&&&& //列表框的标签
&&&&&&& ul: &ul&,
&&&&&&& //列表标签
&&&&&&& li: &li&,
&&&&&&& //图片序列号按钮BOX
&&&&&&& numBox: &.num&,
&&&&&&& //数字按钮焦点样式
&&&&&&& cur: &cur&,
&&&&&&& //是否需要循环轮播
&&&&&&& isLoop: true,
&&&&&&& //是否自动播放
&&&&&&& isAuto: true,
&&&&&&& //是否启用图片延迟加载,提高网站初次载入的速度
&&&&&&& lazyLoad: false,
&&&&&&& //启用图片延迟加载时,真正图片存贮的属性名称
&&&&&&& imgSrc: &data-src&,
&&&&&&& //效果时间
&&&&&&& speed: 150,
&&&&&&& //效果间隔时间
&&&&&&& autoTime: 5000
})(jQuery)
&!DOCTYPE &
&meta http-equiv=&Content-Type& content=&text/ charset=utf-8&&
&meta content=&width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;& name=&viewport& /&
&title&循环轮播图插件-开发()-关注常见的前端开发问题、最新的前端开发技术(前端移动开发)和最好的前端开发工具&/title&
&style type=&text/css&&
html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0}
body{font:400 12px/1.5 \5b8b\4f53,Arial,Helvetica,sans-serif}
h1,h2,h3,h4,h5,h6,i{font-weight:400;font-style:normal}
select,input,img,th{vertical-align:middle}
img{border:none}
ul,ol,li,dl,dt,dd{list-style-type:none}
a{text-decoration:none}
a:hover{text-decoration:underline}
a:focus,input[type=&button&]:focus,input[type=&submit&]:focus,button,textarea:focus{outline:none}
table{border-collapse:border-spacing:0}
textarea{overflow:resize:none}
.clearfix{*zoom:1}
.clearfix:after{display:visibility:clear:height:0;content:'.';font-size:0}
.fl{float:display:inline}
.fr{float:display:inline}
.display-i-b{display:inline-*display:*zoom:1}
header,footer,article,aside,section,nav,menu,hgroup{display:margin:0;padding:0}
img{width:320px}
.imageSlide{position:overflow:font-size:0;width:320height:214px}
.imageSlide ul{ position:absolute}
.imageSlide li{position:float:display:width:320height:214px}
/*小按钮样式*/
.imageSlide .num{text-align:position: width:100%; left:0; bottom:10 z-index:10}
.imageSlide .num b{display:inline-*display:*zoom:1; width:14 height:14 margin:6px 8px 0 0;background:url(data:image/base64,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) no-repeat}
.imageSlide .num .cur{background-position:-14px 0}
/*loading的样式*/
.imageSlide .loading-cover{ position: left:0; top:0; background:url(img/loading_black.gif) no-repeat center center # z-index:10; width:100%; height:100%}
&div id=&imageSlide&&
&&& &li&&a href=&#&&&img src=&img/blank.gif& data-src=&img/imgSlide2/i01.jpg&&&/a&&/li&
&&& &li&&a href=&#&&&img src=&img/blank.gif& data-src=&img/imgSlide2/i02.jpg&&&/a&&/li&
&&& &li&&a href=&#&&&img src=&img/blank.gif& data-src=&img/imgSlide2/i03.jpg&&&/a&&/li&
&&& &li&&a href=&#&&&img src=&img/blank.gif& data-src=&img/imgSlide2/i04.jpg&&&/a&&/li&
&&& &li&&a href=&#&&&img src=&img/blank.gif& data-src=&img/imgSlide2/i05.jpg&&&/a&&/li&
&&& &li&&a href=&#&&&img src=&img/blank.gif& data-src=&img/imgSlide2/i06.jpg&&&/a&&/li&
&&& &li&&a href=&#&&&img src=&img/blank.gif& data-src=&img/imgSlide2/i07.jpg&&&/a&&/li&
&&& &li&&a href=&#&&&img src=&img/blank.gif& data-src=&img/imgSlide2/i08.jpg&&&/a&&/li&
& &div&&/div&
&script type=&text/& src=&/jquery-1.10.2.min.js&&&/script&
&script type=&text/javascript& src=&js/jquery.touchSlide.min.js&&&/script&
&script type=&text/javascript&&
$(function(){
&& &$(&#imageSlide&).touchSlide({lazyLoad:true});
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致403 Forbidden
403 Forbidden独创ShaderEngineTM图像增强引擎,4倍速驱动,降低画面噪点,锐利画质呈现,低画质视频照样全屏放
独创LiveColorTM彩色增强算法,画面色彩更艳丽
独创SmartAmplifyTM智能音场平衡技术,声效更显震撼
独创FastMotionTM解码优化技术,大幅降低CPU和内存占用。多核 SSE2 SSE3 MMX GPU优化
独创PowerTravelTM旅行节电模式,降低能耗,增加笔记本的巡航时间
独创EyeCareTM护眼模式,久看不疲劳,健康最重要
独创Anti-SillyTM智能免配置,数百逻辑分支自动根据硬件配置选择最佳模式。
独创CloudMatchingTM智能显示字幕技术,外语片从此不再需要找寻匹配字幕
经过多位专业热心用户的意见和设计,射手影音界面秉承简洁、时尚,功能完整而又不影响一般使用。功能按钮新手拈来,挥之即去
同类产品比较
RealPlayer
安装包大小
智能下载匹配字幕
开放源代码
提供绿色安装包
全格式播放
软件打开速度
启动后内存占用
播放时内存占用
用户口碑及网络评价
日 作者 唐山居人
视频播放器一直都是一个亘古不变的话题,从暴风影音到KMPlayer,似乎每款软件都有着自己的优点与不足。而这款由国内最大字幕下载站“射手网”自主开发的视频播放器, ...
太平洋电脑网 - .cn/soft/gj/media/.html
友情链接:
热门字幕:
Sponsored by:关于制作安装包的基本操作(InstallShield) - 博客频道 - CSDN.NET
jeff's blog
coder's life
分类:installshield
最近有一个项目是c/s模式的,必须制作安装包,已达到客户使用的简单化。对于我一个以前没有做个安装包的人,在网上找了一些资料,加上自己的一点实践,终于做好了。
好在一开始就有了一个概念,制作安装包可以使用InstallShield,以前觉得这玩意神乎其神的,其实也没什么了,多查资料,多实践就好了。再一次验证了我的一个观点:对于我们开发者而言,知道某种技术或者说工具的用途和概念,比我们知道怎么用他更有益。因为技术和工具太多,我们不可能一次性全部把他们全部学会,也没必要,只有当我们需要做一些事情的时候,我们知道某种东西可以更加方便的实现我们的需求的时候,我们再去学他,这样就事半功倍了。
呵呵,扯了大半天。开始讲述一下大概过程和涉及到的关键东西吧
1、当然是下载一个InstallShield安装一下咯,我的是InstallShield 2010 Premier Edition with version 16
2、新建一个项目吧,这里我们新建一个Windows Installer下的InstallScript MSI Project,至于每个项目的区别就网上查资料看看了。输入项目名称,选择存储路经,确定ok
3、&工具栏下面有三个选项卡,分别是Start Page、Project Assistant和Installation Designer。其中Project Assistant是一个向导式的安装包制作流程,可以完成基本的打包等工作。Installation Designer则是更加具体,功能更加强大的安装包制作方式,可以采用脚本的方式控制安装步骤的执行。我们可以采用Project Assistant和Installation Designer相结合的方式来完成这次制作过程
4、在Project Assistant页面中的下方选择&Application Information&,输入一些软件的基本信息;选择&Installation Requirements&设置一些安装的环境需求,这里没设置;选择&Installation Architecture&设置一下文件的结构,这里我们新建了三个文件夹,分别是Server、Client、Doc,分别存放服务器、客户端和文档内容。这里设置的对应Installation Designer下的Organization下面的features,把Features下面的三个子项更改为Server、Client和Doc;回到&Project Assistant&页面,选择&Application Files&,可以设置每个文件夹下面所包含的内容,这里我们不采用这种静态的方式,因为如果这里设置了,不管你选择只安装服务端或者客户端等,都会把所有文件都拷贝到安装目录下,所以我们采用脚本的方式动态加载需要的文件;当然采用Project Assistant也可以设置注册表等操作,但是后面的操作,我们基本上都采用脚本控制
5、选择Installation Designer页面左边树状栏里选择Behavior And Logic下面的InstallScript,新建一个Script File,系统自动命名为Setup.Rul,这个名字不要更改。在代码编辑区的上面我们可以看到有一个函数生成帮助,可以自动为项目生成一些安装脚本。可以自己试试。下面我把整段代码贴上来,然后对重要的地方进行解释
&//===========================================================================
File Name:
Description:
Blank setup main script file
Blank setup is an empty setup project. If you want to
create a new project via. step-by step instructions use the
Project Assistant.
//===========================================================================
// Included header files ----------------------------------------------------
#include "ifx.h"
// Note: In order to have your InstallScript function executed as a custom
// action by the Windows Installer, it must be prototyped as an
// entry-point function.
// The keyword export identifies MyFunction() as an entry-point function.
// The argument it accepts must be a handle to the Installer database.
/* export prototype MyFunction(HWND); */
//---------------------------------------------------------------------------
// OnBegin
// The OnBegin event is called directly by the framework after the setup
// initializes.
//---------------------------------------------------------------------------
STRING psvSQLsvr, psvSQLusr, psvSQL
BOOL bvWindowsL
prototype number CreateDataBase(STRING,STRING,STRING);
prototype number SQLLogin(); //定义登录函数
function number CreateDataBase(svSQLsvr,svSQLusr,svSQLpwd)
STRING szCmdLine,szWaitT
szWaitTxt=" 正在创建所需数据库.";
SdShowMsg (szWaitTxt, TRUE);
if(bvWindowsLogin) then
szCmdLine = "/E
/S "+psvSQLsvr+" /Q /"EXEC
sp_attach_db
N'EstartManage',@filename1
= N'"+TARGETDIR^"db//EstartManage_Data.MDF',@filename2
= N'"+TARGETDIR^"db//EstartManage_Log.LDF'/"";
szCmdLine = "/U "+psvSQLusr+" /P "+psvSQLpwd+" /S "+psvSQLsvr+" /Q /"EXEC
sp_attach_db
N'EstartManage',@filename1
= N'"+TARGETDIR^"db//EstartManage_Data.MDF',@filename2
= N'"+TARGETDIR^"db//EstartManage_Log.LDF'/"";
if (LaunchAppAndWait("osql.exe", szCmdLine,WAIT) & 0) then
MessageBox ("数据库创建失败!请确您的系统中已安装 Microsoft SQL Server 2000. 如仍无法解决,请联系系统供应商!",SEVERE);
SdShowMsg (szWaitTxt, FALSE);
szWaitTxt=" 正在优化系统数据库.";
SdShowMsg (szWaitTxt, TRUE);
szCmdLine = "/U "+psvSQLusr+" /P "+psvSQLpwd+" /S "+psvSQLsvr+" /Q /"use EstartM exec sp_updatestats/"";
if (LaunchAppAndWait("osql.exe", szCmdLine,WAIT) & 0) then
MessageBox ("数据库优化失败!您可以在 sql查询分析器中执行 use EstartM exec sp_updatestats 完成!",SEVERE);
SdShowMsg (szWaitTxt, FALSE);
function number SQLLogin()
number nResult, nS
STRING sMessage, sT
SQLRTInitialize2 ();
nResult = SQLServerSelectLogin(psvSQLsvr, psvSQLusr, psvSQLpwd, bvWindowsLogin );
if (nResult = BACK) then
return BACK;
nSize=MAX_PATH;
MsiGetProperty(ISMSI_HANDLE, "IS_SQLSERVER_STATUS", sTemp, nSize );
if(sTemp!="0") then
nSize = _MAX_PATH;
MsiGetProperty(ISMSI_HANDLE, "IS_SQLSERVER_STATUS_ERROR", sMessage, nSize );
if( nSize = 0 ) then
sMessage = SdLoadString( IDS_IFX_SQL_ERROR_LOGIN_FAILED );
//MessageBox( sMessage, MB_OK );
//goto Dlg_S
function OnBegin()
// TO DO: you may change default non-UI setting, for example
// You may also perform your custom initialization steps, check requirements, etc.
Disable (BACKBUTTON);
if(!MAINTENANCE)then
SdLicense2 ("License", "", "", SUPPORTDIR ^ "license.txt", FALSE);
//安装.net framework
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
if (RegDBKeyExist ("SOFTWARE//Microsoft//.NETFramework") & 0) then
if(LaunchAppAndWait (SRCDIR^"dotnetfx20.exe","", LAAW_OPTION_WAIT)&0)then
MessageBox ("You haven't installed dotnet framework yet! ", INFORMATION);
//---------------------------------------------------------------------------
// OnFirstUIBefore
// The OnFirstUIBefore event is called by the framework when the setup is
// running in first install mode. By default this event displays UI allowing
// the end user to specify installation parameters.
//---------------------------------------------------------------------------
function OnFirstUIBefore()
NUMBER nResult, nSetupType, nvSize, nU
STRING szTitle, szMsg, szQuestion, svName, svCompany, szF
STRING szLicenseF
BOOL bCustom, bIgnore1, bIgnore2;
LIST list, listStartC
STRING szFeatureName1;
STRING szFeatureName2;
STRING szFeatureName3;
NUMBER bvOpt1,bvOpt2;
//STRING szSrcFile1;
//STRING szTarFolder1;
// TO DO: if you want to enable background, window title, and caption bar title
// SetTitle( @PRODUCT_NAME, 24, WHITE );
// SetTitle( @PRODUCT_NAME, 0, BACKGROUNDCAPTION );
// Enable( FULLWINDOWMODE );
// Enable( BACKGROUND );
// SetColor(BACKGROUND,RGB (0, 128, 128));
// Added in InstallShield 15 - Show an appropriate error message if
// -removeonly is specified and the product is not installed.
szFeatureName1 ="Server";
szFeatureName2 ="Client";
szFeatureName3 ="Doc";
if( REMOVEONLY ) then
Disable( DIALOGCACHE );
szMsg = SdLoadString( IDS_IFX_ERROR_PRODUCT_NOT_INSTALLED_UNINST );
SdSubstituteProductInfo( szMsg );
MessageBox( szMsg, SEVERE );
nSetupType = TYPICAL;
Dlg_SdWelcome:
szTitle = "";
nResult = SdWelcome(szTitle, szMsg);
if (nResult = BACK) goto Dlg_SdW
svCompany = "";
Dlg_SdRegisterUser:
szMsg = "";
szTitle = "";
nResult = SdRegisterUser( szTitle, szMsg, svName, svCompany );
if (nResult = BACK) goto Dlg_SdW
Dlg_SetupType:
szTitle = "";
nResult = SetupType2(szTitle, szMsg, "", nSetupType, 0);
if (nResult = BACK) then
goto Dlg_SdRegisterU
nSetupType = nR
if (nSetupType != CUSTOM) then
nvSize = 0;
FeatureCompareSizeRequired(MEDIA, INSTALLDIR, nvSize);
if (nvSize != 0) then
MessageBox(szSdStr_NotEnoughSpace, WARNING);
goto Dlg_SetupT
bCustom = FALSE;
goto Dlg_SQL;
bCustom = TRUE;
Dlg_SdAskDestPath:
nResult = SdAskDestPath(szTitle, szMsg, INSTALLDIR, 0);
if (nResult = BACK) goto Dlg_SetupT
Dlg_SdFeatureTree:
if (nSetupType = CUSTOM) then
nResult = SdFeatureTree(szTitle, szMsg, INSTALLDIR, "", 2);
if (nResult = BACK) goto Dlg_SdAskDestP
//if (nResult = BACK) goto Dlg_C
//nResult = OnSQLLogin( nResult );
//if( nResult = BACK ) then
//if (!bCustom) then
//goto Dlg_SetupT
//goto Dlg_SdFeatureT
if (FeatureIsItemSelected(MEDIA, "Server")=1) then
if (RegDBKeyExist ("SOFTWARE//Microsoft//Microsoft SQL Server") & 0) then
MessageBox("检测到您的电脑未安装Sql Server 2000数据库/n如果已安装或者安装了更高级的版本,请安装数据库时取消安装",INFORMATION);
if(LaunchAppAndWait(SRCDIR^"sqlserver2000//autorun.exe","", LAAW_OPTION_WAIT)&0)then
MessageBox("安装Sql Server 2000数据库失败,可以在运行程序前先安装数据库",INFORMATION);
return -1;
//MessageBox("安装Sql Server 2000数据库成功",INFORMATION);
nResult = SQLLogin();
if( nResult = BACK ) then
if (!bCustom) then
goto Dlg_SetupT
goto Dlg_SdFeatureT
Dlg_SdStartCopy:
szTitle = "";
//需要拷贝的源文件
//szSrcFile1 = SRCDIR^"db//*.*";
//拷贝的目的地,目标文件夹
//szTarFolder1 = TARGETDIR^"db//*.*";
//if(CopyFile(szSrcFile1, szTarFolder1)=0) then
//MessageBox("复制数据库成功",INFORMATION);
listStartCopy = ListCreate( STRINGLIST );
ListAddString(listStartCopy,"Customer Information:",AFTER);
ListAddString(listStartCopy,"User Name: " + svName,AFTER);
ListAddString(listStartCopy,"Company Name: " + svCompany,AFTER);
ListAddString(listStartCopy,"Destination Location: " + INSTALLDIR,AFTER);
switch (nSetupType)
case TYPICAL : ListAddString(listStartCopy,"Setup Type: Typical",AFTER);
case COMPACT: ListAddString(listStartCopy,"Setup Type: Compact",AFTER);
case CUSTOM: ListAddString(listStartCopy,"Setup Type: Custom",AFTER);
ListAddString(listStartCopy," ",AFTER);
ListAddString(listStartCopy,"The Selected Feature:",AFTER);
if (FeatureIsItemSelected(MEDIA, szFeatureName1)=1) then
ListAddString(listStartCopy," "+szFeatureName1,AFTER);
if (FeatureIsItemSelected(MEDIA, szFeatureName2)=1) then
ListAddString(listStartCopy," "+szFeatureName2,AFTER);
if (FeatureIsItemSelected(MEDIA, szFeatureName3)=1) then
ListAddString(listStartCopy," "+szFeatureName3,AFTER);
nResult = SdStartCopy( szTitle, szMsg,listStartCopy);
ListDestroy(listStartCopy);
if (nResult = BACK) then
if (FeatureIsItemSelected(MEDIA, "Server")=1) then
goto Dlg_SQL;
goto Dlg_SdFeatureT
// Added in IS 2009 - Set appropriate StatusEx static text.
SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_FIRSTUI ) );
// setup default status
Enable(STATUSEX);
//---------------------------------------------------------------------------
// OnFirstUIAfter
// The OnFirstUIAfter event called by the framework after the file transfer
// of the setup when the setup is running in first install mode. By default
// this event displays UI that informs the end user that the setup has been
// completed successfully.
//---------------------------------------------------------------------------
function OnFirstUIAfter()
STRING szTitle, szMsg1, szMsg2, szOpt1, szOpt2;
NUMBER bOpt1, bOpt2;
STRING szOption1,szOption2;
STRING szFeatureName1;
STRING szFeatureName2;
STRING szFeatureName3;
STRING szSrcFile1;
STRING szSrcFile2;
STRING szSrcFile3;
STRING szSrcFile4;
STRING szSrcFile5;
STRING szTarFolder1;
STRING szTarFolder2;
STRING szTarFolder3;
STRING szDocFile, szDocFileN// szDocFile,查找函数返回的查询得到文件名;szDocFileName,要查找的文件名
STRING szfilename,szFolder ,szmsg1,szmsg2;
STRING szK
szFeatureName1 ="Server";
szFeatureName2 ="Client";
szFeatureName3 ="Doc";
//需要拷贝的源文件
szSrcFile1 = SRCDIR^"db//*.*";
szSrcFile2 = SRCDIR^"doc//*.*";
szSrcFile3 = SRCDIR^"lib//Client//*.*";
szSrcFile4 = SRCDIR^"lib//Server//*.*";
szSrcFile5 = SRCDIR^"icon//*.*";
//拷贝的目的地,目标文件夹
szTarFolder1 = TARGETDIR^"db//*.*";
szTarFolder2 = TARGETDIR^"doc//*.*";
szTarFolder3 = TARGETDIR^"doc";
//MessageBox(szSrcFile1,INFORMATION);
//MessageBox(szSrcFile2,INFORMATION);
//MessageBox(szTarFolder1,INFORMATION);
//MessageBox(szTarFolder2,INFORMATION);
//MessageBox(szTarFolder3,INFORMATION);
CopyFile(szSrcFile5, TARGETDIR^"icon//*.*");
if (FeatureIsItemSelected(MEDIA, szFeatureName1)=1) then
//安装sql server
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
szKey = "SOFTWARE//EstartManage";
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
if(RegDBSetKeyValueEx(szKey, "VALUE1", REGDB_STRING, "wHpb9E6JNaQ=", -1)&0) then
MessageBox("failed",INFORMATION);
RegDBSetKeyValueEx(szKey, "VALUE2", REGDB_STRING, "23C2o8FWyF0=", -1);
RegDBSetKeyValueEx(szKey, "VALUE3", REGDB_STRING, "", -1);
if(CopyFile(szSrcFile4, TARGETDIR^"Server//*.*")=0) then //那么把要拷贝的文件拷贝过去
nResult = FindAllFiles(TARGETDIR^"Server", "*.exe", szDocFile, RESET); //对拷贝过去的文件进行查找,该函数会在第一个符合条件//的文件处停止
while (nResult = 0)
LongPathToQuote(szDocFile, TRUE );
//MessageBox(szDocFile,INFORMATION);
ParsePath (szDocFileName, szDocFile, FILENAME_ONLY);//对查找到的文件获取文件名
AddFolderIcon(FOLDER_PROGRAMS^"EstartManage//Server",szDocFileName, szDocFile, "", TARGETDIR^"icon//server.ico" , 0 ,"" , REPLACE ); //为该文件创建快捷方式,快捷方式的显示名就是刚才获取的文件名
nResult = FindAllFiles(TARGETDIR^"Server", "*.exe", szDocFile, CONTINUE);//从上一个查找的位置继续向下查找,进行循环
if(CopyFile(szSrcFile1, szTarFolder1)=0) then
//MessageBox("复制数据库成功",INFORMATION);
if (FeatureIsItemSelected(MEDIA, szFeatureName2)=1) then
szKey = "SOFTWARE//EstartManage";
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
if(RegDBSetKeyValueEx(szKey, "VALUE1", REGDB_STRING, "wHpb9E6JNaQ=", -1)&0) then
MessageBox("failed",INFORMATION);
RegDBSetKeyValueEx(szKey, "VALUE2", REGDB_STRING, "23C2o8FWyF0=", -1);
RegDBSetKeyValueEx(szKey, "VALUE3", REGDB_STRING, "", -1);
if(CopyFile(szSrcFile3, TARGETDIR^"Client//*.*")=0) then //那么把要拷贝的文件拷贝过去
//MessageBox("复制文档成功",INFORMATION);
nResult = FindAllFiles(TARGETDIR^"Client", "*.exe", szDocFile, RESET); //对拷贝过去的文件进行查找,该函数会在第一个符合条件//的文件处停止
while (nResult = 0)
LongPathToQuote(szDocFile, TRUE );
//MessageBox(szDocFile,INFORMATION);
ParsePath (szDocFileName, szDocFile, FILENAME_ONLY);//对查找到的文件获取文件名
AddFolderIcon(FOLDER_PROGRAMS^"EstartManage//Client",szDocFileName, szDocFile, "", TARGETDIR^"icon//client.ico" , 0 ,"" , REPLACE ); //为该文件创建快捷方式,快捷方式的显示名就是刚才获取的文件名
nResult = FindAllFiles(TARGETDIR^"Client", "*.exe", szDocFile, CONTINUE);//从上一个查找的位置继续向下查找,进行循环
if (FeatureIsItemSelected(MEDIA, szFeatureName3)=1) then
if(CopyFile(szSrcFile2, szTarFolder2)=0) then //那么把要拷贝的文件拷贝过去
//MessageBox("复制文档成功",INFORMATION);
nResult = FindAllFiles(TARGETDIR^"doc", "*.pdf", szDocFile, RESET); //对拷贝过去的文件进行查找,该函数会在第一个符合条件//的文件处停止
while (nResult = 0)
LongPathToQuote(szDocFile, TRUE );
//MessageBox(szDocFile,INFORMATION);
ParsePath (szDocFileName, szDocFile, FILENAME_ONLY);//对查找到的文件获取文件名
AddFolderIcon(FOLDER_PROGRAMS^"EstartManage//doc",szDocFileName, szDocFile, "", TARGETDIR^"icon//help.ico" , 0 ,"" , REPLACE ); //为该文件创建快捷方式,快捷方式的显示名就是刚才获取的文件名
nResult = FindAllFiles(TARGETDIR^"doc", "*.pdf", szDocFile, CONTINUE);//从上一个查找的位置继续向下查找,进行循环
CopyFile(SRCDIR^"README.TXT", TARGETDIR^"README.TXT");
if (FeatureIsItemSelected(MEDIA, szFeatureName1)=1) then
if !MAINTENANCE then
CreateDataBase(psvSQLsvr,psvSQLusr,psvSQLpwd); // 创建和 优化数据库
Disable(STATUSEX);
ShowObjWizardPages(NEXT);
bOpt1 = TRUE;
bOpt2 = TRUE;
szMsg1 = SdLoadString(IFX_SDFINISH_MSG1);
szTitle="";
szMsg1="";
szMsg2="";
szOption1="Show Readme";
szOption2="Create Shortcut on Desktop?";
SdFinishEx(szTitle, szMsg1, szMsg2, szOption1, szOption2, bOpt1, bOpt2);
if (bOpt1=TRUE) then
if(FindFile(TARGETDIR, "README.TXT", szDocFile)=0) then
LaunchApp ( WINDIR^"Notepad.exe" , TARGETDIR^"README.TXT" );
if(bOpt2=TRUE) then
if(bOpt2=TRUE) then
if (FeatureIsItemSelected(MEDIA, szFeatureName1)=1) then
szDocFile = TARGETDIR^"Server//EstartManage.exe";
if (FeatureIsItemSelected(MEDIA, szFeatureName2)=1) then
szDocFile = TARGETDIR^"Client//EstartManage.exe";
LongPathToQuote(szDocFile, TRUE );
if (FeatureIsItemSelected(MEDIA, szFeatureName1)=1) then
AddFolderIcon(FOLDER_DESKTOP, "EstartManage" , szDocFile, TARGETDIR^"Server" , TARGETDIR^"icon//server.ico" , 0 ,"" , REPLACE );
if (FeatureIsItemSelected(MEDIA, szFeatureName2)=1) then
AddFolderIcon(FOLDER_DESKTOP, "EstartManage" , szDocFile, TARGETDIR^"Client" , TARGETDIR^"icon//client.ico" , 0 ,"" , REPLACE );
//创建删除快捷方式
szfilename = UNINSTALL_STRING +" /UNINSTALL";
nResult = StrFind(szfilename,".exe");
if nResult &=0 then
StrSub(szmsg1,szfilename,0,nResult + 4);
StrSub(szmsg2,szfilename,nResult + 4,200);
LongPathToQuote(szmsg1, FALSE );
LongPathToQuote(szmsg2, FALSE );
szfilename = "/"" + szmsg1 + "/"" +szmsg2;
AddFolderIcon(FOLDER_PROGRAMS^"EstartManage","Uninstall",szfilename,WINDIR,TARGETDIR^"icon//client.ico",0,"",REPLACE);
//---------------------------------------------------------------------------
// The OnEnd event is called at the end of the setup. This event is not
// called if the setup is aborted.
//---------------------------------------------------------------------------
function OnEnd()
STRING szFeatureN
STRING serviceT
STRING szDocF
//这个服务所需的文件只有在钩选了某feature时候才会被拷贝,
//并且也只有在用户钩选安装了此feature时候才会在安装结束时安装此服务,因此首要判断是否选择了此feature,然后寻找到该执行文件,并且进行安装
//szFeatureName="Tool";
//serviceTarget=TARGETDIR^"Tool//Lib//DBAdmin.exe";
//if (FeatureIsItemSelected(MEDIA, szFeatureName)=1) then
//if(FindFile(TARGETDIR^"Tool//Lib", "DBAdmin.exe", szDocFile)=0) then
//if (LaunchApp (serviceTarget, "") & 0) then
//MessageBox ("Unable to launch "+serviceTarget+".", SEVERE);
解释部分:
a、首先定义了一些局部变量
&&&&&&&&&&& STRING psvSQLsvr, psvSQLusr, psvSQL&&&&&&&&&&& BOOL bvWindowsL
因为本安装程序需要sql server数据库的支持,所以以上全局变量用来保存连接数据库信息
b、申明自定义函数
&&&&&&&&&&& prototype number CreateDataBase(STRING,STRING,STRING);&&//创建数据库&&&&&&&&&&& prototype number SQLLogin(); //定义登录函数
c、函数OnBegin中
&&&&&&&&&&& if(!MAINTENANCE)then &&&&&&&&&&&&&&&&&&&& SdLicense2 ("License", "", "", SUPPORTDIR ^ "license.txt", FALSE); &&&&&&&&&&&
用来显示软件的协议,其中license.txt添加到SupportFile中,操作Behavior And Logic-&Support Files/BillBoards,在SupportFiles下的第一个Language Independent右边插入license.txt
利用注册表检测软件依赖的环境是否安装
&&&&&&&&&& RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);&&//设置注册表根&&&&&&&&&& if (RegDBKeyExist ("SOFTWARE//Microsoft//.NETFramework") & 0) then //判断注册表项是否存在&&&&&&&&&&&&&&&& if(LaunchAppAndWait (SRCDIR^"dotnetfx20.exe","", LAAW_OPTION_WAIT)&0)then&//运行程序&&&&&&&&&&&&&&&&&&&&&&& MessageBox ("You haven't installed dotnet framework yet! ", INFORMATION);& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
d、函数OnFirstUIBefore中
&&&&&&&&&&&if (FeatureIsItemSelected(MEDIA, "Server")=1) then
判断是否选择安装服务器,这里跟前面设置的feature相关,其中&Server&就是feature的名字
&&&&&&&&& nResult = SQLLogin();
调用自定义函数SQLLogin
&&&&&&&&& listStartCopy = ListCreate( STRINGLIST );
&&&&&&&&& ListAddString(listStartCopy,"Customer Information:",AFTER);
往列表中添加信息
&&&&&&&& nResult = SdStartCopy( szTitle, szMsg,listStartCopy);&&&
根据开始拷贝需要的文件&&&&&&&&&ListDestroy(listStartCopy);
e、在函数OnFirstUIAfter中
我们这里的文件拷贝都放在此函数中,根据选择安装的feature动态的拷贝所需文件
&&&&&&&& CopyFile(szSrcFile5, TARGETDIR^"icon//*.*"); //拷贝目录下的文件
&&&&&&&& RegDBSetKeyValueEx(szKey, "VALUE1", REGDB_STRING, "wHpb9E6JNaQ=", -1);& //写注册表
&&&&&&&& FindAllFiles(TARGETDIR^"Server", "*.exe", szDocFile, RESET);& //查找目录下的文件
&&&&&&&& AddFolderIcon(FOLDER_PROGRAMS^"EstartManage//Server",szDocFileName, szDocFile, "", TARGETDIR^"icon//server.ico" , 0 ,"" , REPLACE );& //添加快捷方式
&&&&&&&& CreateDataBase(psvSQLsvr,psvSQLusr,psvSQLpwd); // 调用自定义函数,创建和 优化数据库&&&&&&&& SdFinishEx(szTitle, szMsg1, szMsg2, szOption1, szOption2, bOpt1, bOpt2); //显示复选框
&&&&&&&& LaunchApp ( WINDIR^"Notepad.exe" , TARGETDIR^"README.TXT" ); //显示readme文件
然后就是创建卸载快捷方式
脚本中还涉及到多种目录的表示方式,具体理解请参考代码
a、可以在User Interface下的Dialogs下的Skins设置安装界面的样式
b、选择工具栏中的光标图标制作光盘
好了,制作安装包的过程就差不多这些。文中基本涉及到制作安装的所有基本知识了,如果需要深入,请网上找资料吧。感谢很多网友提供的学习资料。希望对你有所帮助,如有任何疑问或者错误欢迎交流
&&&&&&&&&&
排名:第4538名
(10)(1)(11)(10)(0)(8)(2)(40)(10)(2)(4)(11)(1)(18)(6)(3)(3)(4)(3)(14)(6)(2)(3)(3)(1)(1)(3)(0)}

我要回帖

更多关于 ui插件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信