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

📄 hikerwbui.cpp

📁 自己用Markov模型做的一个整句物笔输入法的原型
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		PostKey(wParam, lParam);

		gbTmpPy = FALSE;
		giLastKey = wParam;
	}
	else if (32 == wParam && bShiftDown)		//shift+space;
	{
		gbSBCSta = !gbSBCSta;
		staWnd->SetSbcSta(gbSBCSta);
		gbTmpPy = FALSE;
		giLastKey = wParam;
	}
	else if (190 == wParam && bCtrlDown)		//Control+.; note! c is different from wParam if it's a punctuation
	{
		gbChsPctSta = !gbChsPctSta;
		staWnd->SetChsPct(gbChsPctSta);
		giLastKey = wParam;
	}
	else if (13 == wParam && bCtrlDown)		//Control+space; 
	{
//		((CHikerWBStartDlg*)AfxGetMainWnd())->OnMenuStart();
//		giLastKey = wParam;
	}
	else if ((50 == wParam || 51 == wParam || 52 == wParam || 53 == wParam || 54 == wParam
		|| 55 == wParam || 187 == wParam || 189 == wParam) && bCtrlDown)//Control+2,3,4,5,6,7 and '+', new word
	{
		int loc = GetCurrLoc();
		CString csSent = CString(wordstr);
		CString csWord;

		int lenw = 4 + (wParam-50)*2;
		if (wParam <= 55)
		{
			csWord = csSent.Mid(loc-lenw, lenw);
			if (csWord.GetLength() < lenw)
				csWord = "";
			newWordWnd.m_bNew = TRUE;
		}
		else if (187 == wParam)
		{
			csWord = "";
			newWordWnd.m_bNew = TRUE;
		}
		else if (189 == wParam)
		{
			csWord = csSent.Mid(loc-wordstr[currpos], wordstr[currpos]);
			newWordWnd.m_bNew = FALSE;
		}

		if (csWord == "")
		{
			newWordWnd.m_csWord = "";
			newWordWnd.m_csCode = "";
		}
		else
		{
			CString csCode;
			UIGeneCode(csWord, csCode);
			newWordWnd.m_csWord = csWord;
			newWordWnd.m_csCode = csCode;
		}
		newWordWnd.UpdateData(FALSE);
		newWordWnd.ShowWindow(SW_HIDE);
		newWordWnd.ShowWindow(SW_SHOW);
	}
	else if (192 == wParam && !bShiftDown)		//temporary pinyin
	{
		if (giLastKey == 192)
			return TRUE;

		if (codelen > 0 && codelen < giMaxCodeLen && code[codelen-1] != 32 )		//code is not full, return
			return TRUE;

		currpos ++;
		memset(code, 0, sizeof(code));
		memset(wordlist, 0, sizeof(wordlist));
		giPageNo = 0;
		selwordnum = 0;
		gbTmpPy = TRUE;

		staWnd->SetCode((LPCSTR)code);
		staWnd->SetWord((LPCSTR)CString("临时拼音"));
		//staWnd.SetSent((LPCSTR)wordstr);
		if (!staWnd->IsWindowVisible())
			ShowFloatStaWnd();

		giLastKey = wParam;
	}
	else if (27 == wParam)		//escape key
	{
		if (27 != giLastKey)
		{
			if (codelen >= giMaxCodeLen || code[codelen-1] == 32)
			{
				//delete last input word
				DeleteCode(currpos);
				DeleteWord(currpos, TRUE);
//				currpos --;
//				GetCode(currpos, code);
			}
			currpos --;
			memset(code, 0, sizeof(code));
			giPageNo = 0;
			selwordnum = 0;
			gbTmpPy = 0;
			memset(wordlist, 0, sizeof(wordlist));
			staWnd->SetCode((LPCSTR)code);
			staWnd->SetWord((LPCSTR)CString("再次按下Esc键清除内容!"));
			staWnd->SetSent((LPCSTR)wordstr, wordslen, wordnum, currpos);
		}
		else
		{
			Clean();
		}
		giLastKey = wParam;
	}
	else //aplha in English state, or 0~9 digital number, or punctuation
	{
		CString csKeyName;

		if (gbTmpPy)
		{
			if (codelen > 0)
				return TRUE;
			else
			{
				gbTmpPy = TRUE;
				currpos --;
			}
		}

		//if is a special key, find its code
		if (isalpha(c) && 32 != c)			//alpha
		{
			if (isupper(c))
				c = wParam + 32;	//!!!note, captical alpha key and lower case alpah key have the same wParam, But 0~9 key and punctuation key have not!

			int keyid = GetKeyId(c);
			if (!gbChsSta && gbSBCSta)
				iSoftKeyboard = 11;

			if (bCapsLock && !bShiftDown || !bCapsLock && bShiftDown)//captical
			{
				if (0 == iSoftKeyboard)							//soft pc-keyboard
					csKeyName = gKeyArr[iSoftKeyboard*2][keyid*2];
				else
					csKeyName = CString(gKeyArr[iSoftKeyboard*2][keyid*2]) + 
								CString(gKeyArr[iSoftKeyboard*2][keyid*2+1]);
			}
			else												//lower letter
			{
				if (0 == iSoftKeyboard)							//soft pc-keyboard
					csKeyName = gKeyArr[iSoftKeyboard*2+1][keyid*2];
				else
					csKeyName = CString(gKeyArr[iSoftKeyboard*2+1][keyid*2]) + 
								CString(gKeyArr[iSoftKeyboard*2+1][keyid*2+1]);
			}
		}
		else if (48 <= c && c <= 57) //0~9 digital
		{
			int keyid = GetKeyId(c);
			if (gbSBCSta)
				iSoftKeyboard = 11;

			if (0 == iSoftKeyboard)							//soft pc-keyboard
				csKeyName = gKeyArr[iSoftKeyboard*2+1][keyid*2];
			else
				csKeyName = CString(gKeyArr[iSoftKeyboard*2+1][keyid*2]) + 
							CString(gKeyArr[iSoftKeyboard*2+1][keyid*2+1]);
		}
		else if ( ispunct(c))
		{
			int keyid = GetKeyId(c);
			if (gbChsPctSta)						//Chinses punctuation
			{
				if (c != 34)
					csKeyName = GetChsPunc(c);
				else
				{
					if (gbFirstQuota)
					{
						csKeyName = "“";
						gbFirstQuota = FALSE;
					}
					else
					{
						csKeyName = "”";
						gbFirstQuota = TRUE;
					}
				}
			}
			else		//English punctuation state
			{
				//csKeyName = CString(c);
				if (gbSBCSta)
				{
					iSoftKeyboard = 11;
				}

				int iKbOffset = 1;
				if (IsShPct(c))
					iKbOffset = 0;

//				if (0 == iSoftKeyboard)							//soft pc-keyboard
//					csKeyName = gKeyArr[iSoftKeyboard*2][keyid*2];
//				else
					csKeyName = CString(gKeyArr[iSoftKeyboard*2+iKbOffset][keyid*2]) + 
								CString(gKeyArr[iSoftKeyboard*2+iKbOffset][keyid*2+1]);
			}
		}
		else if ( 32 == c )
		{
			int keyid = GetKeyId(c);		
			if (gbSBCSta)						//SBC space
				csKeyName = CString(" ");
			else
				csKeyName = CString(c);
		}
	
		//output 
		if (cslen > 0 || codelen > 0
			|| (cslen == 0) && csKeyName.GetLength() >= 2 && !ispunct(c)
			|| (cslen == 0) && csKeyName == "“")		//from hard keyboard or soft pc-keyboard
		{
			if (gbFloatStaWnd && !staWnd->IsWindowVisible())		//show floating state window
			{
				ShowFloatStaWnd();
			}

			if (csKeyName != "")
			{
				if (codelen > 0 )
				{
					if (codelen < giMaxCodeLen && code[codelen-1] != 32)		//current code is not full
					{
						code[strlen((char*)code)] = 32;
						InsertCode(code, currpos);
					}
				}

				memset(code, 0, sizeof(code));
				FindKeyCode(csKeyName, code);
				staWnd->SetCode((LPCSTR)code);

				memset(wordlist, 0, sizeof(wordlist));
				selwordnum = 1;
				giPageNo = 0;
				staWnd->SetWord((LPCSTR)csKeyName);

				currpos++;
				InsertCode(code, currpos);
				strcpy((char*)lastwordstr, (char*)wordstr);
				memset(wordstr, 0, sizeof(wordstr));
				if (!Translate(codestr, wordstr, codenum, wordnum,	codeslen, wordslen))
					strcpy((char*)wordstr, (char*)lastwordstr);

				if (codenum > 0)
				{
					CorrSent();
					staWnd->SetSent((LPCSTR)wordstr, wordslen, wordnum, currpos);
				}
			}
		}
		else
		{
			if (csKeyName != "")
				PostChar(csKeyName);
//			else if (c != 0)		//for notepad on win2k
//				PostChar(c);
			else
				//PostKey(wParam, lParam);
				return FALSE;

			staWnd->SetWord("");		//usually the word is empty when cslen=0, but some time 
		}							//the word may be used for show some prompt information

		giLastKey = wParam;
	}

	return TRUE;
}

