⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboarddlg.cpp

📁 wince下的触摸键盘(6×8)源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		char pChar = keydef->cNormal;
		SHORT ks = VKeyScan(pChar);
		BYTE key = ks & 0xFF;

		keybd_event(key,0,0,0);
		keybd_event(key,0,KEYEVENTF_KEYUP,0);

		//turn off the control and shift if they were down
		unsigned char vk = VK_SHIFT;
		if(GetKeyState(vk) & 0xF000)
		{
			keybd_event(vk,0,KEYEVENTF_KEYUP,0);
		}
		vk = VK_CONTROL;
		if(GetKeyState(vk) & 0xF000) //allow toggle
		{
			keybd_event(vk,0,KEYEVENTF_KEYUP,0);
		}
	}
}

//********************************************************
// 函数功能 :获取当前shift,ctrl和caps的状态
// 入口参数 :无
//
// 返回参数 :如果第一位为1表示capital按下,如果第二位为1
//			  表示shift按下
// 创建日期 : 
// 作者     : 
//********************************************************
int CKeyboardDlg::DescribeKeyState()
{
	int state = 0;
	short ks;
	ks = GetKeyState(VK_CAPITAL);
	if(ks & 0x000F) state += 0x01;
	ks = GetKeyState(VK_SHIFT);
	if(ks & 0xF000) state += 0x02;
	return state;
}

//********************************************************
// 函数功能 :绘制所有的按键
// 入口参数 :
//
// 返回参数 :
//
// 创建日期 : 2006.4.6
// 作者     : 丁继泉
//********************************************************
void CKeyboardDlg::DrawKeyboard()
{
	CClientDC dc(this);
	CRect client;
	GetClientRect(client);
	CRgn clipRgn;
	clipRgn.CreateRectRgnIndirect(&client);
	dc.SelectClipRgn(&clipRgn);
	dc.SelectObject(GetStockObject(SYSTEM_FONT));
	dc.SetBkMode(TRANSPARENT);
	KEYDEF * key;
	POSITION pos = cKeys.GetHeadPosition();
	cCurrentKeyState = DescribeKeyState();
	int state = cCurrentKeyState;
	while(pos)
	{
		key = cKeys.GetNext(pos);
		if(key->cNormal == 0x00)
		{
			switch(key->cShifted)
			{
			case CAPSLOCK:
				key->bHighlight = false;
				if(state & 0x01)
				{
					key->bHighlight = true;
				}
				break;
			case SHIFT:
				key->bHighlight = false;
				if(state & 0x02)
				{
					key->bHighlight = true;
				}
				break;
			case CTRL:
				key->bHighlight = false;
				if(state & 0x04)
				{
					key->bHighlight = true;
				}
				break;
			default:
				break;
			}
		}
		DrawKey(&dc,key);
	}
}


void CKeyboardDlg::DoGradientFill(CDC *pDC, CRect *rect)
{
	CRect rct;

	int nWidth = rect->Width();	
	int nHeight = rect->Height();

	for (int i = rect->top; i <= rect->bottom; i++) 
	{
		rct.SetRect(rect->left, i, rect->right, i + 1);
		pDC->FillRect(&rct, &m_BTBkColor[((i-rect->top)*63) / nHeight]);
	}
}

void CKeyboardDlg::FillBkBrushColor()
{
	for (int i = 0; i < 64; i ++)
	{
		m_BTBkColor[i].CreateSolidBrush(RGB(255 - (i / 4) , 255 - (i*2), 255-(i*3)));
	}
}

void CKeyboardDlg::FreeBkBrushColor()
{
	for (int i = 0; i < 64; i ++)
		m_BTBkColor[i].DeleteObject();
}

void CKeyboardDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting
		//SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
		DrawKeyboard();
	}
}

void CKeyboardDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnClose();
}

void CKeyboardDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	CDialog::OnDestroy();

	FreeBkBrushColor();

	POSITION pos = cKeys.GetHeadPosition();
	while(pos)
	{
		delete cKeys.GetNext(pos);
	}
	int state = DescribeKeyState();
	if(state & 0x01) keybd_event(VK_CAPITAL,0,KEYEVENTF_KEYUP,0);
	if(state & 0x02) keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
	if(state & 0x04) keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
}


/*
这几个函数的作用是屏蔽键盘对话框被激活
可以去除原来接受消息窗口闪烁的现象
*/
void CKeyboardDlg::OnSetFocus(CWnd* pOldWnd)
{
	CDialog::OnSetFocus(pOldWnd);
}

UINT CKeyboardDlg::OnNcHitTest(CPoint point)
{
	//return CDialog::OnNcHitTest(point);
	return 1;
}

void CKeyboardDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
	if(nState==WA_CLICKACTIVE && pWndOther!=NULL)
	{
		::SetActiveWindow(pWndOther->GetSafeHwnd());
		return;
	}

	CDialog::OnActivate(nState, pWndOther, bMinimized);
}

