4、Event Window 窗体事件1)MAIN 主窗体
——例4.1.1 Load 加载
$style(%_id%,clear,thickframe:on)
$bgcolor(%_id%,0-0-0)
$transwindow(%_id%,alpha:%AtW_body_trans%)
解说:
第一句,窗体风格,仅保留可拖拉边框。(末项参考可以换dlgframe:on看看,也可以去掉看看,只Clear也许正好满您的意。如果在这on上设变量,是否去边框也就由得自己调拨了。)想立马看看结果?又去Run?不要去Run了,请右击窗体未被覆盖处,点击Refresh刷新。
第二句,设定窗口底色为纯黑。(为什么要纯黑?愿意思考吗)
第三句,给整个窗体一个透明变量。这样就能调整窗体对桌面的透明度。(后面我们会看到还有一种透明方式,即窗体对窗体的透明。扩而小之,还有面板的透明、控件的透明、图形图像的透明、文本的透明……总之是对象的透明。)
//--bg & menu--
$clearobject(%_id%,event:load)
$if($files([%AtW_bg_image%]),,$hash(AtW_bg_image,/images\AtWill\bg00.jpg))
$gp_image(%_id%,%AtW_bg_image%,0,0,%_cwidth%,%_cheight%,cache:false,alpha:%AtW_bg_trans%)
$gp_image(%_id%,/images\AtWill\menu.png,$calc(0.69*%_cwidth%),$calc(0.92*%_cheight%),170,16,keepaspect:false,cache:false,alpha:$if($strcmp(%AtW_bg_trans%,85),25,$calc(%AtW_bg_trans%-95)))
$gp_image(%_id%,/images\AtWill\menuR.png,$calc(0.69*%_cwidth%),$calc(0.96*%_cheight%),170,16,keepaspect:false,cache:false,alpha:$if($strcmp(%AtW_bg_trans%,85),25,$calc(%AtW_bg_trans%-115)))
解说:
第一句,清除窗体原有对象。(若不设背景更换,且将无对象更新,这一句可去除。)
第二段,在整个窗体上画一幅背景。开头一句是设一个缺省图。(注意一下%_cwidth%与%_width%的区别。)
第三段,于窗体右下角加一条菜单位置提示图,同时做一个真倒影效果。
所有图片都赋予透明参数的变量,可以反调窗体的黑底来调节明暗度。以便更广泛地对付不同的背景图,同时也使得在夜间聆听与白昼欣赏有适应心境的光亮度选择。
本例背景没有变动尺寸的需要,如果个人需要调整窗体尺寸,则应考虑将这些代码转移到后面将介绍的Resize中,当然在Resize中给定一条反过来刷新Load的命令也可能是一种方法。
问:既然如此,为何不干脆写在Resize中?
答:随机应变。写在Resize不是什么坏处都没有的。待到Resize那看看再说。
需要注意的是,
keepaspect:false 参数可以为真,但不能没有。不过先前的版本没有这么严格。这个参数应该算受重视的,以后在封面窗体上将进一步体现。
cache:false 参数值为假,也就关闭了Cache。你应该与封面窗体的相同语句比较一下(你看,不合时宜这不,封面窗体远在后边。所谓言之过早)。然后想想它们为什么要不同?开动脑筋了吧?
其实早就该开了。或者说你早开了,只是我无从知道。现在我晓得了嘞,我知道往后该少点解释,多点提示,多点提问,直到提示提问也越来越少甚至最终没有了。
<写到这,Foobar2000中国社区发生了重大事件。Asion终于出手汉化FUI组件。neonasahi在翻译日文文档的过程中提出统一汉化称谓的问题。neonasahi的汉化文档与Asion的汉化组件,这样说不对,应当说Asion与neonasahi共同在汉化FUI组件(因为这些文档在FUI组件中是不可分割的)。这是FUI在中国社区中的一件标志性的事件。我隐隐感觉FUI的春天就在来临。心里暖洋洋的。
至此,我觉得这个教程需要重新思考一下,先前是照着原版来写,往下呢?跟进中文版写?那么前面的呢?我的表达与他们不一致的地方怎么来处理?因为我们的一致服务对象是同一个用家。我们不能各行已道,把困扰留给用家。所以,我们也在一起商量这个事情。
再说,我也该当反思一下,这样写对大家有用吗?会不会是反作用?一开始想写教程,但从现在看,由于
采用gdzqj88等朋友的建议加强对实例的分析并致使其内容太重,已经不知不觉演变为写讲义了。
我想呀,不管叫什么,其实叫什么都无所谓。只要对读者有益,有实际帮助就好。
如果正好读到这,不论下面的内容是否已经推出,请稍作停顿,也停一停,想一想。怎么让自己的时间不被白读了?怎么提高阅读效益?>
//--panel--
$panel(%_id%,QUICK_SEARCH_TOOLBAR,$calc(0.46*%_cwidth%),$calc(0.92*%_cheight%),$calc(0.22*%_cwidth%),22,hide)
$panel(%_id%,LYRIC_SHOW,$calc(0.12*%_cwidth%),$calc(0.06*%_cheight%),$calc(0.37*%_cwidth%),$calc(0.46*%_cheight%),hide)
$panel(%_id%,ELPLAYLIST,$calc(0.12*%_cwidth%),$calc(0.04*%_cheight%),$calc(0.56*%_cwidth%),$calc(0.86*%_cheight%))
$updatewindow(%_id%,load)
//-- embed --
$window(RATINGEX,0,0,$calc(0.12*%_cwidth%),$calc(0.84*%_cheight%),parent:%_id%,embed:true)
$window(ALBUMART,$calc(0.69*%_cwidth%),$calc(0.07*%_cheight%),$calc(0.31*%_cwidth%+10),$calc(0.65*%_cwidth%),parent:%mainid%,embed:true,hide)
$window(ARTIST,6,$calc(%_cheight%-55),40,55,parent:%_id%,embed:true)
$window(TREE2,$calc(0.69*%_cwidth%),0,$calc(51*%_cwidth%),$calc(0.92*%_cheight%),parent:%_id%,embed:true)
$window(TEXT,$calc(0.45*%_cwidth%),0,$calc(0.53*%_cwidth%),$calc(0.92*%_cheight%),parent:%mainid%,embed:true,hide)
解说:
我们先不说这些板啊,这些窗体。
请先比较一下,前后两组语句的写法。这样:
$panel(windowid,panelid,x,y,w,h[,options...])
$window(windowid[,x,y,w,h][,options...])
相差在两个地方,上多一个panelid,下多一个[]。仅此而已。为什么?想想愿意吗?它们为什么要不同?它们为什么可以不同?
其实,这个时候,我们已经可以把FUI的全部函数都给归纳一下,
记得在新音轨事件中见过:
$gp_text(TREE2,$repeat($char(90) ,%rating_album%),0,0,$calc(0.31*$w(%mainid%,_cwidth%)),$calc(0.04*$w(TREE2,_cheight%)),brush:11-128-128-255,pen:31-128-128-255-1,font-name:Wingdings,glow:100-200-255-1-1,halign:center,font-size:10,shadow:righttop-1-1)
好长啊,其实它的写法只是:
$gp_text(windowid,text,x,y[,w,h][,options...])
再看
$gp_image(windowid,filename,x,y[,w,h][,options...])
$drawtext(windowid,text,x,y,w,h[,options...])
……
太像了吧?就是
$函数名(窗体户口簿名,对象,位置与尺寸,选项)
这个选项个别变种加强为(TF,选项)。
一种了,
还有
$函数名(对象名,位置与尺寸,选项)
$函数名(新函数名,旧函数或变量或常量)
$函数名(窗体户口簿名,动作名,函数或变量或常量)
$函数名(对象,函数或变量或常量)
差不多就这五种了。我说差不多的。你尽可以把见过的函数翻出来对较对较,也可以拿着这五种写法到后面的每一个函数去校验校验。
面对繁杂,我们需要总结归纳,面对简单,我们需要解剖分析。苟能此,也就能举重若轻、宠辱不惊。
话说至此,再回头问上述面板与窗体语句,还有什么值得再说呢?
真没什么再说的了啦。
一定要挤的话,就请注意一下它们的Hide与否,Embed与否。
——看图想代码(不然,缩小一下范围:
其一,对照本例从头的代码每句下来,看看体现在哪里。
其二,上溯,不必上溯几千年,只要上一事件就行。
其三,自己扩大范围。
)

