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

📄 msghandler.cpp

📁 WinCE4.0的COM组件.工业控制专用软键盘
💻 CPP
📖 第 1 页 / 共 2 页
字号:

		// redraw new button
	    SetRect (&rect, BTNMAP[iRow][iCol].left, BTNMAP[iRow][iCol].top,
				BTNMAP[iRow][iCol].right, BTNMAP[iRow][iCol].bottom);
		InvalidateRect (hWnd, &rect, FALSE);
		// if this time [RETURN] is visited
		if(iRow == 2 && iCol == 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);
		}
	}

	// if the key visited is the same as the one at last scan
	if((iRow == iRowPrev) && (iCol == iColPrev) &&
		(bPressed != pWndData->bPressed))
	{
	    SetRect (&rect, BTNMAP[iRow][iCol].left, BTNMAP[iRow][iCol].top,
				BTNMAP[iRow][iCol].right, BTNMAP[iRow][iCol].bottom);
		InvalidateRect (hWnd, &rect, FALSE);
		//if [RETURN] is visited
		if(iRow == 2 && iCol == 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);
		}
	}

    pWndData->bPressed = bPressed;
	pWndData->iRowPrev = iRow;
	pWndData->iColPrev = iCol;
    return 0;
}

LRESULT CALLBACK OnSetSip (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) 
{
    LPSIPWNDSTRUCT pWndData;
    RECT rect;
    pWndData = (LPSIPWNDSTRUCT)GetWindowLong (hWnd, GWL_USERDATA);
    switch (wParam) 
	{
    // Called when RegisterCallback method called
    case MSGCODE_REGCALLBACK:
        pWndData->pIMCallback = (IIMCallback *)lParam;
        break;
    // Called when GetInfo method called
    case MSGCODE_GETINFO:
        pWndData->imi = *(IMINFO *)lParam;
        break;
    // Called when ReceiveSipInfo method called
    case MSGCODE_SETINFO:
        GetClientRect (GetParent(hWnd), &rect);
        MoveWindow (hWnd, 0, 0, rect.right - rect.left,
                    rect.bottom - rect.top, TRUE);
        break;
    // Called when RegisterCallback2 method called
    case MSGCODE_REGCALLBACK2:
        pWndData->pIMCallback2 = (IIMCallback2 *)lParam;
        break;
    }
    return 0;
}



//////////////////////////////////////////////////////////////////////////////
//																			//
//			*** Paint the whole keyboard ***								//
//																			//
//////////////////////////////////////////////////////////////////////////////

LRESULT CALLBACK OnPaint (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) 
{
    HDC				hdc;
    HBRUSH			hPrsBrush, hUPrsBrush;
	HPEN			hPrsPen, hUPrsPen;
    PAINTSTRUCT		ps;
    RECT			rect;
    LPSIPWNDSTRUCT	pWndData;
	int				iCol;

	hUPrsBrush		= CreateSolidBrush(UNPRESSEDBKG);
	hPrsBrush		= CreateSolidBrush(PRESSEDBKG);
	hUPrsPen		= CreatePen(PS_SOLID, 2, UNPRESSEDFONT);
	hPrsPen			= CreatePen(PS_SOLID, 2, PRESSEDFONT);

    pWndData = (LPSIPWNDSTRUCT)GetWindowLong (hWnd, GWL_USERDATA);
    hdc = BeginPaint (hWnd, &ps);
    GetClientRect (hWnd, &rect);
	
    HBRUSH	hOldBrush  = (HBRUSH)SelectObject (hdc, hUPrsBrush);
    Rectangle (hdc, rect.left, rect.top, rect.left, rect.bottom);
    SelectObject (hdc, hOldBrush);
   
	for (int i = 0; i < ROW_OF_BTNS; i++) 
	{
		switch(i)
		{
		case 0:
			iCol = 12;break;
		case 1:
			iCol = 10;break;
		case 2:
			iCol = 11;break;
		case 3:
			iCol = 9;break;
		}
		
        for (int j = 0; j < iCol; j++) 
		{
            DrawButton (hdc, hPrsPen, hPrsBrush, hUPrsPen,
				hUPrsBrush,BTNMAP[i][j],
                (pWndData->bPressed && pWndData->iColPrev == j 
				&& pWndData->iRowPrev == i),
				pWndData->bCapital);
        }
    }
    EndPaint (hWnd, &ps);
    return 0;
}



//////////////////////////////////////////////////////////////////////////////
//																			//
//			*** Create all data and windows	***								//
//																			//
//////////////////////////////////////////////////////////////////////////////