BOOL CKeyboardDlg::OnNcActivate(BOOL bActive)
{
//	return CDialog::OnNcActivate(bActive);
	return true;
}

//重点是这个函数,返回-1的时候,窗口不会闪烁
int CKeyboardDlg::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
	//return MA_NOACTIVATE ;  
	//	return CDialog::OnMouseActivate(pDesktopWnd, nHitTest, message);
	return -1;
}

void CKeyboardDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	if(IsWindow(gFocus))
	{
		::SetActiveWindow(gFocus);
	}
	return;
}

void CKeyboardDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	ReleaseFocus();
	
	CClientDC dc(this);
	dc.SelectObject(GetStockObject(SYSTEM_FONT));
	dc.SetBkMode(TRANSPARENT);
	KEYDEF * key;
	POSITION pos = cKeys.GetHeadPosition();
	while(pos)
	{
		key = cKeys.GetNext(pos);
		if(key->rect.PtInRect(point))
		{
			SendKey(key);
			DrawKey(&dc,key);
			return;
		}
	}
}

// 计算按键的矩形区域
void CKeyboardDlg::CalKeyRect()
{
	CRect client;
	GetClientRect(client);
	int x = 0;
	int y = -pKeyHeight;
	KEYDEF * key;
	POSITION pos = cKeys.GetHeadPosition();
	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);
			if(key->cWidth < 0)
			{
				rc.right = client.right;
			}
			x+= width;
			key->rect=rc;
		}
	}
}

void CKeyboardDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	ReleaseFocus();
	CClientDC dc(this);
	dc.SelectObject(GetStockObject(SYSTEM_FONT));
	dc.SetBkMode(TRANSPARENT);
	KEYDEF * key;
	POSITION pos = cKeys.GetHeadPosition();
	cCurrentKeyState = DescribeKeyState();
	int state = cCurrentKeyState;
	while(pos)
	{
		key = cKeys.GetNext(pos);
		if(key->rect.PtInRect(point))  //鼠标在按键上
		{
			if(key->bHighlight!=true)
			{
				key->bHighlight=true;	
				DrawKey(&dc,key);
			}
		}
		else if(key->bHighlight==true)  //不在你上面你也亮的话
		{
			if(key->cNormal == 0x00) //判断是不是shift,ctrl,caps
			{
				switch(key->cShifted)
				{
				case CAPSLOCK:
					if(!(state & 0x01))  //根据当前状态不应该亮的
					{
						key->bHighlight = false;  //关掉
						DrawKey(&dc,key);
					}
					break;
				case SHIFT:
					if(!(state & 0x02))  //不应该亮的
					{
						key->bHighlight = false;  //关掉
						DrawKey(&dc,key);
					}
					break;
				case CTRL:
					if(!(state & 0x04))  //不应该亮的
					{
						key->bHighlight = false;  //关掉
						DrawKey(&dc,key);
					}	
					break;
				default:
					key->bHighlight = false;  //其它功能键关掉
					DrawKey(&dc,key);
					break;
				}
			}
			else
			{
				key->bHighlight = false;  //不是功能键关掉
				DrawKey(&dc,key);
			}
		}
	}
}

BOOL CKeyboardDlg::PreCreateWindow(CREATESTRUCT &cs)
{
	return CDialog::PreCreateWindow(cs);
}

void CKeyboardDlg::PostNcDestroy()
{
	CDialog::PostNcDestroy();
}

SHORT CKeyboardDlg::VKeyScan(TCHAR ch)
{
	switch(ch)
	{
	case 'a':
		return 0x0041;
		break;
	case 'b':
		return 0x0042;
		break;
	case 'c':
		return 0x0043;
		break;
	case 'd':
		return 0x0044;
		break;
	case 'e':
		return 0x0045;
		break;
	case 'f':
		return 0x0046;
		break;
	case 'g':
		return 0x0047;
		break;
	case 'h':
		return 0x0048;
		break;
	case 'i':
		return 0x0049;
		break;
	case 'j':
		return 0x4a;
		break;
	case 'k':
		return 0x4b;
		break;
	case 'l':
		return 0x4c;
		break;
	case 'm':
		return 0x4d;
		break;
	case 'n':
		return 0x4e;
		break;
	case 'o':
		return 0x4f;
		break;
	case 'p':
		return 0x50;
		break;
	case 'q':
		return 0x51;
		break;
	case 'r':
		return 0x52;
		break;
	case 's':
		return 0x53;
		break;
	case 't':
		return 0x54;
		break;
	case 'u':
		return 0x55;
		break;
	case 'v':
		return 0x56;
		break;
	case 'w':
		return 0x57;
		break;
	case 'x':
		return 0x58;
		break;
	case 'y':
		return 0x59;
		break;
	case 'z':
		return 0x5a;
		break;

	case '=':
		return 0xbb;
		break;
	case '\\':
		return 0xdc;
		break;
	case '-':
		return 0xbd;
		break;
	case '.':
		return 0xbe;
		break;
	case '/':
		return 0xbf;
		break;
	default:
		return ch;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -