抄袭网友AMO的创意,用godking.paint库重写了一下,主要是解决输入字符时界面闪烁问题。
简单版对按键的识别进行了简单处理,还不是很全面,没有判断shift的情况,一般字符输入没问题了。
附件中的1.6版本的功能就比较完善了。
简单版:
Code AardioLine:147复制1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147.
import
win
.ui;import
console;/*DSG{{*/
- winform =
win
.form(text="全民打字高手1.4"
;right=615
;bottom=470
;bgcolor=0x4D582E;border="dialog frame"
;max=false
)- winform.add({
- next1={cls=
"plus"
;text="下一个字"
;left=16
;top=8
;right=592
;bottom=48
;bgcolor=0xF0FBFF;clipBk=false
;color=0xFF0000;font=LOGFONT(h=-16
;name='Consolas'
;weight=700
);textPadding={top=7
};z=1
};- plus_key={cls=
"plus"
;left=16
;top=272
;right=596
;bottom=447
;background="\全民打字高手1.4\res\kb.bmp"
;repeat="tile"
;z=3
};- plus_showkeys={cls=
"plus"
;left=16
;top=56
;right=596
;bottom=256
;bgcolor=0xFFFFFF;z=2
}- })
/*}}*/
import
godking.paintvar
getKeysRect=function
(){var
keysRect,w,h={},40
,35
;var
str="`1234567890-="
;var
x1,y1=0
,0
;for
(i=1
;#str;1){
- keysRect[str[[i]]]=::RECT(x1+w*(i-
1
),y1,x1+w*i,y1+h);- }
- str=
"qwertyuiop[]\"
;- x1,y1=
60
,35
;for
(i=1
;#str;1){
- keysRect[str[[i]]]=::RECT(x1+w*(i-
1
),y1,x1+w*i,y1+h);- }
- str=
"asdfghjkl;'"
;- x1,y1=
70
,70
;for
(i=1
;#str;1){
- keysRect[str[[i]]]=::RECT(x1+w*(i-
1
),y1,x1+w*i,y1+h);- }
- str=
"zxcvbnm,./"
;- x1,y1=
90
,105
;for
(i=1
;#str;1){
- keysRect[str[[i]]]=::RECT(x1+w*(i-
1
),y1,x1+w*i,y1+h);- }
var
t1 =/***`1234567890-=qwertyuiop[]\asdfghjkl;'zxcvbnm,./***/
var
t2 =/***~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?***/
for
(i=1
;#t1;1){
- keysRect[t2[[i]]] = keysRect[t1[[i]]];
- }
- keysRect[
'\n'
]=::RECT(510
,70
,580
,105
);- keysRect[
" "
]=::RECT(180
,140
,400
,175
);return
keysRect;- }
var
keysRect = getKeysRect();var
bmp = ..gdip.bitmap("\res\kb.bmp"
);var
bk = bmp.clone(0
,0
,580
,175
);var
fg = bmp.clone(0
,175
,580
,175
);- bmp.dispose();
var
text = "python print input float intif
elifelse
- range list append pop insert sort reverse remove
- take me to your heart, take me to your soul
- give me your hand before I am old
- show me what love is haven't got a clue
- show me that wonders can be
true
- they say nothing lasts forever, we're only here today
- love is now
or
never! bring me far away. well done!"var
inputkeys = {};var
showKeyPos=function
(){var
key = text[[#inputkeys+1]]
- winform.next1.text =
"下一个:"
++ key;if
!keysRect[key] {var
bmp = winform.plus_key.setForeground(bk.clone());if
bmp bmp.dispose();return
;- }
var
paint = godking.paint.fromBitmap(bk.clone());- paint.clip.set(keysRect[key],0
/*半径*/
,0/*_GdipCombineMode*/
);- paint.drawImage( 0
/*x1*/
,0/*y1*/
,0/*x2*/
,0/*y2*/
,fg/*图片*/
,/*透明度或图片属性*/
,/*保持比例*/
);var
bmp = winform.plus_key.setForeground(paint.bitmap.clone());if
bmp bmp.dispose();- paint.close();
- }
var
showkeys =function
(){var
line,pos =0
,0
;var
paint = godking.paint(580
,200
);var
font = ::LOGFONT(name="宋体"
;h=16
;color=0xFF888888;brush=null
);var
fontred = ::LOGFONT(name="宋体"
;h=16
;color=0xFFFF0000;brush=null
);var
fontgreen = ::LOGFONT(name="宋体"
;h=16
;color=0xFF00FF00;brush=null
);var
w,h =10
,18
;var
inputnum =#inputkeys;
var
returnchar ="↲"
;for
(i=1
;#text;1){
var
char = text[[i]];if
char ==='\n'
char=returnchar;var
rect = ::RECT(pos*w,line*h,(pos+1
)*w+2
,(line+1
)*h);- paint.drawText( rect, char, font,0
/*格式*/
,0/*水平*/
,0/*垂直*/
,false/*截短*/
)if
i<=inputnum {var
inputchar = inputkeys[[i]];if
inputchar ==='\n'
inputchar=returnchar;if
inputchar===char {- paint.drawText( rect,inputchar,fontgreen,0
/*格式*/
,0/*水平*/
,0/*垂直*/
,false/*截短*/
)- }
else
{- paint.fillRect( rect
/*绘制范围RECT*/
,0xFF0000FF)- paint.drawText( rect,inputchar,fontred,0
/*格式*/
,0/*水平*/
,0/*垂直*/
,false/*截短*/
)- }
- }
if
char = returnchar {- line++;
- pos=
0
;- }
else
{- pos++;
- }
- }
- winform.plus_showkeys.setForeground(paint.bitmap.clone());
- paint.close();
- }
import
keyvar
pushkey =function
(wParam,lParam){if
wParam>222
or
wParam==0x10/*_VK_SHIFT*/
or
wParam==0x12/*_VK_ALT*/
or
wParam== 0x11/*_VK_CTRL*/
return
;if
wParam ===8
{table
.pop(inputkeys);- }
elseif
wParam===10
{table
.push(inputkeys,'\n'
)- }
else
{var
char = key.VK_NAME[wParam]if
!charreturn
;if
char =="QUOTE"
char="'"
;elseif
char =="SPACE"
char=' '
;elseif
#char>1 return ;
else
char=string
.lower(char);table
.push(inputkeys,char)- }
- showkeys();
- showKeyPos();
- }
- winform.onOk =
function
(){- pushkey(
10
);- }
- winform.wndproc =
function
(hwnd,message,wParam,lParam){if
message === 0x100/*_WM_KEYDOWN*/
{- pushkey(wParam,lParam);
- }
- }
- showkeys()
- showKeyPos()
- winform.show()
return
win
.loopMessage();
优化进阶版:
Code AardioLine:175复制1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175.
import
win
.ui;import
console;/*DSG{{*/
- winform =
win
.form(text="全民打字高手1.4"
;right=615
;bottom=470
;bgcolor=5068846
;border="dialog frame"
;max=false
)- winform.add(
- next1={cls=
"plus"
;text="下一个字"
;left=16
;top=8
;right=592
;bottom=48
;bgcolor=15793151
;clipBk=false
;color=16711680
;font=LOGFONT(h=-16
;name='Consolas'
;weight=700
);textPadding={top=7
};z=1
};- plus_key={cls=
"plus"
;left=16
;top=272
;right=596
;bottom=447
;background="\全民打字高手1.4\res\kb.bmp"
;repeat="tile"
;z=3
};- plus_showkeys={cls=
"plus"
;left=16
;top=56
;right=596
;bottom=256
;foreRepeat="tile"
;z=2
}- )
/*}}*/
import
godking.paint//定义键盘按键对应的字符
var
getKeysRect=function
(){var
keysRect,w,h={},40
,35
;var
str="`1234567890-="
;var
x1,y1=0
,0
;for
(i=1
;#str;1){
- keysRect[str[[i]]]=::RECT(x1+w*(i-
1
),y1,x1+w*i,y1+h);- }
- str=
"qwertyuiop[]\"
;- x1,y1=
60
,35
;for
(i=1
;#str;1){
- keysRect[str[[i]]]=::RECT(x1+w*(i-
1
),y1,x1+w*i,y1+h);- }
- str=
"asdfghjkl;'"
;- x1,y1=
70
,70
;for
(i=1
;#str;1){
- keysRect[str[[i]]]=::RECT(x1+w*(i-
1
),y1,x1+w*i,y1+h);- }
- str=
"zxcvbnm,./"
;- x1,y1=
90
,105
;for
(i=1
;#str;1){
- keysRect[str[[i]]]=::RECT(x1+w*(i-
1
),y1,x1+w*i,y1+h);- }
var
t1 =/***`1234567890-=qwertyuiop[]\asdfghjkl;'zxcvbnm,./***/
var
t2 =/***~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?***/
for
(i=1
;#t1;1){
- keysRect[t2[[i]]] = keysRect[t1[[i]]];
- }
- keysRect[
'\n'
]=::RECT(510
,70
,580
,105
);- keysRect[
" "
]=::RECT(180
,140
,400
,175
);return
keysRect;- }
var
keysRect = getKeysRect();//处理键盘图片
var
bmp = ..gdip.bitmap("\kb.bmp"
);var
bk = bmp.clone(0
,0
,580
,175
);var
fg = bmp.clone(0
,175
,580
,175
);- bmp.dispose();
//定义要输入的文字
var
text = "python print input float intif
elifelse
- range list append pop insert sort reverse remove
- take me to your heart, take me to your soul
- give me your hand before I am old
- show me what love is haven't got a clue
- show me that wonders can be
true
- they say nothing lasts forever, we're only here today
- love is now
or
never! bring me far away. well done!"//预处理全部文字底图及每个文字区域
var
dpi = godking.paint.getDpi();var
font = ::LOGFONT(name="宋体"
;h=16
*dpi;bold=true
;color=0xFF888888;brush=null
);var
fontred = ::LOGFONT(name="宋体"
;h=16
*dpi;bold=true
;color=0xFFFF0000;brush=null
);var
fontgreen = ::LOGFONT(name="宋体"
;h=16
*dpi;bold=true
;color=0xFF00FF00;brush=null
);var
getInitBitmapAndRects =function
(text){var
rects = {};var
line,pos =0
,0
;var
paint = godking.paint(580
*dpi,200
*dpi);- paint.clear(0xFFFFFFFF);
- paint.textAntiAlias =
true
var
w,h =10
*dpi,18
*dpi;var
returnchar ="↲"
;for
(i=1
;#text;1){
var
char = text[[i]];if
char ==='\n'
char=returnchar;var
rect = ::RECT(pos*w,line*h,(pos+1
)*w+2
*dpi,(line+1
)*h);table
.push(rects,rect);- paint.drawText( rect, char, font,0
/*格式*/
,0/*水平*/
,0/*垂直*/
,false/*截短*/
)if
char = returnchar {- line++;
- pos=
0
;- }
else
{- pos++;
- }
- }
var
bmp = paint.bitmap.clone();- paint.close();
return
bmp,rects;- }
var
textbmp,rects = getInitBitmapAndRects(text);var
inputkeys = {};//处理下一字符按键显示界面
var
KeyPosPaint = godking.paint.fromBitmap(bk.clone());- KeyPosPaint.saveBitmapToCache()
var
showKeyPos=function
(){var
key = text[[#inputkeys+1]]:"";
- winform.next1.text =
"下一个:"
++ key;if
!keysRect[key] {return
winform.plus_key.setForeground(bk);- }
- KeyPosPaint.loadBitmapFromCache()
- KeyPosPaint.clip.set(keysRect[key],0
/*半径*/
,0/*_GdipCombineMode*/
);- KeyPosPaint.drawImage( 0
/*x1*/
,0/*y1*/
,0/*x2*/
,0/*y2*/
,fg/*图片*/
,/*透明度或图片属性*/
,/*保持比例*/
);- winform.plus_key.setForeground(KeyPosPaint.bitmap);
- }
//处理输入字符显示界面
var
keyspaint = godking.paint.fromBitmap(textbmp.clone());- keyspaint.textAntiAlias =
true
- winform.plus_showkeys.foreground = keyspaint.bitmap;
var
returnchar ="↲"
;var
showkeys =function
(delete){var
i =#inputkeys;
if
delete {- i++;
var
char = text[[i]];- keyspaint.fillRect( rects[i]
/*绘制范围RECT*/
,0xFFFFFFFF);- keyspaint.drawText( rects[i],char,font,0
/*格式*/
,0/*水平*/
,0/*垂直*/
,false/*截短*/
);- }
elseif
i {var
char = text[[i]];if
char ==='\n'
char=returnchar;var
inputchar = inputkeys[[i]];if
inputchar ==='\n'
inputchar=returnchar;if
inputchar===char {- keyspaint.drawText( rects[i],inputchar,fontgreen,0
/*格式*/
,0/*水平*/
,0/*垂直*/
,false/*截短*/
);- }
else
{- keyspaint.fillRect( rects[i]
/*绘制范围RECT*/
,0xFF0000FF);- keyspaint.drawText( rects[i],inputchar,fontred,0
/*格式*/
,0/*水平*/
,0/*垂直*/
,false/*截短*/
);- }
- }
- winform.plus_showkeys.redraw();
- }
//处理按键消息
import
keyvar
pushkey =function
(wParam){if
wParam>222
or
wParam==0x10/*_VK_SHIFT*/
or
wParam==0x12/*_VK_ALT*/
or
wParam== 0x11/*_VK_CTRL*/
return
;if
wParam ===8
{table
.pop(inputkeys);return
showkeys(true
):showKeyPos();- }
elseif
#inputkeys=#text {
return
;- }
elseif
wParam===10
{table
.push(inputkeys,'\n'
)- }
else
{var
char = key.VK_NAME[wParam]if
!charreturn
;if
char =="QUOTE"
char="'"
;elseif
char =="SPACE"
char=' '
;elseif
#char>1 return ;
else
char=string
.lower(char);table
.push(inputkeys,char)- }
- showkeys();
- showKeyPos();
- }
- winform.onOk =
function
(){- pushkey(
10
);- }
- winform.wndproc =
function
(hwnd,message,wParam,lParam){if
message === 0x100/*_WM_KEYDOWN*/
{- pushkey(wParam);
- }
- }
//初始化界面
- showkeys()
- showKeyPos()
- winform.show()
return
win
.loopMessage();
最新回复 (0)