LRESULT CALLBACK OnCreate (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) 
{
    LPSIPWNDSTRUCT pWndData;
	
    // Allocate a data structure for the sip keyboard window.    
    pWndData = (LPSIPWNDSTRUCT)LocalAlloc (LPTR, sizeof (SIPWNDSTRUCT));
    if (!pWndData) 
	{
        DestroyWindow (hWnd);
        return 0;
    }
    memset (pWndData, 0, sizeof (SIPWNDSTRUCT));
    GetWindowRect (GetParent (hWnd), &pWndData->rectDocked);
    pWndData->rectLast.left = -1;
	pWndData->bPressed		= FALSE;
	pWndData->bCapital		= FALSE;
	pWndData->iColPrev		= -1;
	pWndData->iRowPrev		= -1;
    SetWindowLong (hWnd, GWL_USERDATA, (INT)pWndData);
    return 0;
}



//////////////////////////////////////////////////////////////////////////////
//																			//
//			*** Draw the specified button on keyboard ***					//
//																			//
//		1. pointArrow[3]:													//
//			  The region of the Arrow on [BACKSPACE] and [RETURN].			//
//		2. pointEdge1[5]:													//
//			  The region of the left edge of each button.					//
//		3. pointEdge2[7]:													//
//			  The region of the right edge of each button.					//
//		4. Processes of drawing char key and each symbol key are different.	//
//																			//
//////////////////////////////////////////////////////////////////////////////