void UISetFocusWnd(HWND hWnd)
{
	ghFocusWnd = hWnd;
}

void UISetChsState(BOOL bState)
{
	gbChsSta = bState;
}

void UISetSbcState(BOOL bState)
{
	gbSBCSta = bState;
}

void UISetChsPctState(BOOL bState)
{
	gbChsPctSta = bState;
}

void UISetCurrPos(int pos)
{
	currpos = pos;
	
	lastpos = -1;
	GetCode(currpos, code);
	//get the code's corresponding words
	memset(wordlist, 0, sizeof(wordlist));
	GetWords(code, codestr, currpos, wordlist, selwordnum);	
	giPageNo = 0;
	CString csWords = TransWords(giPageNo);

	CHikerWBStateWnd* staWnd;
	staWnd = (CHikerWBStateWnd*)CWnd::FromHandle(GetStaWndHandle());

	staWnd->SetCode((LPCSTR)code);
	staWnd->SetWord((LPCSTR)csWords, giPageNo, selwordnum);
	staWnd->SetSent((LPCSTR)wordstr, wordslen, wordnum, currpos);
}

void UINewWord(CString csCode, CString csWord)
{
	NewWord((unsigned char*)(LPCSTR)csCode, (unsigned char*)(LPCSTR)csWord);
}

