幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!
。。。不造为毛格式变成那样,坛主将就着测试吧
再来~这次符合主题了
f1::
KCLable("F1", f1func_dict, ["消息1", "消息2", "消息3", "消息4", "消息5"])
return
消息1:
消息2:
消息3:
消息4:
消息5:
MsgBox, % A_ThisLabel
return
/*
功能描述:
短击设定按键显示功能项目
长按选择功能
超时退出
主函数:
KCLable() __ Key Chose Lable
参1:keyname_str 待激活的按键,为字符串
参2:choscount_dict 设定用以统计列表功能选择次数的字典,酌情舍去
参3:lablefunc_strlist 选择标签的列表,为字符串列表
参4:waitsec_int 超时未切换或未选择退出,单位为妙,可为浮点数, 默认值2
参5:chosgototm_int 长按选择功能时间,单位毫秒, 默认值300
其他:无返回值
子函数:
1.LsToStr(lablefunc_list, focusline_int) : 不可复用,将列表转换为行格式的多行字符串返回,用于tooltip
2.NMsecSubt(tmlsA, tmlsB): 可复用,以列表方式时间计算函数,计算系统时间差,用以判断按键按击时间
3.sortDicToLs(thels, byref __diccount): 修改后可复用,将字典键的值以从大到小顺序排列为列表,输出该列表
4.varInlist(var, ls): 可复用,判断值是否在列表中
*/
KCLable(keyname_str, ByRef choscount_dict,lablefunc_strlist, waitsec_int := 1, chosgototm_int := 200) { ;主函数
foucs_int := 1 ;每次按键初始焦点位置
;*** 功能选择次数统计点1 ***
lablefunc_strlist := sortDicToLs(lablefunc_strlist, choscount_dict)
ToolTip, % LsToStr(lablefunc_strlist, foucs_int)
keywait, % keyname_str
loop {
KeyWait, % keyname_str, % "DT" waitsec_int
if (ErrorLevel) {
tooltip
break
}
else {
__noww := [A_Now, A_MSec]
keywait, % keyname_str
;长按时选择功能后退出
__gotsince := [A_Now, A_MSec]
__gotPE := NMsecSubt(__gotsince, __noww)
if (__gotPE >= chosgototm_int) {
gosub, % lablefunc_strlist[foucs_int]
;*** 功能选择次数统计点2 ***
choscount_dict[lablefunc_strlist[foucs_int]] += 1
tooltip
; 此处完成功能,计数标签功能选择次数并排序
break
}
;短按切换焦点
else {
foucs_int += 1
if (foucs_int > lablefunc_strlist.MaxIndex())
foucs_int := 1
ToolTip, % LsToStr(lablefunc_strlist, foucs_int)
}
}
}
}
LsToStr(lablefunc_list, focusline_int) { ;将列表设置为某种格式
rt_str =
for i in lablefunc_list
{
;首行
if (i == 1) {
if (i == focusline_int)
rt_str := % "> " lablefunc_list[i]
else
rt_str := % " " lablefunc_list[i]
}
;非首行
else {
if (i == focusline_int)
rt_str := % rt_str "n> " lablefunc_list[i]
else
rt_str := % rt_str "n " lablefunc_list[i]
}
}
return rt_str
}
NMsecSubt(tmlsA, tmlsB) { ;计算两时间点列表值的差,返回单位毫秒
subSVar := tmlsA[1]
subSVar -= tmlsB[1], s ;两数相减的秒数
if (subVar != 0)
return % (subSVar * 1000) + (tmlsA[2] - tmlsB[2])
else
return % (tmlsA[2] - tmlsB[2])
}
sortDicToLs(thels, byref __diccount) { ;将字典键的值以从大到小顺序排列为列表,输出该列表
for i in __diccount
i := i
if (!i) { ;字典为空,创建字典
__diccount := {}
for i in thels
__diccount.Insert(thels[i], 0)
newls := thels
}
else { ;字典不为空,根据字典值,升序排列
maxit :=
newls := []
for thei in thels
{
;寻找字典中的最大值
maxit := 0 ;最大值初始
for keyName in __diccount
{
iF !varInlist(keyName, newls)
{
if (!maxit)
maxit := __diccount[keyName]
if (__diccount[keyName] > maxit)
maxit := __diccount[keyName]
}
}
;寻找字典中的最大值的首位键
for theindex in thels
{
nowlsindex := thels[theindex]
if !varInlist(nowlsindex, newls) ;当前循环到的值不在新列表中
{
TT := thels[theindex]
if (__diccount[TT] == maxit)
{
maxkey := thels[theindex]
break
}
}
}
newls.Insert(maxkey)
}
}
return newls
}
varInlist(var, ls) {
for i in ls
{
if (ls[i] == var)
return 1
}
return 0
}
额..果然0.0不好意思,没看清题目
。。。参考代码是没有,就是文档翻晕了。。这个进度条长度计算没有什么难度,以前写游戏脚本用过A_now -= 这样计时,sleep有点尴尬,但是短时内的计时有Msec这样的缺陷我是早发现了,近期是喜欢上list数组列表,刚好练练手也解决一个早期的未了目标什么的。。。
目测少了一大段。。。是不是论坛bug
用鼠标中键选择剪切板内容,linenum 变量初始为5....写完看上去可以用来做库函数示例的复制黏贴
#NoEnv
#SingleInstance FORCE
#Persistent
CoordMode, tooltip, screen
;testFilepath = % A_ScriptDir "\" lineList.txt ;测试文件名称
testFilepath := % A_ScriptFullPath ;*****以本脚本内容为例,可更改
global linenum := 20 ;*****设定显示行数,决定焦点位置,可以更改
global cliplist := FlLiToList(testFilepath) ;创建粘粘列表
global maxIlength := StrLen(cliplist.MaxIndex()) ;列表极限数量字符长度
global FocusLine := 1 ;初始关注焦点
global showway := % (!Mod(linenum, 2)) ? (Floor(linenum / 2)) : Ceil(linenum / 2) ;focusline显示位置
infofresh := 80 ;信息刷新时间间隔
keyfocusgetsleep := 20 ;按键切换功能休眠时间
return
MButton::
if (show1 := !show1) {
SetTimer, tooltip, % show1 ? infofresh : ("off")
show2 := 1
}
else
ToolTip
return
#if show1
;ctrl + 上键 焦点前移
WheelUp::
FocusLine -= 1 ;关注焦点上移,对应序号往前
if (FocusLine = cliplist.MaxIndex())
FocusLine := 1 ;至顶部
cliptex := % cliplist[FocusLine]
clip_change(cliptex)
sleep % keyfocusgetsleep
return
;tooltip显示排版
tooltip:
if (show2 != 1) { ;刚切换模式时
tooltex := maketoollist()
if (extext = tooltex) ;若上一次显示的内容与此次 相同,不显示ToolTip,解决闪屏
return
}
show2 = 2
if cliplist.MaxIndex() { ;若列表不为空,显示排版
;若上一次显示的内容与此次 相同,不显示ToolTip
ToolTip, % tooltex, 0, 0
WinSet, TransColor, Color [N], WinTitle
extext := tooltex
}
else
ToolTip, [黏贴列表为空], 0, 0
return
maketoollist() { ;设定tooltip排版
rtTex := 0
;1.列表小于linenum数时,列表不增不减,关注焦点为focusline
if (cliplist.MaxIndex() <= linenum) { ;设定显示行数大于列表数量时,随focusline焦点
for i in cliplist
{
foc := i
if (i = 1) && (FocusLine = 1)
rtTex := % preCHO(foc) cliplist[foc]
else if (i != 1) && (FocusLine = 1)
rtTex := % rtTex "`n" preBLK(foc) cliplist[foc]
else if (i != 1) && (i = FocusLine)
rtTex := % rtTex "`n" preCHO(foc) cliplist[foc]
}
}
;2.showway以上或以下小于裁剪数量时,分别增量反方向的行数
else if (FocusLine (!Mod(linenum, 2) ? (cliplist.MaxIndex() - showway) : (cliplist.MaxIndex() - showway))) {
loop, % cliplist.MaxIndex() - FocusLine + showway
{
foc := % focusline - showway + A_Index
if A_Index = 1
rtTex := % preBLK(foc) cliplist[foc]
else if ((foc) = FocusLine)
rtTex := % rtTex "`n" preCHO(foc) cliplist[foc]
else
rtTex := % rtTex "`n" preBLK(foc) cliplist[foc]
if (foc) = cliplist.MaxIndex()
break
}
downtopnum := % linenum - (cliplist.MaxIndex() - (focusline - showway))
Loop, % downtopnum
{
rtTex := % rtTex "`n" preBLK(A_Index) cliplist[A_Index]
}
}
;3.正常显示方式,
else {
foc := % FocusLine - showway + 1
loop % linenum
{
if a_INDEX = 1
rtTex := % (FocusLine = 1) ? preCHO(foc) : preBLK(foc) cliplist[foc]
else
rtTex := % rtTex "`n" ((foc != FocusLine) ? preBLK(foc) : preCHO(foc)) cliplist[foc]
foc += 1
}
}
return % rtTex
}
;将字符串置入粘贴板
clip_change(to_clipboard)
{
Clipboard :=
Clipboard := % to_clipboard
ClipWait
}
preCHO(inchar) { ;前置显示选中
mid := % "> "
gotforlen := maxIlength - StrLen(inchar)
Loop %gotforlen%
Bfor := % Bfor "0"
return % Bfor inchar " |" mid
}
preBLK(inchar) { ;前置显示空白
mid := % " "
gotforlen := maxIlength - StrLen(inchar)
Loop %gotforlen%
Bfor := % Bfor "0"
return % Bfor inchar " |" mid
}
FlLiToList(filelongpath) { ;将true每行内容写入列表,返回列表
Array1 := []
loop, read, % filelongpath
{
if A_LoopReadLine
Array1.Insert(A_LoopReadLine)
}
if !Array1.MaxIndex()
return 0
else
return % Array1
}
Gui, Add, Progress, x-1 y-1 w300 h27 c293d3f Backgroundf6f8da vMyProgress
改了下第四行,看上去更符合逻辑哈。。
第八行注释有误,是[每毫秒]
GUI, -sysmenu +AlwaysOnTop -caption +Border
gui,font, cf6f8da s12, Consolas
Gui, Add, text, x301 y2 w300 h25 vmytex, :0
Gui, Add, Progress, x0 y0 w300 h25 cf6f8da Background293d3f vMyProgress
GuiControl,, MyProgress, 0
;获取倒计时间隔秒数
inputbox, waitingSec, 输入等待时间`,单位为秒
;每秒所占的像素单位长度
perMSecWide := 100 / waitingSec / 1000
;记录开始时间
startTNow := A_Now
startTMSec := A_MSec
startT := [startTNow, startTMSec]
;计算结束时间
startTNow += waitingSec, s
stopT := [startTNow, startTMSec] ;结束时间0
;显示进度条
gui, COLOR, 293d3f
gui, show, x100 y20 w390 h25
;计算改变进度条
loop {
noww := [A_Now, A_MSec]
wide := Floor(NMsecSubt(noww, startT) * 1000 * perMSecWide)
if (NMsecSubt(noww, stopT) &lt; 0) {
GuiControl, , MyProgress, % wide
ttttt := % NMsecSubt(stopT, noww)
StringTrimRight, ttttt, ttttt, 3
GuiControl, , mytex, % &quot;:&quot; ttttt
}
else
break
}
GuiControl,, MyProgress, 100
ExitApp
NMsecSubt(tmlsA, tmlsB) { ;计算两时间点列表值的差
subSVar := tmlsA[1]
subSVar -= tmlsB[1], s ;两数相减的秒数
if (subVar != 0)
return % subSVar + ((tmlsA[2] - tmlsB[2]) / 1000)
else
return % (tmlsA[2] - tmlsB[2]) / 1000
}