INT DrawButton (HDC hdc, HPEN hPrsPen, HBRUSH hPrsBrush, 
				HPEN hUPrsPen, HBRUSH hUPrsBrush, 
				KEYBUTTON& btn, BOOL fPressed, BOOL fCapital) 
{
	RECT rectBtn = {btn.left, btn.top, btn.right, btn.bottom};
	LPTSTR  pChar = fCapital? &(btn.keyTCharCap) : &(btn.keyTChar);
	UINT	iVChar= fCapital? (btn.keyVCharCap) : (btn.keyVChar);

	// rect region in which the text of symbol keys are shown
	RECT rcSymbol = {rectBtn.left+4, rectBtn.top,  rectBtn.right-4, rectBtn.bottom-6};
	// rect region in which the text of character keys are shown
	RECT rcText	  = {rectBtn.left+8, rectBtn.top+2,rectBtn.right  , rectBtn.bottom};

	TCHAR* lpChar;
	int width	=	rectBtn.right - rectBtn.left;
	int height	=	rectBtn.bottom- rectBtn.top;
	POINT pointArrow[3] =
		{
			{rcSymbol.left + width/4,	  (rcSymbol.top+rcSymbol.bottom)/2	},
			{rcSymbol.left + width/4 + 6, (rcSymbol.top+rcSymbol.bottom)/2-3},
			{rcSymbol.left + width/4 + 6, (rcSymbol.top+rcSymbol.bottom)/2+3},
		};
	
	HPEN	hOldPen;
	HBRUSH  hOldBrush;

	// Calculate the edges
	POINT pointEdge1[5] =
		{
			{rectBtn.left,		rectBtn.top		},
			{rectBtn.left  + 2,	rectBtn.top		},
			{rectBtn.left  + 2,	rectBtn.top + 15 },
			{rectBtn.left  + 4,	rectBtn.top + 27	},
			{rectBtn.left,		rectBtn.bottom	},
		};

	POINT pointEdge2[7] =
		{
			{rectBtn.right,		rectBtn.top		},
			{rectBtn.right,		rectBtn.bottom	},
			{rectBtn.left,		rectBtn.bottom	},
			{rectBtn.left  + 4,	rectBtn.top + 27	},
			{rectBtn.right - 4,	rectBtn.top + 27	},
			{rectBtn.right - 2,	rectBtn.top + 15	},
			{rectBtn.right - 2,	rectBtn.top		},
		};

    
	SelectObject (hdc, GetStockObject (BLACK_PEN));    

	// Draw the Frame
	if (!fPressed) 
	{
        hOldBrush	= (HBRUSH)SelectObject (hdc, hUPrsBrush);
        SetBkColor (hdc, UNPRESSEDBKG);
        SetTextColor (hdc, UNPRESSEDFONT);
		
	} 
	else 
	{
        hOldBrush	= (HBRUSH)SelectObject (hdc, hPrsBrush);
        SetBkColor (hdc, PRESSEDBKG);
        SetTextColor (hdc, PRESSEDFONT);
    }


	Rectangle(hdc, rectBtn.left, rectBtn.top, rectBtn.right, rectBtn.bottom);

    
	// Draw the Edges
	HPEN hTmpPen = CreatePen(PS_SOLID, 1, EDGE1);
	hOldPen = (HPEN)SelectObject(hdc, hTmpPen);
	SelectObject(hdc, GetStockObject(LTGRAY_BRUSH));
	Polygon(hdc, pointEdge1, 5);
	
	hTmpPen = CreatePen(PS_SOLID, 1, EDGE2);
	hOldPen = (HPEN)SelectObject(hdc, hTmpPen);
	SelectObject(hdc, GetStockObject(GRAY_BRUSH));
	Polygon(hdc, pointEdge2, 7);

	// Draw the Characters or Symbols

	switch (iVChar)
	{
	case VK_RETURN:
		//finish the upper part of [RETURN] button
		{
			// invalidate rect
			SelectObject(hdc, fPressed?hPrsBrush:hUPrsBrush);
			Rectangle(hdc, rectBtn.left+WDTH_RTN_2/2, rectBtn.top-MRGN-HGHT,
				rectBtn.right, rectBtn.top);

			// bottom line
			HPEN hPrsPenRedraw = CreatePen(PS_SOLID,2, 
				fPressed?PRESSEDBKG:PRESSEDFONT);
			SelectObject(hdc,hPrsPenRedraw);
			MoveToEx(hdc,rectBtn.left+WDTH_RTN_2/2+2, rectBtn.top,NULL);
			LineTo(hdc,rectBtn.right-2, rectBtn.top);

			// upper line
			SelectObject(hdc,GetStockObject(BLACK_PEN));
			MoveToEx(hdc,rectBtn.left+WDTH_RTN_2/2+2, rectBtn.top-MRGN-HGHT,NULL);
			LineTo(hdc,rectBtn.right-2, rectBtn.top-MRGN-HGHT);

			// left edge
			HPEN hPenEdge1 = CreatePen(PS_SOLID, 2, EDGE1);
			SelectObject(hdc, hPenEdge1);
			MoveToEx(hdc, rectBtn.left+WDTH_RTN_2/2+2, rectBtn.top-MRGN-HGHT,NULL);
			LineTo(hdc, rectBtn.left+WDTH_RTN_2/2+2, rectBtn.top);

			// right edge
			HPEN hPenEdge2 = CreatePen(PS_SOLID, 3, EDGE2);
			SelectObject(hdc,hPenEdge2);
			MoveToEx(hdc, rectBtn.right-1, rectBtn.top-MRGN-HGHT,NULL);
			LineTo(hdc,rectBtn.right-1, rectBtn.top);
		}
		if (!fPressed) 
		{
			SelectObject (hdc, hUPrsPen);
			SelectObject(hdc,GetStockObject(BLACK_BRUSH));
		}
		else 
		{
			SelectObject (hdc, hPrsPen);
			SelectObject(hdc,GetStockObject(WHITE_BRUSH));
		}
		MoveToEx(hdc, rcSymbol.left + width/4 ,
			(rcSymbol.bottom+rcSymbol.top)/2,NULL);
		LineTo(hdc, rcSymbol.left + width*2/3,
			(rcSymbol.bottom+rcSymbol.top)/2);
		LineTo(hdc, rcSymbol.left + width*2/3,
			(rcSymbol.bottom+rcSymbol.top)/2+1);
		LineTo(hdc, rcSymbol.left + width*2/3,
			btn.top-HGHT/4);

		SelectObject(hdc, GetStockObject(fPressed?WHITE_PEN:BLACK_PEN));
		Polygon(hdc, pointArrow, 3);


		break;

	case VK_BACK:
		if (!fPressed) 
		{
			SelectObject (hdc, hUPrsPen);
			SelectObject(hdc,GetStockObject(BLACK_BRUSH));
		}
		else 
		{
			SelectObject (hdc, hPrsPen);
			SelectObject(hdc,GetStockObject(WHITE_BRUSH));
		}
		MoveToEx(hdc, rcSymbol.left + width*3/4 ,
			(rcSymbol.bottom+rcSymbol.top)/2,NULL);
		LineTo(hdc, rcSymbol.left + width/4,
			(rcSymbol.bottom+rcSymbol.top)/2);
		SelectObject(hdc, GetStockObject(fPressed?WHITE_PEN:BLACK_PEN));
		Polygon(hdc, pointArrow, 3);
		break;

	case VK_SPACE:
		break;

	case VK_ESCAPE:
		lpChar = _T("Esc");
		DrawText (hdc, lpChar, 3, &rcSymbol,
			DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOCLIP );
		break;

	case VK_CAPITAL:
		lpChar = _T("Capslock");
		DrawText (hdc, lpChar, 8, &rcSymbol,
			DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOCLIP );
		break;

	default: //Number, Letter & Dot
		if(*pChar == '.' || (*pChar >= '1' && *pChar <= '0'))
		{
			DrawText(hdc, pChar, 1, &rcSymbol, DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_NOCLIP);
		}
		else
			DrawText (hdc, pChar, 1, &rcText, DT_LEFT|DT_TOP|DT_SINGLELINE|DT_NOCLIP );
	}

	SelectObject(hdc, hOldBrush);
	SelectObject(hdc, hOldPen);
	
    return 0;
}



⌨️ 快捷键说明

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