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