📄 keyboarddlg.cpp
字号:
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 + -