——例4.1.2 Resize 重置尺寸
$clearobject(%_id%,event:resize)
解说:
清除本页中的全部内容。event:resize在Resize页就是本页。记得本市的例子吧。这又一种了。
//--art--
$if($strcmp(%AtW_artist_state%,no_embed)
,,
$if($strcmp(%AtW_artist_size%,s_mall)
,$movewindow(ARTIST,6,$calc(0.845*%_cheight%),$calc(0.135*%_cheight%),$calc(0.155*%_cheight%),activate:false)
,$if($strcmp(%AtW_artist_size%,l_arge)
,$movewindow(ARTIST,$calc(0.12*%_cwidth%),$calc(0.25*%_cheight%),$calc(0.33*%_cwidth%),$calc(0.75*%_cheight%),activate:false)
,$if($strcmp(%AtW_artist_size%,b_ig)
,$movewindow(ARTIST,$calc(0.12*%_cwidth%),$calc(0.68*%_cheight%),$calc(0.35*%_cwidth%),$calc(0.32*%_cheight%),activate:false)
)))
)
$if($strcmp(%AtW_albumArt_size%,l_arge)
,$movewindow(ALBUMART,$calc(0.13*%_cwidth%),0,$calc(0.56*%_cwidth%),$calc(0.91*%_cheight%))
,$if($strcmp(%AtW_albumArt_size%,s_mall)
,$movewindow(ALBUMART,$calc(0.001*%_cwidth%),$calc(0.88*%_cheight%),$calc(0.07*%_cwidth%),$calc(0.07*%_cwidth%))
,$movewindow(ALBUMART,$calc(0.49*%_cwidth%),$calc(0.06*%_cheight%),$calc(0.50*%_cwidth%),$calc(0.70*%_cheight%))
))
$if($strcmp(%AtW_albumArt_size%,l_arge)
,
$showpanel(LYRIC_SHOW,false)
$showwindow(TEXT,0)
$movewindow(RATINGEX,$calc(0.81*%_cwidth%),0)
$updatewindow(RATINGEX,event:resize)
,
$movewindow(RATINGEX,0,0)
$updatewindow(RATINGEX,event:resize)
$if($ispanelvisible(ELPLAYLIST)
,$showpanel(LYRIC_SHOW,false)
$showwindow(TEXT,0)
,$if($strcmp(%AtW_text_state%,a_uto)
,$if($strcmp(%AtW_artist_size%,b_ig)
,$showpanel(LYRIC_SHOW,true)$mainmenu_execute('View/Lyric Show/Refresh')
$showwindow(TEXT,0)
,$if($strcmp(%AtW_artist_size%,l_arge)
,$showpanel(LYRIC_SHOW,false)
$showwindow(TEXT,1)$updatewindow(TEXT,event:resize)
)))
))
解说:
大嵌套套小嵌套的用法。
第一段,专讲艺术家图片,在其在作为子窗体的时候,跟随自身尺码的变化而转移位置。在其作为独立窗体的时候(记得我们的规划有个悬浮窗),这里管不着,那就交给其他方面去处理。
第二段,专讲封面,当其尺码变化时,位置也相应地改变。
第三段,当封面或艺术家图片在某种尺码下,相应的其他音轨信息(基本信息、分级信息、歌词、艺术家与专辑扩展信息)跟随变化位置。同时,自动显示或隐藏。而是否自动隐藏,也设置了一个开关。原本有多项关联,当前的情况就只剩下一个歌词秀了。
这个例子,不象前一例Load中的语句在窗体上有直接的表现。也就是说它是人的话,可不再是什么都写在脸上的人,而是颇有城府的了。这城府有些还来自于Load这个心直口快的人。
所以,这三段尤其第三段理解起来也相对比较困难一些。现在可以试着解读。但当全面完工投入使用,回头再来理解,它城府再深也是可以看清真面目的。所谓事久见人心呗。所谓读万卷书行千里路呗。
注意,
$strcmp(%AtW_text_state%,a_uto)这样的句式不少。这是比较字符串的TF,这例只要%AtW_text_state%就够了,因为该变量其值只剩有与空两种情况。而$strcmp(%AtW_artist_size%,s_mall)之类的就不好再有其他的简化。
比较两个函数的用法
$showpanel()
$showwindow()
移动窗体函数带activate:false参数。这个参数是不想让被移动的对象获取焦点。
最后一段,在移动窗体或显示面板之后,多有进一步的附加处理,可以思考一下,它们干嘛咧?画蛇添足吗?
思考下下,Resize中代码与Load中代码的关系?它们为什么不写在一起?
// $updatewindow(%_id%,event:resize)
解说:
当主窗体设置为可调整外尺寸时,本句应开启。本例无需。
——看图想代码好像也不必俟全面完工,现在就从我这先抓两张图,看看。想什么,别开小差喔。上次提醒,这次不了。
听流行——

听古典——

想专心一些些

——例4.1.3 Open 打开
$minmax(%_id%,640,360,640,360)
解说:
限制窗体尺码。有关用法请见工具箱中的函数页的窗体组中的该函数。
其实,FUI的函数对自身的释义、写法、用法、例子、补充说明等已经写得相当具体、好懂(就算不懂日语也足以猜个八九)。所以,本讲义一直以来都不太在这方面多费口舌。如今,函数文档已在汉化推进中。不久之后,更将水落石出。我真有点后悔,为啥不等有中文文档再开始写,再开始应用FUI啊。
以下代码供预习,下次更新再解说。
可以给自己提一些问题,然后自己解答。
可以带着自己的需求,然后问,这个可以用在我那吗?其实早就可以不停地这般地问。要本着自己的需求去学习,学以致用。
$map(%_id%,lbuttondblclk:'$ifequal(%playback_isplaying%,1,$mainmenu_execute('Playback/Play or Pause'),$mainmenu_execute('Playback/Play'))')
$map_rect(%_result%,$calc(0.12*%_cwidth%),0,$calc(0.88*%_cwidth%),$calc(0.92*%_cheight%))
$map(%_id%,lbuttondown:'$hash(AtW_albumArt_size,)$updatewindow(MAIN,resize)')
$map_rect(%_result%,0,0,$calc(0.12*%_cwidth%),$calc(0.80*%_cheight%))
$map(%_id%,lbuttonup:'
$if($strcmp(%AtW_tree_state%,s_how)
,$hash(AtW_tree_state,)$hash(AtW_albumArt_size,l_arge)$hash(AtW_artist_size,s_mall)$showwindow(ALBUMART,1)$showpanel(ELPLAYLIST,false)$showwindow(TREE2,0)
,$if($strcmp(%AtW_albumArt_size%,l_arge)
,$hash(AtW_albumArt_size,b_ig)$hash(AtW_artist_size,b_ig)
,$hash(AtW_albumArt_size,l_arge)$hash(AtW_artist_size,s_mall)
))$updatewindow(MAIN,event:resize)
')
$map_rect(%_result%,$calc(0.12*%_cwidth%),$calc(0.92*%_cheight%),$calc(0.57*%_cwidth%),$calc(0.08*%_cheight%))
//--show/hide tree2--
$map(%_id%,lbuttondown:'
$if($strcmp(%AtW_tree_state%,s_how)
,$hash(AtW_tree_state,)$hash(AtW_albumArt_size,b_ig)$hash(AtW_artist_size,b_ig)$showwindow(ALBUMART,1)$showpanel(ELPLAYLIST,false)$showwindow(TREE2,0)
,$hash(AtW_tree_state,s_how)$showpanel(ELPLAYLIST,true)$hash(AtW_albumArt_size,s_mall)$hash(AtW_artist_size,s_mall)$showwindow(ALBUMART,0)$showwindow(TREE2,1)
)$updatewindow(MAIN,event:resize)
')
$map_rect(%_result%,0,$calc(0.82*%_cheight%),$calc(0.1*%_cwidth%),$calc(0.18*%_cheight%))
//--menu--
$hash(ax,$calc(0.69*%_cwidth%))
$hash(ay,$calc(0.90*%_cheight%))
$hash(bw,26)
$hash(bh,40)
$for(i,0,5,1,'
$puts(tip0_text,Help & Expand)
$puts(tip1_text,Set Background)
$puts(tip2_text,Set Layout)
$puts(tip3_text,Image & Text)
$puts(tip4_text,Playlist Switcher)
$puts(tip5_text,Make Item)
$tooltip(%_id%,$get(tip%i%_text),$calc(%ax%+%bw%*%i%),%ay%,%bw%,%bh%,font-name:Nyala,font-size:19)
$map(%mainid%,lbuttondown:\"$popupmenu_view(popup_\"%i%\")\")
$map_rect(%_result%,$calc(%ax%+%bw%*%i%),%ay%,%bw%,%bh%)
',escape:true)
$tooltip(%_id%,Open/Close Searcher,$calc(%ax%+%bw%*6),%ay%,%bw%,%bh%,font-name:Nyala,font-size:19)
$map(%mainid%,lbuttondown:'$if($ispanelvisible(QUICK_SEARCH_TOOLBAR),$showpanel(QUICK_SEARCH_TOOLBAR,false),$showpanel(QUICK_SEARCH_TOOLBAR,true))')
$map_rect(%_result%,$calc(%ax%+%bw%*6),%ay%,%bw%,%bh%)
$if($strcmp(%AtW_start_state%,p_lay),$playback_control(play),)