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

📄 keyboarddlg.cpp

📁 wince下的触摸键盘(6×8)源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// keyboardDlg.cpp : implementation file
//

#include "stdafx.h"
#include "keyboard.h"
#include "keyboardDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define HIGHLIGHTTEXTCOLOR  RGB(255,200,0)
/////////////////////////////////////////////////////////////////////////////
// CKeyboardDlg dialog

CKeyboardDlg::CKeyboardDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CKeyboardDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CKeyboardDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CKeyboardDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CKeyboardDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CKeyboardDlg, CDialog)
	//{{AFX_MSG_MAP(CKeyboardDlg)
	ON_WM_PAINT()
	ON_WM_CLOSE()
	ON_WM_DESTROY()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_VKEYTOITEM()
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CKeyboardDlg message handlers

BOOL CKeyboardDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen

	LOGFONT temp;
	memset(&temp, 0, sizeof(LOGFONT));       // zero out structure
	temp.lfHeight = 12;                      // request a 12-pixel-height font
	temp.lfWeight = 800;
	strcpy((char *)temp.lfFaceName, "Arial");        // request a face name "Arial"
	VERIFY(m_TextFont.CreateFontIndirect(&temp));  // create the font
    
	FillBkBrushColor();

	gFocus = NULL;

	AddKey(0x00,0x00,0); //signal row change
	AddKey('g','G',60);
	AddKey('m','M',60);
	AddKey('f','F',60);
	AddKey('d','D',60);
	AddKey('h','H',60);
	AddKey('r','R',-60);

	//first row
	AddKey(0x00,0x00,1); //signal row change
	AddKey('x','X',60);
	AddKey('y','Y',60);
	AddKey('z','Z',60);
	AddKey('i','I',60);
	AddKey('j','J',60);
	AddKey('k','K',-60);

	//second row
	AddKey(0x00,0x00,2); //signal row change
	AddKey('u','U',60);
	AddKey('v','V',60);
	AddKey('w','W',60);
	AddKey('s','S',60);
	AddKey('t','T',60);
	AddKey('n','N',-60);

	//third row
	AddKey(0x00,0x00,3); //signal row change
	AddKey('a','A',60);
	AddKey('b','B',60);
	AddKey('c','C',60);
	AddKey('e','E',60);
	AddKey('l','L',60);
	AddKey('o','O',-60);

	//fourth row
	AddKey(0x00,0x00,4); //signal row change
	AddKey('7','&',60);
	AddKey('8','*',60);
	AddKey('9','(',60);
	AddKey('/','?',60);
	AddKey('p','P',60);
	AddKey('q','Q',-60);
	
	//fifth row
	AddKey(0x00,0x00,5); //signal row change
	AddKey('4','$',60);
	AddKey('5','%',60);
	AddKey('6','^',60);
	AddKey('\\','\"',60);
	AddKey(0x00,DEL,60);
	AddKey(0x00,BSPACE,-74); //backspace

	//sixth row
	AddKey(0x00,0x00,6);//
	AddKey('1','!',55);
	AddKey('2','@',55);
	AddKey('3','#',55);
	AddKey('=','+',55);
	AddKey(0x00,CAPSLOCK,68); //caps lock
	AddKey(0x00,SHIFT,-68); //shift
	//seventh row
	AddKey(0x00, 0x00, 7); //
	AddKey('0',')',60);
	AddKey('.','>',60);
	AddKey('-','_',60);
	AddKey(0x00, SPACE, 86); 
	//AddKey(' ',' ',86);
	AddKey(0x00,ENTER,-66); //enter

	CalcWidthHeight();  //计算窗口中按键大小
	CalKeyRect();  //保存每一个按键的位置

	SetWindowPos(&wndTopMost, 0, 0, 0, 0,  //把窗口放到最顶端
	SWP_NOSIZE | SWP_NOMOVE);


	::SetProp(m_hWnd, AfxGetApp()->m_pszExeName, (HANDLE)1);
	return TRUE;  // return TRUE  unless you set the focus to a control
}

