全民打字爆改版

光庆 19小时前 65

抄袭网友AMO的创意,用godking.paint库重写了一下,主要是解决输入字符时界面闪烁问题。

对按键的识别进行了简单处理,还不是很全面,没有判断shift的情况,一般字符输入没问题了。


简单版:

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.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("\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 int if elif else
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 key

var 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 !char return ; 
		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();

优化进阶版:

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 int if elif else
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 key
var 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 !char return ; 
        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)
返回