yu_fei_527 发表于 2013-12-1 20:54:10

litestep里IF语句的简单介绍

不小心又把SM君以前的视频教程看了一遍,真的感觉很有爱,于是想写点东西,这些东西在模块和litestep的readme里都一带而过,很多东西我也是摸索和揣测,可能会有错误。

对有点计算机语言基础的人应该有点用,即使没接触过计算机语言也没关系,因为真的很简单,我也尽量用通俗的语言去解释,一看就懂。

litestep的编写(不包括Lslua),算不得一种语言,充其量是别人编写好dll后留出公共接口给我们的应用,我们只要了解和阅读那些白话化的命令就好了,但它实际上与c又有着千丝万缕的联系,书写时尽量遵循c的风格和规范,如果要写稍微复杂些的主题,一些基本的东西应该要了解,比如算术运算,逻辑运算,关系运算,转义符的使用,和简单的HTML语言。我们这里稍微说一下IF的使用,Litestep里(不包括Lslua)好像也只有IF 这个条件语句了,switch,while,for语句应该没有,一般人做主题也范不着太复杂,做复杂的都直接用lua了。

Litestep里的IF语句有4种格式,IF---Endif ,IF---Else---Endif,IF---Elseif---Endif,IF---Elseif---Elseif--.......Endif.和c不同,这里的IF和ENDif一定是配对出现的,可以嵌套,可以用goto,但是不建议用,goto是把双轫剑,用得不好容易破坏结构。
IF里的条件表达式可以用关系运算符,比如c里是&&和||,litestep里是and和or。
-==================================================
if globalTime = true
ClockText                "<FontSize=30></Font><FontSize=17></Font>"
elseif globalTime = false
ClockText                "<FontSize=30></Font> "
endif
这里定义了一个时间标签,clock是个显示时间的label(button),litestep里标签和按钮并没有明显的界限,我认为可以做点击动作的就是button,只显示信息不定义动作的就是label。globalTime是个自定义好的变量(严格来说是常量,类似于c的#define),它自定义了true和false两种值,注意这里的值是ASCII值,即使定义为数字它也是ASCII值,不好做算术运算的。<FontSize=30></Font>这样的是不是眼熟?label的text显示是可以直接用HTML语言和转义符的,也就是说只要是文本,颜色,大小,字体,回车换行,空格,可以在一行里就能很简单的定义了。

litestep对自定义变量很宽松,c里面要求对变量要先定义后使用,LS里好像没有这种问题,因为在这段代码后面再去定义globalTime,加载和使用的时候也是没问题的。但最好还是遵循c的语法规范来使用。

整段话的意思是:如果globalTime值为true,那么clock这个按钮就以30的字体大小显示时间,17的字体大小显示日期。如果globalTime值为false,那么clock这个按钮就以30的字体大小显示时间,clockfonthight定义的字体大小显示日期。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

这里还有一个涉及IF的简单说明用法:传送门


-================================================
再举个完整些的例子吧。之前做了个litestep主题 ,名叫定格。。传送门
它的桌面壁纸变换,各部件伸缩,各部件素材的变换,都用到了IF。这里只截取其中小段以做说明,语句前有分号的语句是无效的。
if styleon=0
xTaskbarImage                        taskbarBackground1.png
elseif styleon=1
xTaskbarImage                        taskbarBackground.png
endif

if styleon=0
;ControlOnleftClickup !blue
ControlOnleftClickup!execute      [!xTextSaveEvar @$ConfigDir$themevars.rc@ @styleon@ @1@][!WallPaper .center"$WallpaperDir$asd121.jpg"][!wallpaper .change][!refresh]
*WallPaper .center "$WallpaperDir$1456.jpg"
elseif styleon=1
;ControlOnleftClickup !black
ControlOnleftClickup !execute      [!xTextSaveEvar @$ConfigDir$themevars.rc@ @styleon@ @0@][!WallPaper .center "$WallpaperDir$1456.jpg"][!wallpaper .change][!refresh]
*WallPaper .center "$WallpaperDir$asd121.jpg"
endif

整段的意思是:如果styleon这个自定义的变量值当前为0,左键点击control这个label时,就把styleon的值置为1,壁纸换为asd121.jpg,任务栏的背景图换为taskbarBackground.png。
如果styleon这个自定义的变量值当前为1,左键点击control这个label时,就把styleon的值置为0,壁纸换为1456.jpg,任务栏的背景图换为taskbarBackground1.png。


当然任务栏的背景图变换不用IF也可以,我们可以用它自己的bang命令,!xTaskbarrefresh xTaskbar xTaskbarimage "$ThemeDir$th\images\taskbarBackground1.png"把这一句写到点击control这个label的动作里就可以了。


这段代码里至少用到了4个模块,xtaskbar,xtextedit,xlabel,lswchanger,具体的命令要去了解这些模块的readme 了,这是玩LS的基础。
=-----------------------------------------------------
总之,如果只需要做个漂亮的界面的话,比如各模块的搭配,堆叠,调整,是非常简单的,不需要任何基础;但是要做复杂的效果甚至人机交互的图形界面,还是需要些计算机知识的。另外在阅读LS和各模块的readme时,多看多想。
再举个简单的例子吧,比如group,我给它的定义是相同属性和行为的集合。
xxxWidth295
xxxHeight83
xxxWindowzOrder
xxxBehindWindow xLabel runDialogBox
xxxAlwaysOnTop
xxxStartHidden

label1addtogroup xxx
label2addtogroup xxx
label3addtogroup xxx
label4addtogroup xxx
这段的意思:前面一小段定义了xxx这个group的一些属性,是不是有些像c的struct或c++的class的意味?那么后一小段的label1,label2,label3,label4只用一行代码就有了xxx的这些属性,是不是有些继承的意味?而在之后要写的代码里,label1,label2,label3,label4也可以写出它们自己的行为和属性,是不是有了些派生的意味?

readme里提供的命令都是死的,我们玩的时候一定要灵活运用,也就是通常所说的算法。比如传送门,为了实现拖控时音量的调整的多少,就将handle这个label的X位置移动多少与音量挂钩。

语笑嫣然 发表于 2013-12-1 21:24:31

许久不见O(∩_∩)O
没看懂,但是对于玩LS的同学应该是非常有用的分享

tangxiaosi01 发表于 2015-1-8 12:25:49

太长了,没耐心看完。。。。。。。。。。。。

言栎熙 发表于 2015-1-16 21:30:12

好难懂的样子

argo0210 发表于 2015-4-20 23:33:03

又扩宽鸟偶的知识
页: [1]
查看完整版本: litestep里IF语句的简单介绍