//********************************************************
// 函数功能 :当窗口切换的时候,保存当前键盘输入焦点窗口句柄
// 入口参数 :
//
// 返回参数 :
//
// 创建日期 :
// 作者
//********************************************************
BOOL CKeyboardDlg::PreTranslateMessage(MSG* pMsg)
{
	HWND wnd = ::GetForegroundWindow();
	if(IsWindow(wnd))
	{
		if(wnd != this->m_hWnd)
		{
			if(gFocus != wnd)
			{
				/*if(IsWindow(gFocus))
				{
					AttachThreadInput(
						GetCurrentThreadId(),
						GetWindowThreadProcessId(gFocus,NULL),
						FALSE);
				}*/

				gFocus = wnd;
				/*AttachThreadInput(
					GetCurrentThreadId(),
					GetWindowThreadProcessId(gFocus,NULL),
					TRUE);*/
			}
		}
	}
	return CDialog::PreTranslateMessage(pMsg);
}


void CKeyboardDlg::ReleaseFocus()
{
	if(IsWindow(gFocus))
	{
		HWND wnd = ::GetForegroundWindow();
		if(IsWindow(wnd))
		{
			if(wnd == gFocus)
			{
				return;
			}
		}
		::SetForegroundWindow(gFocus);
	}
}

void CKeyboardDlg::AddKey(char pNormal, char pShifted, int pWidth)
{
	KEYDEF * key = new KEYDEF;
	key->cNormal = pNormal;
	key->cShifted = pShifted;
	key->cWidth = pWidth;
	key->bHighlight=false;
	cKeys.AddTail(key);
}

void CKeyboardDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	CDialog::OnSysCommand(nID, lParam);
}

void CKeyboardDlg::CalcWidthHeight()
{
	pKeyWidth = 0;
	pKeyHeight = 0;
	KEYDEF * key;
	POSITION pos = cKeys.GetHeadPosition();
	long totalWidth = 0;
	long longest = 0;
	long rows = 0;
	while(pos)
	{
		key = cKeys.GetNext(pos);
		if((key->cNormal == 0x00) && (key->cShifted == 0x00))
		{
			rows++;
			if(totalWidth > longest)
			{
				longest = totalWidth;
			}
			totalWidth = 0;
		}
		else
		{
			totalWidth += abs(key->cWidth);
		}
	}
	CRect rect;
	GetClientRect(rect);
	pKeyHeight = rect.Height() / rows;
	pKeyWidth = (int)(((double)rect.Width()) / ((((double)(longest)) / 12)));
}

void CKeyboardDlg::DrawKey(CDC *dc, KEYDEF *key)
{
	CString label = " ";
	BOOL special = FALSE;
	CRect rc = key->rect;

	if(key->cNormal==0x00 && key->cShifted==0x00)
		return ;

	COLORREF OldColor = dc->GetTextColor() ;
	CPen Pen, TextPen;
	CPen *pOldPen = NULL ;
	if(!key->bHighlight)  //没有高亮显示
	{
		rc.DeflateRect(1,1);
		DoGradientFill(dc,&rc);
//		dc->FillSolidRect(rc,GetSysColor(COLOR_3DFACE));
		dc->Draw3dRect(rc,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DDKSHADOW));
		rc.DeflateRect(1,1);
		dc->Draw3dRect(rc,GetSysColor(COLOR_3DLIGHT),GetSysColor(COLOR_3DSHADOW));
	}
	else
	{
		rc.DeflateRect(1,1);
		dc->FillSolidRect(rc,RGB(0x20,0xff,0x99));  //鼠标在上面的时候填充颜色
		dc->Draw3dRect(rc,GetSysColor(COLOR_3DLIGHT),GetSysColor(COLOR_3DSHADOW));
		rc.DeflateRect(1,1);
		dc->Draw3dRect(rc,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DDKSHADOW));
		dc->SetTextColor(HIGHLIGHTTEXTCOLOR) ;
		Pen.CreatePen(PS_SOLID,1,HIGHLIGHTTEXTCOLOR) ;
		pOldPen = dc->SelectObject(&Pen) ;
	}

	rc.DeflateRect(3,1);

	CFont *pOldFont=dc->SelectObject(&m_TextFont);		//按键的字体颜色和大小
	dc->SetTextColor(RGB(0x88,0x22,0x11));
	
	if(key->cNormal == 0x00)
	{

			switch(key->cShifted)
			{
			
			case CAPSLOCK:    // 0x03
				label = "Caps";
				break;
			case SHIFT:    // 0x04
				label = "Shift";
				break;
			
			case BSPACE:    // 0x06
				label = "Bspc";
				break;
			case ENTER:    // 0x07
				label = "Enter";
				break;
						
			case DEL: //0x14
				label = "Del";
				break;
			case SPACE:    //0x15
				label = "Space";
				break;
			default:
				ASSERT(FALSE);
				label = "#ERR#";
				break;
			}
		
		if(!special)
		{
			CSize tsize;
			tsize = dc->GetTextExtent(label);
			dc->ExtTextOut(
				((rc.left + rc.right)/2) - (tsize.cx/2), 
				((rc.top + rc.bottom)/2) - (tsize.cy/2), 
				ETO_OPAQUE,
				NULL,
				label,
				NULL);
		}
	}
	else
	{
		if((key->cShifted >= 'A') && (key->cShifted <= 'Z'))
		{
			CSize tsize;
			label.Format(_T("%c"),key->cShifted);
			tsize = dc->GetTextExtent(label);
			dc->ExtTextOut(
				((rc.left + rc.right)/2) - (tsize.cx/2), 
				((rc.top + rc.bottom)/2) - (tsize.cy/2), 
				ETO_OPAQUE,
				NULL,
				label,
				NULL);
		}
		else
		{
			CSize tsize;
			tsize = dc->GetTextExtent("M");
			label.Format(_T("%c"),key->cShifted);
			dc->ExtTextOut(rc.left, rc.top, ETO_OPAQUE,
				NULL,label,NULL);
			label.Format(_T("%c"),key->cNormal);
			dc->ExtTextOut(
				rc.right - tsize.cx, 
				rc.bottom - tsize.cy,
				ETO_OPAQUE,
				NULL,
				label,
				NULL);
		}
	}
	dc->SetTextColor(OldColor);
	dc->SelectObject(pOldFont);
	if(pOldPen)
		dc->SelectObject(pOldPen) ;
}

