在网络游戏中,或银行密码输入时,为确保密码安全,很多时候采用屏幕软键盘。
一个VC++屏幕软键盘程序代码
首先定义链表保存按键值: CTypedPtrList<CPtrList, KEYDEF*> cKeys 这里是采用MFC的PtrList实现的,当然如果用stl的list就更好了。
分别添加键盘中的按键如下: //control row AddKey(0x00,0x00,0); //signal row change AddKey(0x00,ESC,10); for(int fnkey = 0x70; fnkey < 0x7C; fnkey++) { AddKey(0x00,fnkey & 0xFF,10); } AddKey(0x00,INS,14); AddKey(0x00,DEL,-10);
//first row AddKey(0x00,0x00,1); //signal row change AddKey('`','~',10); AddKey('1','!',10); AddKey('2','@',10); AddKey('3','#',10); AddKey('4','$',10); AddKey('5','%',10); AddKey('6','^',10); AddKey('7','&',10); AddKey('8','*',10); AddKey('9','(',10); AddKey('0',')',10); AddKey('-','_',10); AddKey('=','+',10); AddKey(0x00,BSPACE,14); //backspace AddKey(0x00,PUP,-12);
//second row AddKey(0x00,0x00,2); //signal row change AddKey(0x00,TAB,14); //tab AddKey('q','Q',10); AddKey('w','W',10); AddKey('e','E',10); AddKey('r','R',10); AddKey('t','T',10); AddKey('y','Y',10); AddKey('u','U',10); AddKey('i','I',10); AddKey('o','O',10); AddKey('p','P',10); AddKey('[','{',10); AddKey(']','}',10); AddKey('\\','|',10); AddKey(0x00,PDN,-12);
//third row AddKey(0x00,0x00,3); //signal row change AddKey(0x00,CAPSLOCK,18); //caps lock AddKey('a','A',10); AddKey('s','S',10); AddKey('d','D',10); AddKey('f','F',10); AddKey('g','G',10); AddKey('h','H',10); AddKey('j','J',10); AddKey('k','K',10); AddKey('l','L',10); AddKey(';',':',10); AddKey('\'','\"',10); AddKey(0x00,ENTER,16); //enter AddKey(0x00,HOME,-10);
//fourth row AddKey(0x00,0x00,4); //signal row change AddKey(0x00,SHIFT,22); //shift AddKey('z','Z',10); AddKey('x','X',10); AddKey('c','C',10); AddKey('v','V',10); AddKey('b','B',10); AddKey('n','N',10); AddKey('m','M',10); AddKey(',','<',10); AddKey('.','>',10); AddKey('/','?',10); AddKey(0x00,SHIFT,22); //shift AddKey(0x00,END,-10);
//fifth row AddKey(0x00,0x00,5); //signal row change AddKey(0x00,CTRL,12); //ctrl AddKey(0x00,WINDOW,12); //window AddKey(0x00,ALT,12); //alt AddKey(' ',' ',60); AddKey(0x00,LEFT,12); //left AddKey(0x00,UP,12); //up AddKey(0x00,DOWN,12); //down AddKey(0x00,RIGHT,12); //right AddKey(0x00,WWW,-10); //http://WWW
CalcWidthHeight();
画键盘函数如下: void COnscreenKeyboardDlg: rawKeyboard() { CClientDC dc(this); CRect client; GetClientRect(client); CRgn clipRgn; clipRgn.CreateRectRgnIndirect(&client); dc.SelectClipRgn(&clipRgn); dc.SelectObject(GetStockObject(DEFAULT_GUI_FONT)); dc.SetBkMode(TRANSPARENT); int x = 0; int y = -pKeyHeight; KEYDEF * key;   OSITION pos = cKeys.GetHeadPosition(); cCurrentKeyState = DescribeKeyState(); int state = cCurrentKeyState; while(pos) { key = cKeys.GetNext(pos); if((key->cNormal == 0x00) && (key->cShifted == 0x00)) { x = 0; y += pKeyHeight; } else { int width = ((abs(key->cWidth) * pKeyWidth) / 10); CRect rc(x,y,x + width, y + pKeyHeight); x += width; if(key->cWidth < 0) { rc.right = client.right; } BOOL hilight = FALSE; if(key->cNormal == 0x00) { switch(key->cShifted) { case CAPSLOCK: if(state & 0x01) { hilight = TRUE; } break; case SHIFT: if(state & 0x02) { hilight = TRUE; } break; case CTRL: if(state & 0x04) { hilight = TRUE; } break; default: break; } } DrawKey(&dc, rc, key, hilight); } } } 一张帖子贴不完,楼下继续贴...
|