void UIDeleteWord(CString csCode, CString csWord)
{
	DeleteWord((unsigned char*)(LPCSTR)csCode, (unsigned char*)(LPCSTR)csWord);

	memset(wordstr, 0, sizeof(wordstr));
	Translate(codestr, wordstr, codenum, wordnum, codeslen, wordslen);

	//get select words again(by post)
	memset(wordlist, 0, sizeof(wordlist));
	GetWords(code, codestr, currpos, wordlist, selwordnum);
	giPageNo = 0;
	CString csWords = TransWords(giPageNo);
	//show select words

	CHikerWBStateWnd* staWnd;
	staWnd = (CHikerWBStateWnd*)CWnd::FromHandle(GetStaWndHandle());
	staWnd->SetWord((LPCSTR)csWords, giPageNo, selwordnum);

	//display translated word stream
	CorrSent();
	if (codenum > 0)
		staWnd->SetSent((LPCSTR)wordstr, wordslen, wordnum, currpos);
}

BOOL UIGeneCode(CString csWord, CString& csCode)
{
	CString code;
	GeneCode((unsigned char*)(LPCSTR)csWord, (unsigned char*)code.GetBuffer(CODELEN));
	code.ReleaseBuffer();
	csCode = code;

	return TRUE;
}

HKWB_API HWND UICreateSubWnd()
{
	//create makeword window
	//newWordWnd.Create(IDD_DIALOG_MAKEWORD, NULL);
	
	LPCTSTR cname = AfxRegisterWndClass(0);
	//staWnd.Create(cname, "HikerWB", |WS_BORDER|WS_VISIBLE, rect, CWnd::FromHandle(hWnd), 0);
	gStaWnd.CreateEx(WS_EX_LEFT|WS_EX_WINDOWEDGE|WS_EX_TOOLWINDOW/*|WS_EX_TRANSPARENT*/, cname, "HikerWB", 
			WS_VISIBLE|WS_POPUP|WS_CLIPSIBLINGS, 
			0, 0, 0, 0, 0, 0, 0);
			//note!, hWnd isn't specified as parent, for display the float state window at correct position.
//	SetWindowPos(staWnd.GetSafeHwnd(), HWND_TOPMOST, rect.left, rect.top, rect.Width(), rect.Height(), SWP_HIDEWINDOW);

	gStaWnd.SetChsSta(gbChsSta);
	gStaWnd.SetSbcSta(gbSBCSta);
	gStaWnd.SetChsPct(gbChsPctSta);

    hFile = CreateFileMapping((HANDLE)0xFFFFFFFF, 0, PAGE_READWRITE, 0, sizeof(HANDLE)*4, "Hook");
    pMem = (HANDLE*)MapViewOfFile(hFile, FILE_MAP_WRITE, 0, 0, sizeof(HANDLE)*4);
    (*pMem) = gStaWnd.GetSafeHwnd();

	return gStaWnd.GetSafeHwnd();
}

HKWB_API BOOL UIDestroySubWnd(HWND hStaWnd)
{
	DestroyWindow(hStaWnd);

	UnmapViewOfFile(pMem);
	CloseHandle(hFile);

	return TRUE;
}

HKWB_API BOOL UIInitHook()
{
	InitHook();
//	UISetOutputStyle(1);
//	UISetOutputCharset(0);
	Clean();

	return TRUE;
}

HKWB_API BOOL UIEndHook()
{
	EndHook();

	return TRUE;
}

HKWB_API BOOL UIHookOn()
{
	CHikerWBStateWnd* staWnd;
	staWnd = (CHikerWBStateWnd*)CWnd::FromHandle(GetStaWndHandle());

	if (!gbFloatStaWnd)
		staWnd->ShowWindow(SW_SHOW);
	gbOpenSta = TRUE;

	return HookOn();
}

HKWB_API BOOL UIHookOff()
{
	//staWnd.ShowWindow(SW_HIDE);
	if (strlen((char*)wordstr) > 0)
		PostSent();
	Clean();
	gbOpenSta = FALSE;

	CHikerWBStateWnd* staWnd;
	staWnd = (CHikerWBStateWnd*)CWnd::FromHandle(GetStaWndHandle());

	staWnd->ShowWindow(SW_HIDE);

	return HookOff();
}

//05.11.10
HKWB_API BOOL UIShowSoftKeyboard(BOOL bShow, int iKeyboardId)
{
	return ShowSoftKeyboard(bShow, iKeyboardId);
}

HKWB_API BOOL UITrainFromFile()
{
	char bigBuff[2048] = "";  

	CFileDialog dlg(TRUE, "txt", NULL, OFN_ALLOWMULTISELECT|OFN_EXPLORER, 
						"Text Files (*.txt)|*.txt||", NULL);
	dlg.m_ofn.lpstrTitle = "打开学习文章";
	dlg.m_ofn.lpstrFile = bigBuff;
	dlg.m_ofn.nMaxFile = sizeof(bigBuff);
	if (dlg.DoModal() == IDCANCEL)
		return FALSE;
	
	CString csFileName;
	for (POSITION pos = dlg.GetStartPosition(); pos; )
	{
		csFileName = dlg.GetNextPathName(pos);
		TrainFromFile((LPCSTR)csFileName);
	}

	return TRUE;
}

HKWB_API int UIGetOutputStyle()
{
	return ((giMaxCodeLen == 4)?0:1);
}

HKWB_API int UIGetOutputCharset()
{
	return giCharset;
}

HKWB_API int UIGetFloatWndStyle()
{
	return ((gbFloatStaWnd)?1:0);
}

HKWB_API void UISetOutputStyle(int iStyle)
{
	PostSent();
	Clean();

	giMaxCodeLen = ((iStyle == 0)?4:2);
	SetStyle(iStyle);
}

HKWB_API void UISetOutputCharset(int iCharset)
{
	giCharset = iCharset;
	SetCharset(iCharset);
}

HKWB_API void UISetFloatWndStyle(int iStyle)
{
	CHikerWBStateWnd* staWnd;
	staWnd = (CHikerWBStateWnd*)CWnd::FromHandle(GetStaWndHandle());

	gbFloatStaWnd = ((iStyle == 1)?TRUE:FALSE);
	staWnd->SetFloat(gbFloatStaWnd);

	if (!gbOpenSta)
		return;

	if (!gbFloatStaWnd)
	{
		staWnd->ShowFix();
	}
	else
	{
		if (strlen((char*)codestr)>0 || strlen((char*)code)>0)
		{
			ShowFloatStaWnd();
		}
		else
		{
			staWnd->ShowWindow(SW_HIDE);
		}
	}
}

⌨️ 快捷键说明

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