//********************************************************
// 函数功能 :把按键发内容送到指定窗口中去
// 入口参数 :
//
// 返回参数 :
//
// 创建日期 :
// 作者     :丁继泉
//********************************************************
void CKeyboardDlg::SendKey(KEYDEF *keydef)
{
	if(keydef->cNormal == 0x00)
	{
		int vk;
		BOOL uptoo = TRUE;
		if(keydef->cShifted > 0x6F) //is a function key
		{
			vk = keydef->cShifted;
		}
		else
		{
			switch(keydef->cShifted)  //判断功能键的类型
			{
			
			case CAPSLOCK:    // 0x03
				vk = VK_CAPITAL;
				break;
			case SHIFT:    // 0x04
				vk = VK_SHIFT;
				if(GetKeyState(vk) & 0xF000) //shift 已经按下
				{
					vk = VK_CONTROL;
					if(GetKeyState(vk) & 0xF000) //ctrl 也按下
					{
						vk = VK_SHIFT;
						keybd_event(vk,0,0,0);
					}
					vk = VK_SHIFT;
					keybd_event(vk,0,KEYEVENTF_KEYUP,0);
					return;
				}
				uptoo = FALSE;   //保存shift状态
				break;
			case CTRL:    // 0x05
				vk = VK_CONTROL;
				if(GetKeyState(vk) & 0xF000)   //ctrl已经按下
				{
					vk = VK_SHIFT;
					if(GetKeyState(vk) & 0xF000) //shift 也按下
					{
						vk = VK_CONTROL;
						keybd_event(vk,0,0,0);
					}
					vk = VK_CONTROL;
					keybd_event(vk,0,KEYEVENTF_KEYUP,0);
					return;
				}
				uptoo = FALSE;   //保存ctrl状态
				break;
			case BSPACE:    // 0x06
				vk = VK_BACK;
				break;
			case ENTER:    // 0x07
				vk = VK_RETURN & 0xFF;
				break;
			case DEL: //0x14
				vk = VK_DELETE;
				break;
			case SPACE: //0x15
				vk = VK_SPACE;
				break;
			default:
				ASSERT(FALSE);
				break;
			}
		}
		keybd_event(vk,0,0,0);
		if(uptoo)
		{
			keybd_event(vk,0,KEYEVENTF_KEYUP,0);
		}
	}
	else
	{

⌨️ 快捷键说明

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