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

📄 msghandler.cpp

📁 WinCE4.0的COM组件.工业控制专用软键盘
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -