?? msghandler.cpp
字號:
#include "stdafx.h"
#include "Defination.h"
#include <keybd.h> //include keystroke and status information
///////////////////////////////////////////////////////////////////////////////////////
// //
// *** Definition of the SIP Configuration *** //
// //
///////////////////////////////////////////////////////////////////////////////////////
KEYBUTTON BTNMAP[4][12] =
{
// 1st row
{
{MRGN, MRGN,
MRGN+WDTH_ESC-MRGN, MRGN+HGHT, VK_ESCAPE, VK_ESCAPE, _T('E')}, // ESCAPE
{MRGN+WDTH_ESC, MRGN,
MRGN*2+WDTH+WDTH_ESC, MRGN+HGHT,'1', '1', _T('1'), _T('1')},
{MRGN*3+WDTH_ESC+WDTH, MRGN,
MRGN*3+WDTH*2+WDTH_ESC, MRGN+HGHT,'2', '2', _T('2'), _T('2')},
{MRGN*4+WDTH_ESC+WDTH*2, MRGN,
MRGN*4+WDTH*3+WDTH_ESC, MRGN+HGHT,'3', '3', _T('3'), _T('3')},
{MRGN*5+WDTH_ESC+WDTH*3, MRGN,
MRGN*5+WDTH*4+WDTH_ESC, MRGN+HGHT,'4', '4', _T('4'), _T('4')},
{MRGN*6+WDTH_ESC+WDTH*4, MRGN,
MRGN*6+WDTH*5+WDTH_ESC, MRGN+HGHT,'5', '5', _T('5'), _T('5')},
{MRGN*7+WDTH_ESC+WDTH*5, MRGN,
MRGN*7+WDTH*6+WDTH_ESC, MRGN+HGHT,'6', '6', _T('6'), _T('6')},
{MRGN*8+WDTH_ESC+WDTH*6, MRGN,
MRGN*8+WDTH*7+WDTH_ESC, MRGN+HGHT,'7', '7', _T('7'), _T('7')},
{MRGN*9+WDTH_ESC+WDTH*7, MRGN,
MRGN*9+WDTH*8+WDTH_ESC, MRGN+HGHT,'8', '8', _T('8'), _T('8')},
{MRGN*10+WDTH_ESC+WDTH*8, MRGN,
MRGN*10+WDTH*9+WDTH_ESC, MRGN+HGHT,'9', '9', _T('9'), _T('9')},
{MRGN*11+WDTH_ESC+WDTH*9, MRGN,
MRGN*11+WDTH*10+WDTH_ESC, MRGN+HGHT,'0', '0', _T('0'), _T('0')},
{MRGN*13+WDTH_ESC+WDTH*10, MRGN,
MRGN*12+WDTH*10+WDTH_ESC+WDTH_BAK, MRGN+HGHT,VK_BACK, VK_BACK,
_T('B'), _T('B')}, // BACKSPACE
},
// 2nd row
{
{MRGN+WDTH_ESC*1.5, MRGN*2+HGHT,
MRGN*2+WDTH+WDTH_ESC*1.5, MRGN*2+HGHT*2,'q', 'Q', _T('q'), _T('Q')},
{MRGN*3+WDTH_ESC*1.5+WDTH, MRGN*2+HGHT,
MRGN*3+WDTH*2+WDTH_ESC*1.5, MRGN*2+HGHT*2,'w', 'W', _T('w'), _T('W')},
{MRGN*4+WDTH_ESC*1.5+WDTH*2, MRGN*2+HGHT,
MRGN*4+WDTH*3+WDTH_ESC*1.5, MRGN*2+HGHT*2,'e', 'E', _T('e'), _T('E')},
{MRGN*5+WDTH_ESC*1.5+WDTH*3, MRGN*2+HGHT,
MRGN*5+WDTH*4+WDTH_ESC*1.5, MRGN*2+HGHT*2,'r', 'R', _T('r'), _T('R')},
{MRGN*6+WDTH_ESC*1.5+WDTH*4, MRGN*2+HGHT,
MRGN*6+WDTH*5+WDTH_ESC*1.5, MRGN*2+HGHT*2,'t', 'T', _T('t'), _T('T')},
{MRGN*7+WDTH_ESC*1.5+WDTH*5, MRGN*2+HGHT,
MRGN*7+WDTH*6+WDTH_ESC*1.5, MRGN*2+HGHT*2,'y', 'Y', _T('y'), _T('Y')},
{MRGN*8+WDTH_ESC*1.5+WDTH*6, MRGN*2+HGHT,
MRGN*8+WDTH*7+WDTH_ESC*1.5, MRGN*2+HGHT*2,'u', 'U', _T('u'), _T('U')},
{MRGN*9+WDTH_ESC*1.5+WDTH*7, MRGN*2+HGHT,
MRGN*9+WDTH*8+WDTH_ESC*1.5, MRGN*2+HGHT*2,'i', 'I', _T('i'), _T('I')},
{MRGN*10+WDTH_ESC*1.5+WDTH*8, MRGN*2+HGHT,
MRGN*10+WDTH*9+WDTH_ESC*1.5, MRGN*2+HGHT*2,'o', 'O', _T('o'), _T('O')},
{MRGN*11+WDTH_ESC*1.5+WDTH*9, MRGN*2+HGHT,
MRGN*11+WDTH*10+WDTH_ESC*1.5, MRGN*2+HGHT*2,'p', 'P', _T('p'), _T('P')},
},
// 3rd row
{
{MRGN, MRGN*3+HGHT*2,
MRGN+WDTH_CAP-MRGN, MRGN*3+HGHT*3, VK_CAPITAL, VK_CAPITAL,
_T('C'), _T('C')}, // CAPSLOCK
{MRGN+WDTH_CAP, MRGN*3+HGHT*2,
MRGN*2+WDTH+WDTH_CAP, MRGN*3+HGHT*3, 'a', 'A', _T('a'), _T('A')},
{MRGN*3+WDTH_CAP+WDTH, MRGN*3+HGHT*2,
MRGN*3+WDTH*2+WDTH_CAP, MRGN*3+HGHT*3, 's', 'S', _T('s'), _T('S')},
{MRGN*4+WDTH_CAP+WDTH*2, MRGN*3+HGHT*2,
MRGN*4+WDTH*3+WDTH_CAP, MRGN*3+HGHT*3, 'd', 'D', _T('d'), _T('D')},
{MRGN*5+WDTH_CAP+WDTH*3, MRGN*3+HGHT*2,
MRGN*5+WDTH*4+WDTH_CAP, MRGN*3+HGHT*3, 'f', 'F', _T('f'), _T('F')},
{MRGN*6+WDTH_CAP+WDTH*4, MRGN*3+HGHT*2,
MRGN*6+WDTH*5+WDTH_CAP, MRGN*3+HGHT*3, 'g', 'G', _T('g'), _T('G')},
{MRGN*7+WDTH_CAP+WDTH*5, MRGN*3+HGHT*2,
MRGN*7+WDTH*6+WDTH_CAP, MRGN*3+HGHT*3, 'h', 'H', _T('h'), _T('H')},
{MRGN*8+WDTH_CAP+WDTH*6, MRGN*3+HGHT*2,
MRGN*8+WDTH*7+WDTH_CAP, MRGN*3+HGHT*3, 'j', 'J', _T('j'), _T('J')},
{MRGN*9+WDTH_CAP+WDTH*7, MRGN*3+HGHT*2,
MRGN*9+WDTH*8+WDTH_CAP, MRGN*3+HGHT*3, 'k', 'K', _T('k'), _T('K')},
{MRGN*10+WDTH_CAP+WDTH*8, MRGN*3+HGHT*2,
MRGN*10+WDTH*9+WDTH_CAP, MRGN*3+HGHT*3, 'l', 'L', _T('l'), _T('L')},
{MRGN*11+WDTH_CAP+WDTH*9, MRGN*3+HGHT*2,
MRGN*12+WDTH*9+WDTH_CAP+WDTH_RTN_2, MRGN*3+HGHT*3,
VK_RETURN, VK_RETURN, _T('R'), _T('R')}, // RETURN
},
// 4th row
{
{MRGN+WDTH_ESC*2.5, MRGN*4+HGHT*3,
MRGN*2+WDTH+WDTH_ESC*2.5, MRGN*4+HGHT*4,'z', 'Z', _T('z'), _T('Z')},
{MRGN*3+WDTH_ESC*2.5+WDTH, MRGN*4+HGHT*3,
MRGN*3+WDTH*2+WDTH_ESC*2.5, MRGN*4+HGHT*4,'x', 'X', _T('x'), _T('X')},
{MRGN*4+WDTH_ESC*2.5+WDTH*2, MRGN*4+HGHT*3,
MRGN*4+WDTH*3+WDTH_ESC*2.5, MRGN*4+HGHT*4,'c', 'C', _T('c'), _T('C')},
{MRGN*5+WDTH_ESC*2.5+WDTH*3, MRGN*4+HGHT*3,
MRGN*5+WDTH*4+WDTH_ESC*2.5, MRGN*4+HGHT*4,'v', 'V', _T('v'), _T('V')},
{MRGN*6+WDTH_ESC*2.5+WDTH*4, MRGN*4+HGHT*3,
MRGN*6+WDTH*5+WDTH_ESC*2.5, MRGN*4+HGHT*4,'b', 'B', _T('b'), _T('B')},
{MRGN*7+WDTH_ESC*2.5+WDTH*5, MRGN*4+HGHT*3,
MRGN*7+WDTH*6+WDTH_ESC*2.5, MRGN*4+HGHT*4,'n', 'N', _T('n'), _T('N')},
{MRGN*8+WDTH_ESC*2.5+WDTH*6, MRGN*4+HGHT*3,
MRGN*8+WDTH*7+WDTH_ESC*2.5, MRGN*4+HGHT*4,'m', 'M', _T('m'), _T('M')},
{MRGN*9+WDTH_ESC*2.5+WDTH*7, MRGN*4+HGHT*3,
MRGN*9+WDTH*8+WDTH_ESC*2.5, MRGN*4+HGHT*4,'.', '.', _T('.'), _T('.')},
{MRGN*12+WDTH_ESC*2.5+WDTH*8, MRGN*4+HGHT*3,
MRGN*12+WDTH*8+WDTH_ESC*2.5+WDTH_SPC, MRGN*4+HGHT*4, VK_SPACE,
VK_SPACE, _T('S'), _T('S')}, // SPACE
},
};
HINSTANCE hInst;
HWND CreateIMWindow (HWND hwndParent)
{
WNDCLASS wc;
RECT rect;
HWND hwnd;
// Register InputMethod window class.
memset (&wc, 0, sizeof (wc));
wc.style = CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW ;//| CS_PARENTDC;
wc.lpfnWndProc = NPWndProc; // Callback function
wc.hInstance = hInst; // Owner handle
wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wc.lpszClassName = MYSIPCLS; // Window class name
if (RegisterClass (&wc) == 0) return 0;
// Create InputMethod window.
GetClientRect (hwndParent, &rect);
hwnd = CreateWindowEx (0, MYSIPCLS, _T(""),
WS_VISIBLE | WS_CHILD | WS_BORDER, rect.left,
rect.top, rect.right - rect.left,
rect.bottom - rect.top, hwndParent, (HMENU)100,
hInst, 0);
if (!IsWindow (hwnd))
return 0;
return hwnd;
}
int DestroyIMWindow (HWND hwnd)
{
// Clean up the window.
DestroyWindow (hwnd);
UnregisterClass (MYSIPCLS, hInst);
return 0;
}
LRESULT CALLBACK NPWndProc (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
INT i;
// Call routine to handle control message.
for (i = 0; i < dim(SipMessages); i++)
{
if (wMsg == SipMessages[i].Code)
return (*SipMessages[i].Fxn)(hWnd, wMsg, wParam, lParam);
}
return DefWindowProc (hWnd, wMsg, wParam, lParam);
}
LRESULT CALLBACK OnDestroy (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
LPSIPWNDSTRUCT pWndData;
pWndData = (LPSIPWNDSTRUCT)GetWindowLong (hWnd, GWL_USERDATA);
LocalFree (pWndData);
return 0;
}
//////////////////////////////////////////////////////////////////////////////
// //
// *** Handle the BUTTON and MOUSE messages *** //
// //
// 1. Identify whether and which key is pressed; //
// 2. Get the Window Message and pass to corresponding process; //
// 3. If key is pressed, Send Virtual Key to Windows. //
// //
//////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK OnTouch (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
RECT rect;
RECT rcAllChars= {MRGN+WDTH_ESC*1.5, MRGN*2+HGHT,
MRGN*11+WDTH*10+WDTH_ESC*1.5, MRGN*4+HGHT*4};
INT iRowPrev, iColPrev, iRow, iCol, x, y;
UINT nChar, nShiftFlags = 0;
BOOL bPressed;
LPSIPWNDSTRUCT pWndData;
UINT nChar2;
KEY_STATE_FLAGS nShiftState;
pWndData = (LPSIPWNDSTRUCT)GetWindowLong (hWnd, GWL_USERDATA);
iRowPrev = pWndData->iRowPrev;
iColPrev = pWndData->iColPrev;
// Compute the button grid.
GetClientRect (hWnd, &rect);
x = LOWORD(lParam);
y = HIWORD(lParam);
// Identify the Pressed Key
// Index of Row
if(y <= 33) iRow = 0;
else if(y <= 66) iRow = 1;
else if(y <= 99) iRow = 2;
else iRow = 3;
// Index of Column
switch(iRow)
{
case 0:
if(x <=WDTH_ESC)
{
iCol=0;
break;
}
iCol = (x-WDTH_ESC) / (MRGN+WDTH)+1;
if(iCol>11) iCol=11;
break;
case 1:
if(x<WDTH_ESC*1.5)
{
iCol = -1;
break;
}
iCol = (x-WDTH_ESC*1.5) /(MRGN+WDTH);
if(iCol>8 && x>=MRGN*11+WDTH_CAP+WDTH*9+WDTH_RTN_2/2)
iRow = 2, iCol = 10;
break;
case 2:
if(x<=WDTH_CAP)
{
iCol=0;
break;
}
iCol = (x-WDTH_CAP) / (MRGN+WDTH)+1;
if(iCol>10) iCol=10;
break;
case 3:
if(x<MRGN+WDTH_ESC*2.5)
{
iCol = -1;
break;
}
iCol = (x-MRGN-WDTH_ESC*2.5) / (MRGN+WDTH);
if(iCol>8) iCol=8;
default:
break;
}
if(iCol == -1)
return 0;
// Identification Over
// Do message-specific processing.
switch (wMsg)
{
case WM_LBUTTONDOWN:
SetCapture (hWnd);
case WM_MOUSEMOVE:
bPressed = TRUE;
break;
case WM_LBUTTONDBLCLK:
case WM_LBUTTONUP:
if (pWndData->bPressed)
ReleaseCapture();
bPressed = FALSE;
nChar = pWndData->bCapital? BTNMAP[iRow][iCol].keyVCharCap
:BTNMAP[iRow][iCol].keyVChar;
switch(nChar)
{
// case of [RETURN] input
case VK_RETURN:
nShiftState = KeyStateDownFlag;
nChar2 = '\xD';
pWndData->pIMCallback->SendCharEvents(VK_RETURN, 0, 1,
&nShiftState, &nChar2);
nShiftState = KeyShiftNoCharacterFlag;
pWndData->pIMCallback->SendCharEvents(VK_RETURN, KeyStatePrevDownFlag,
1, &nShiftState, &nChar2);
break;
// case of [BACKSPACE] input
case VK_BACK:
nShiftState = KeyStateDownFlag;
nChar2 = VK_BACK;
pWndData->pIMCallback->SendCharEvents(VK_BACK, 0, 1,
&nShiftState, &nChar2);
nShiftState = KeyShiftNoCharacterFlag;
pWndData->pIMCallback->SendCharEvents(VK_BACK, KeyStatePrevDownFlag,
1, &nShiftState, &nChar2);
break;
// case of [ESCAPE] input
case VK_ESCAPE:
nShiftState = KeyStateDownFlag;
nChar2 = VK_ESCAPE;
pWndData->pIMCallback->SendCharEvents(VK_ESCAPE, 0, 1,
&nShiftState, &nChar2);
nShiftState = KeyShiftNoCharacterFlag;
pWndData->pIMCallback->SendCharEvents(VK_ESCAPE, KeyStatePrevDownFlag,
1, &nShiftState, &nChar2);
break;
// case of [SPACE] input
case VK_SPACE:
nShiftState = KeyStateDownFlag;
nChar2 = ' ';
pWndData->pIMCallback->SendCharEvents(VK_SPACE, 0, 1,
&nShiftState, &nChar2);
nShiftState = KeyShiftNoCharacterFlag;
pWndData->pIMCallback->SendCharEvents(VK_SPACE, KeyStatePrevDownFlag,
1, &nShiftState, &nChar2);
break;
// case of [CAPSLOCK] input
case VK_CAPITAL:
pWndData->bCapital = (pWndData->bCapital)?FALSE:TRUE;
InvalidateRect(hWnd, &rcAllChars, FALSE);
break;
// case of symbol '.' input
case '.':
default:
// case of character input
nChar2 = pWndData->bCapital? (BTNMAP[iRow][iCol].keyTCharCap)
: (BTNMAP[iRow][iCol].keyTChar);
pWndData->pIMCallback->SendCharEvents(nChar,
KeyStateDownFlag, 1, &nShiftFlags, &nChar2);
}
break;
}
// Decide how to repaint wnd. If there's only 1 btn changed, just
// invalidate that rect. Otherwise, invalidate entire wnd.
// if the key visited this time is not the one visited at last scan
if (!((iRow == iRowPrev) && (iCol == iColPrev)))
{
// redraw old button
SetRect (&rect, BTNMAP[iRowPrev][iColPrev].left,
BTNMAP[iRowPrev][iColPrev].top,
BTNMAP[iRowPrev][iColPrev].right,
BTNMAP[iRowPrev][iColPrev].bottom);
InvalidateRect (hWnd, &rect, FALSE);
// if at last scan [RETURN] is visited
if(iRowPrev == 2 && iColPrev == 10)
{
RECT rc;
rc.left = rect.left + WDTH_RTN_2/2-2;
rc.top = rect.top - HGHT - MRGN*2;
rc.bottom = rect.top;
rc.right = rect.right+1;
InvalidateRect (hWnd,&rc,FALSE);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -